首页 > 解决方案 > JDBC 模板是否缓存连接?

问题描述

我有一个 java-spring web 应用程序,它将从用户上传的 SQLite DB 中读取、写入和删除信息。我正在使用 JDBC 模板来设置连接、查询数据库和更新信息。

我在测试期间观察到一种行为:

每次用户上传一个新的 SQLite 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);

标签: javaspringspring-jdbcjdbctemplate

解决方案


JDBCTemplate不处理连接。它从设置到它的数据源中获取连接。

来自SingleConnectionDataSource的参考文档

包装单个 JDBC 连接的 SmartDataSource 的实现,该连接在使用后不会关闭。......

这主要用于测试。例如,它可以在应用程序服务器之外轻松测试期望在 DataSource 上工作的代码。与 DriverManagerDataSource 相比,它始终重用同一个 Connection,避免过多创建物理 Connection。

DriverManagerDataSource将满足您无需重新启动即可获得新连接的要求

标准 JDBC DataSource 接口的简单实现,通​​过 bean 属性配置普通的旧 JDBC DriverManager,并从每个 getConnection 调用返回一个新的 Connection。

更新

我的回答可能无法解决您最初的问题,但只会回答新连接的问题而无需重新启动。请查看@Thilo 对此的评论。


推荐阅读