java - 多线程应用程序中的spring + SQLite

标签 java spring sqlite

我正在开发一个使用 SQLite 数据库和 spring 的应用程序。当多个线程尝试修改数据库时出现问题 - 我收到错误:

'数据库文件被锁定'

我配置了一个数据源:

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

在每个线程中,我都有一个单独的 JdbcDaoSupport 实例,它执行对数据库的插入:

getJdbcTemplate().update(
  "insert into counts values(15)"
);

执行数据库更新的函数是事务性的(我尝试了所有的隔离级别,在每种情况下我都得到相同的错误)。

在使用其他数据库 (MySql) 时,相同的代码可以正常工作。

我该如何解决这个问题(不在我的代码中添加“手动”同步)?

最佳答案

我没有尝试过,但我建议,鉴于 SQLite 一次只支持一个连接,您应该将数据源配置为只创建一个连接。

我认为应该是这样的......

<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="1" />
    <property name="maxActive" value="1" />
    <property name="maxIdle" value="1" />
    <property name="poolPreparedStatements" value="true" />
</bean>

关于java - 多线程应用程序中的spring + SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5117248/

相关文章:

.net - 有人在 SharpDevelop 中使用 System.Data.SQLite 吗?

sqlite - SQLite 外键是否自动具有索引?

java - 如何将 java 堆栈跟踪的 bash 输出打印到 Linux 中的文件?

java - 将 RGB 值转换为整数

java - Spring MVC : @ResponseBody Get method return void

java - Spring Boot 应用程序在尝试运行时抛出启动失败错误

java - JPA 一对一关系的级联操作

python - SQLAlchemy 错误?我不知道

java - 我无法修复此 : java. lang.ArrayIndexOutOfBoundsException

java - 在测试中使用 Spring 组件