Re: [Cantharella-devel] Stockage des documents
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) ? 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). Adrien Le 14/02/2013 03:23, Eric Chatellier a écrit :
Bonjour,
Je viens de mettre à jour le serveur avec le début des interfaces de gestion et visualisation des documents (seulement pour les molécules avant de le généraliser).
Concernant le stockage des fichiers attachés, peut-on les stocker directement dans la base de données ?
Cela simplifierais la gestion et la cohérence pour l'ajout et la suppression.
Techniquement, le modèle de données serait typé en byte[] voire en InputStream (voire si vraiment ca ne fonctionne pas en java.sql.Blob) et annoté en @Lob
-- Adrien Cheype Ingénieur en Systèmes d'Information Service « Informatique Scientifique et Appui aux Partenaires du Sud » Direction du Système d'Information (DSI) http://www.ird.fr/dsi/ http://www.ird.fr/informatique-scientifique/ INSTITUT DE RECHERCHE POUR LE DEVELOPPEMENT BP A5 - 98848 Nouméa - Nouvelle Calédonie Tél. +687 260 789
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
Ca fonctionne en bytea.
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.
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) private byte[] fileContent; Je suis en train d'essayer de passer en oid pour vérifier si cela améliore les
Le 14/02/2013 12:12, Eric Chatellier a écrit : performances. Par contre, j'ai toujours l'exception : org.postgresql.util.PSQLException: Les Large Objects ne devraient pas être utilisés en mode auto-commit. et impossible à résoudre :( -- Éric Chatellier - www.codelutin.com - 02.40.50.29.28
participants (2)
-
Adrien Cheype -
Eric Chatellier