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)?

Comment simultanées attendez-vous à votre application d'être? Rappelons que, de par sa conception, SQLite est destiné à être un remplacement pour fopen() et -MySQL. Si vous avez besoin d'un SGBDR qui a été conçu pour gérer 2PL ou MVCC simultanées dans l'accès aux données, vous voudrez peut-être envisager un autre SGBDR. MySQL, HSQLDB, ou des Derby, toutes ont un réel client-serveur.

OriginalL'auteur jfu | 2011-02-25