我有一个Java Spring Web应用程序,它将从用户上载SQLite DB中读取,写入和删除信息。我正在使用JDBCtemplate来设置连接,查询数据库并更新信息。
我在测试期间观察到一种行为:
[每次用户上载新的SQLite db文件后(它将具有相同的名称,与旧的DB文件位于同一目录中),如果他们不重新启动/重新启动tomcat,jdbcquery将报告db损坏异常。
对我来说,这看起来像JDBCtemplate以某种方式缓存了连接,并试图恢复与旧数据库的连接?
如果是这样,您是否仍然知道在不重新启动应用程序的情况下刷新连接?
final SingleConnectionDataSource dataSource = new singleConnectionDataSource();
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
throw new applicationException(MessageTemplateNames.GENERAL_UNKNOWN_ERROR, e);
}
createDirectoryForDbIfNotExists();
dataSource.setUrl(String.format("%s%s", JDBC.PREFIX, getDbFileLocation()));
dataSource.setAutoCommit(true);
[JDBCTemplate不处理连接。它从设置的数据源获取连接。
摘自SingleConnectionDataSource的参考文档
包装单个JDBC连接的SmartDataSource的实现使用后没有关闭。 .....
这主要用于测试。例如,它可以轻松实现在应用程序服务器外部进行测试,以查找预期可以运行的代码在数据源上。与DriverManagerDataSource相比,它重复使用始终保持相同的连接,避免过多创建物理连接。
DriverManagerDataSource将满足您的要求,而无需重新启动即可获得新连接
标准JDBC DataSource接口的简单实现,通过bean属性配置普通的旧JDBC DriverManager,以及r 从每个getConnection调用中返回一个新的Connection。
更新
我的答案可能无法解决您的原始问题,但是只会回答新连接的问题,而无需重新启动。请通过@Thilo对此发表评论。