printemps + SQLite en application multi-thread
Je suis de développer une application qui utilise une base de données SQLite et le printemps. J'ai des problèmes lorsque plusieurs threads tentent de modifier la base de données, j'obtiens une erreur:
'Le fichier de base de données est verrouillée"
J'ai une seule source de données configuré:
<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" lazy-init="true">
<property name="driverClassName" value="org.sqlite.JDBC" />
<property name="url" value="jdbc:sqlite:sample.db" />
<property name="initialSize" value="2" />
<property name="maxActive" value="20" />
<property name="maxIdle" value="5" />
<property name="poolPreparedStatements" value="true" />
</bean>
et dans chaque thread, j'ai une instance distincte de l'JdbcDaoSupport qui effectue une insertion dans la base de données:
getJdbcTemplate().update(
"insert into counts values(15)"
);
La fonction qui effectue la mise à jour de la base de données est transactionnelle (j'ai essayé tous les niveaux d'isolement, dans chaque cas, je reçois le même message d'erreur).
Le même code fonctionne très bien, lors de l'utilisation d'autres bases de données (MySql).
Comment puis-je résoudre ce (sans l'ajout d'un "manuelle" de la synchronisation dans mon code)?
OriginalL'auteur jfu | 2011-02-25
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas essayé, mais je suggère que, étant donné que SQLite prend en charge une seule connexion à la fois, vous devez configurer votre source de données pour ne jamais créer une connexion.
Je pense que ce serait quelque chose comme ce qui suit...
OriginalL'auteur Matt Sheppard
Il suffit de le rattraper et de réessayer. C'est normal SQLite comportement.
[edit:] SQLite va réessayer de lui-même; cette erreur est levée si les tentatives ne fonctionnent pas à l'intérieur d'une certaine période. Vous pouvez augmenter le délai de diverses manières: http://www.sqlite.org/pragma.html#pragma_busy_timeout http://www.sqlite.org/c3ref/busy_timeout.html
OriginalL'auteur andrew cooke
Heureusement, j'ai la réponse parfaite pour vous - Berkeley DB et la API SQL. L'année dernière, Berkeley DB combinée du moteur de stockage avec le SQL de la couche de SQLite, en fournissant un produit combiné qui offre le meilleur des deux mondes. L'ubiquité et la facilité d'utilisation de SQLite, avec la concurrence, la performance, l'évolutivité et la fiabilité de Berkeley DB.
Pourquoi cette adresse à votre problème? Parce que Berkeley DB est complètement SQLite compatible, mais met en œuvre une autre, plus en même temps gestionnaire de verrouillage. Cela signifie que, dans Berkeley DB vous pouvez avoir plusieurs mise à jour de threads accèdent à la base de données en même temps. Il y a une couple d'intéressant livres blancs sur le sujet, écrit par Mike Owens (l'auteur de "Le Guide de référence pour SQLite"): Technique & Évaluation de la Performance et Les avantages et les Différences.
Disclaimer: je suis le chef de Produit pour Berkeley DB, donc je suis un peu biaisé. Cependant, vous trouverez que le Berkeley DB SQL API adresses exactement la question que vous apportez-comment permettre simultanés opérations de lecture/écriture dans SQLite.
Vous pouvez trouver le Berkeley DB licence ici: bit.ly/g7h1mf. Fondamentalement, il s'agit d'une double licence. Open source utiliser pour les projets open source. Licence commerciale pour les applications propriétaires ou pour obtenir le Support d'Oracle.
Comme autre alternative, HSQLDB (hsqldb.org) est libre, est disponible sous une licence GPL licence de type, est maintenant dans la version 2.3.0 et a été continuellement développé depuis plus de 10 ans. Il a une réelle client-serveur (ou autonome), une mature JDBC 4.1 pilote, a presque un support complet pour la norme ANSI SQL:2008, et prend en charge l'accès multiple à travers les deux 2PL et MVCC modèles.
OriginalL'auteur dsegleau
Avec le Printemps, vous pouvez tirer parti de la
SingleConnectionDataSource
. Pour mes utilisations (300+ insertions /seconde), cela fonctionne bien.Le réel les requêtes ne sont pas, non, mais le Printemps gère la synchronisation aussi longtemps que vous utilisez spring jdbc classes comme JdbcTemplate.
OriginalL'auteur wmarbut