JDBC模板缓存连接吗?

问题描述 投票:0回答:1

我有一个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);
java spring spring-jdbc jdbctemplate
1个回答
2
投票

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

摘自SingleConnectionDataSource的参考文档

包装单个JDBC连接的SmartDataSource的实现使用后没有关闭。 .....

这主要用于测试。例如,它可以轻松实现在应用程序服务器外部进行测试,以查找预期可以运行的代码在数据源上。与DriverManagerDataSource相比,它重复使用始终保持相同的连接,避免过多创建物理连接。

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

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

更新

我的答案可能无法解决您的原始问题,但是只会回答新连接的问题,而无需重新启动。请通过@Thilo对此发表评论。

© www.soinside.com 2019 - 2024. All rights reserved.