2009-10-19 9 views
2

Comment faire un insert low_priority ou retardé dans une table MySQL avec Hibernate?INSÉRER LOW_PRIORITY ou INSERT DELAYED dans Hibernate

Dans ma routine de journalisation, je souhaite insérer les informations du journal dans une table de ma base de données pour une analyse plus approfondie. Mais je ne me soucie pas de la durée de l'insertion, donc je dirais généralement INSERT LOW_PRIORITY IN LOGEntry (niveau, titre, full) VALUES ('Info', 'Titre ici', 'Journal complet') ; Si j'ai une entité LogEntry, comment écrire ou connecter mon LogEntryDAO pour faire des insertions et des mises à jour LOW_PRIORITY ou DELAYED?

Vive

Nik

Répondre

2

Il existe une solution beaucoup plus simple.

Annoter ma classe d'entité avec @SQLInsert(sql="INSERT LOW_PRIORITY INTO LogEntry (level, title, full) VALUES (?, ?,?)")

Belle et élégante :-)

+0

Aussi pas portable. Mais bon, tout ce qui fonctionne :) – laura

1

Je dirais qu'une meilleure solution serait d'avoir un Log4J appender écrire ce message à une file d'attente et un MessageListener ramasser et l'insérer dans la base de données.

Votre application est découplée de la base de données de cette façon, et vous ne vous souciez pas du temps qu'il faut. Si votre base de données tombe en panne, votre file d'attente persistante peut accumuler des messages jusqu'à ce que vous puissiez la rétablir. Assurez-vous d'utiliser un pilote XA JDBC et un gestionnaire de transactions pour que la file d'attente et la base de données puissent constituer une transaction unique.

+0

Notez que XA ne fonctionne pas toujours comme prévu. Aucun XA jusqu'à présent gère le cas où l'un des participants meurt entre PREPARE et COMMIT correctement. Dans ce cas, vous pouvez obtenir n'importe quoi de la corruption de données à la perte de données et/ou aux interblocages. –

+0

En effet, c'est probablement aussi un très bon moyen de résoudre le problème. Il n'y a donc pas d'options low_priority ou retardées dans Hibernate? – niklassaers

+0

Ils ne me semblent pas portables, donc si vous trouvez ces fonctionnalités uniquement dans MySQL, je dirais que la réponse est "non". Pas que je sache de. – duffymo

2

Utilisez un org.hibernate.Interceptor. Il obtiendra une copie du SQL à exécuter pour modifier.

See the docs for details.

+0

Ok, donc pas moyen de le faire dans Hibernate plaine? Si ce n'est pas le cas, cela semble être une bonne solution, sauf que je dépendrai à nouveau de mon dialecte db – niklassaers

+0

Puisque MySQL est le seul DB qui supporte INSERT LOW_PRIORITY, Hibernate ne le supporte pas. –

Questions connexes