2009-10-27 4 views
3

J'utilise une base de données sqlite pour une file d'attente producteur-consommateur. Un ou plusieurs producteurs INSÉRER une rangée à la fois avec une nouvelle clé primaire auto-incrémentée.Meilleures pratiques pour l'utilisation de sqlite dans une file d'attente de base de données

Il y a un consommateur (implémenté dans Java, utilise la bibliothèque sqlite-jdbc) et je veux qu'il lise un lot de lignes et les supprime. Il semble que j'ai besoin de transactions pour le faire, mais essayer d'utiliser SQLite avec des transactions semble ne pas fonctionner correctement. Suis-je en train de penser cela?

Si je finis par avoir besoin de transactions, quelle est la bonne façon de le faire en Java?

Connection conn; 
// assign here 

boolean success = false; 
try { 
    // do stuff 
    success = true; 
} 
finally 
{ 
    if (success) 
     conn.commit(); 
    else 
     conn.rollback(); 
} 

Répondre

1

Normalement, avec SQLite, il y a des transactions explicites (non implicites!). Donc, vous avez besoin de quelque chose comme "START TRANSACTION" bien sûr, il se pourrait que votre liaison Java ait ceci intégré - mais les bonnes liaisons ne le font pas. Par conséquent, vous pouvez ajouter le début de transaction nécessaire (il peut y avoir une méthode spéciale dans votre liaison).

+0

qui semble le faire; lorsque j'exécute des instructions SQL "BEGIN TRANSACTION" et "END TRANSACTION" au lieu d'utiliser les fonctions de validation/annulation de JDBC, cela semble fonctionner correctement. –

+0

Salut Jason, au moins, vous avez besoin BEGIN TRANSACTION (dans certaines bibliothèques, il existe des méthodes spéciales pour ce faire). END TRANSACTION devrait être en résultat le même comme COMMIT. – Juergen

2

Voir this trail pour une introduction sur la gestion des transactions avec Java JDBC. En ce qui concerne votre cas d'utilisation, je pense que vous devriez utiliser les transactions, surtout si le consommateur est complexe. La partie délicate est toujours de décider quand une rangée a été consommée et quand elle devrait être considérée encore. Par exemple, si vous avez une erreur avant que le consommateur puisse réellement faire son travail, vous aurez besoin d'une restauration. Mais si la ligne contient des données illégales (comme un texte dans un champ numérique), l'annulation se transformera en une boucle infinie.

Questions connexes