java - 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);
解决方案
JDBCTemplate不处理连接。它从设置到它的数据源中获取连接。
来自SingleConnectionDataSource的参考文档
包装单个 JDBC 连接的 SmartDataSource 的实现,该连接在使用后不会关闭。......
这主要用于测试。例如,它可以在应用程序服务器之外轻松测试期望在 DataSource 上工作的代码。与 DriverManagerDataSource 相比,它始终重用同一个 Connection,避免过多创建物理 Connection。
DriverManagerDataSource将满足您无需重新启动即可获得新连接的要求
标准 JDBC DataSource 接口的简单实现,通过 bean 属性配置普通的旧 JDBC DriverManager,并从每个 getConnection 调用返回一个新的 Connection。
更新
我的回答可能无法解决您最初的问题,但只会回答新连接的问题而无需重新启动。请查看@Thilo 对此的评论。
推荐阅读
- javascript - 表单刷新后的事件处理程序
- swift - Swift (4) 不能转换为泛型基类?
- jquery - document.scrollTop 在 Ionic 中为 0
- python - 如何使用主题建模获取基于主题的所有关键字?
- python - 使用 python 脚本将 splunk 警报结果发送到 SNMP 服务器
- javascript - 如何区分Javascript中变量的空值和零值?
- mongodb - 如何使 GraphQL 在突变时自动插入当前的 UTC?
- javascript - 我有一排,但不知何故我的按钮和文本区域在彼此下方对齐,而不是彼此相邻
- elixir - 无法回购。将值插入 belongs_to 字段
- php - 输出到 excel.csv 给出了奇怪的 æøå