1

J'ai un membre byte [] dans l'une de mes classes persistantes. Normalement, je voudrais simplement l'annoter avec @Lob et @Column (name = "foo", size =). Dans ce cas particulier, cependant, la longueur de l'octet [] peut varier considérablement (de ~ 10 Ko jusqu'à ~ 100 Mo).Longueur variable Blob en hibernation?

Si j'annote la colonne avec une taille de 128 Mo, je pense que je vais perdre beaucoup d'espace pour les objets de petite et moyenne taille. Y a-t-il un type de blob de longueur variable que je peux utiliser? Est-ce que hiberner prendra soin de tout cela pour moi dans les coulisses sans gaspiller de l'espace? Quelle est la meilleure façon d'y parvenir?

Merci!

Répondre

3

Si j'annote la colonne avec une taille de 128Mo, je sens que je vais gaspiller beaucoup d'espace pour les petits et les objets de taille moyenne. Y a-t-il un type de blob de longueur variable que je peux utiliser? LOB (CLOB ou BLOB) n'ont pas de taille (pour autant que je sache dans la plupart des bases de données)

Le type est destiné à contenir des informations qui sont clairement plus grandes que les données "régulières". La plupart des bases de données utiliseront un schéma de stockage différent pour ces données, par ex. stockez-les dans un autre segment en tant que données principales de la table. Je ne pense pas que le paramètre size soit pris en compte par Hibernate.

hibernent prendre soin de tous pour moi dans les coulisses sans perdre de l'espace?

Hibernate ne peut pas faire grand-chose et il est la base de données qui va gérer le stockage efficace de LOB. Les LOB sont un peu plus lents que les autres types (à cause du stockage spécial), mais ils sont encore très bien gérés par les bases de données.

la longueur de l'octet [] peut varier beaucoup (de ~ 10KB tout le chemin jusqu'à ~ 100Mo)

Quelle est la meilleure façon d'aller à ce sujet?

10KB est déjà grand comparé à la taille des données régulières d'une rangée (par exemple un caractère numérique, ou quelques caractères).

Il serait plus problématique si vous aviez par exemple des chaînes qui peuvent être courtes (par exemple 20 caractères), mais aussi très longues (par exemple 3000 caractères). Dans ce cas, vous payez le prix du LOB pour les petites chaînes (qui peuvent être stockées dans les données principales de la table). Mais 10Ko est de toute façon relativement important, donc l'utilisation d'un LOB est vraiment justifiée.

Notes:

Vous pourriez envisager d'utiliser un flux (par exemple InputStream) au lieu d'un tableau d'octets. Cela pourrait améliorer les performances de votre application, et vous ne serez pas limité par la mémoire (ce qui se passe lorsque vous avez 20 utilisateurs simultanés qui accèdent à un LOB 100MB?).

Vous pouvez également envisager de demander à votre DBA comment régler le stockage LOB. La plupart des bases de données ont des paramètres pour cela. Voici, par exemple, l'Oracle LOB Performance Guideline.

+0

Je souhaite parfois que j'avais un DBA. C'est juste moi. :) J'utilise hsqldb comme ma base de données, et ce sont en fait des images (pas de texte).L'idée d'InputStream est intéressante: pouvez-vous me montrer un tutoriel ou quelque chose que je peux lire pour me lancer? – Seth

+0

@Seth Je ne sais pas si '@ Lob' fonctionne avec stream. Vous devrez peut-être utiliser un 'UserType': http://i-proving.ca/space/Technologies/Hibernate/Blobs+and+Hibernate et http://ajava.org/online/hibernate3api/org/hibernate/Hibernate. html Je ne me souviens malheureusement pas des détails. – ewernli

+0

Merci pour les suggestions. – Seth