Le 14/02/2013 01:44, Adrien Cheype a écrit :
Bonjour,
Éternel débat : stockage des fichiers dans la base ou le système de fichier ? http://wiki.postgresql.org/wiki/BinaryFilesInDB
Si vous préférez stocker les fichiers dans la base, je n'y vois pas d'inconvénient. J'ai personnellement toujours enregistré les fichiers à part dans le système de fichier mais dans le contexte de Cantharella, le stockage dans la base suivrait une certaine logique.
L'autre question qui se pose alors est : en bytea ou en BLOB (oid) ? Ca fonctionne en bytea.
Dans notre cas de fichier peu volumineux (cf. limitation de taille définie dans les spécs.), les deux alternatives peuvent convenir. La principale différence étant que pour bytea, les données restent dans une colonne de la table tandis que pour les BLOB, les données sont externalisées dans une table système et référencées par un oid. D'un côté, Bytea semblent être plus facile à mettre en place mais pourrait engendrer certains problèmes de performance lors de requête sur l'ensemble des documents (preload), de l'autre BLOB semble garder toujours de bonnes performances (on demand) même avec des données plus volumineuses mais nécessite de mettre en place un système de suppression automatique des BLOB lorsque la référence (oid) est supprimé (trigger, rule). Je reste en bytea (lazy pour l'instant): @Basic(fetch = FetchType.LAZY)
En blob, j'ai une exception (en lecture, et pas a l'enregistrement) : org.postgresql.util.PSQLException: Les Large Objects ne devraient pas être utilisés en mode auto-commit. at org.postgresql.largeobject.LargeObjectManager.open(LargeObjectManager.java:200) at org.postgresql.largeobject.LargeObjectManager.open(LargeObjectManager.java:172) at org.postgresql.jdbc2.AbstractJdbc2BlobClob.<init>(AbstractJdbc2BlobClob.java:47) at org.postgresql.jdbc2.AbstractJdbc2Blob.<init>(AbstractJdbc2Blob.java:21) at org.postgresql.jdbc3.AbstractJdbc3Blob.<init>(AbstractJdbc3Blob.java:19) at org.postgresql.jdbc4.AbstractJdbc4Blob.<init>(AbstractJdbc4Blob.java:20) at org.postgresql.jdbc4.Jdbc4Blob.<init>(Jdbc4Blob.java:20) at org.postgresql.jdbc4.Jdbc4ResultSet.getBlob(Jdbc4ResultSet.java:52) at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getBlob(AbstractJdbc2ResultSet.java:336) at com.mchange.v2.c3p0.impl.NewProxyResultSet.getBlob(NewProxyResultSet.java:285) Pourtant cantharella n'est pas configuré en autocommit. private byte[] fileContent; -- Éric Chatellier - Code Lutin Tel: 02.40.50.29.28 - http://www.codelutin.com