Postgresql, JDBC, et la diffusion de Gouttes
Je suis en train de récupérer un blob à partir d'une base de données postgres en utilisant des pilotes jdbc. Il est trop grand pour avoir en mémoire donc je veux le lire en téléchargement. J'ai essayé d'utiliser le getBinaryStream méthode sur le jeu de résultats, mais il s'avère que cette méthode fait le lit de tous en mémoire, donc ne fonctionne pas pour les fichiers volumineux.
Apparemment, on peut utiliser la getBlob méthode sur le jeu de résultats et le presumeably obtenir le inputstream de la goutte et à partir de là, mais c'est là que je tombe sur mon problème.
PreparedStatement ps = con.prepareStatement("select data from file_data WHERE ID = ?");
ps.setLong(1,file.fileData.id)
ResultSet rs = ps.executeQuery()
if(rs.next()){
rs.getBlob("data")
Qui est du code, je suis en cours d'exécution. Quand il arrive à la dernière ligne de lancer une erreur que je ne peut pas donner un sens...
org.postgresql.util.PSQLException: valeur incorrecte pour le type long : xxxxxx
"xxxxxx" est alors le contenu du fichier. Vous pouvez imaginer que devient assez long, mais pas vraiment le point.
Je suis coincé ici. Quelqu'un a une idée sur ce qui se passe? Diable, je vais même prendre d'autres méthodes pour la diffusion de gros blobs en téléchargement.
- Dans mon cas, c'était
rs.getBlob(...)
au lieu ders.getBinaryStream(...)
. Jamais trop tard pour apprendre JDBC.
Vous devez vous connecter pour publier un commentaire.
Ma conjecture est que vous avez mélangé OID et BYTEA style des gouttes. De grands objets binaires sont stockées indirecty avec l'OID de colonnes dans Postgres. La réelle fichier de données est stockée quelque part en dehors de la table de base de données par Postgres. La colonne contient un identificateur d'objet qui est associé à l'interne avec la goutte. Par exemple:
Si vous utilisez le
ResultSet#getBlob(String)
méthode, qu'un OID style de colonne est prévu.getBlob
lit les données de la colonne, et la convertit en unLong
. Puis il essaie de lire les associés de données binaires à partir de son espace de stockage interne.D'autre part, avec BYTEA vous pouvez placer de petits morceaux de données binaires directement dans votre base de données. Par exemple:
Ici, la colonne de données contient directement les données binaires. Si vous essayez d'utiliser
getBlob
sur une colonne de ce type, les données seront toujours interprété comme un OID, mais évidemment, il ne rentre pas dans unLong
. Essayez ceci sur la base de données, nous venons de créer:Serait PostgreSQL docs pour "Stocker des Données Binaires" de l'aide?
http://jdbc.postgresql.org/documentation/head/binary-data.html
La section intitulée "Récupération de l'image de l'Objet de Grande taille", de ses en bas de la page, peut aider.