使用Spring Framework时是否必须显式管理数据库资源..喜欢关闭所有打开的连接等吗?
我已经读到Spring将开发人员从这种锅炉板编码中解放出来......
这是为了回答我在Spring网络应用中遇到的错误:
org.springframework.jdbc.CannotGetJdbcConnectionException: 无法获得JDBC连接;嵌套 java.sql.SQLException异常: ORA-00020:最大进程数 (150)超过
{x}文件中配置了jdbcTemplate
,DAO实现引用了用于查询数据库的jdbcTemplate
bean。
答案 0 :(得分:2)
使用Spring Framework时是否必须显式管理数据库资源,如关闭所有打开的连接等?
如果您正在使用像JbdcTemplate这样的Spring抽象,那么Spring会为您处理,并且该部分中存在错误的可能性极小。
现在,如果没有关于您的配置(您的applicationContext.xml)的更多信息,在上下文中(您如何创建应用程序上下文,这究竟何时发生?),这很难说。所以这是一个黑暗的镜头:您是否在数据源配置上设置了属性destroy-method="close"
?这样的事情:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
在某些情况下,不使用销毁方法与其他一些不良做法相结合可能最终会耗尽资源。
答案 1 :(得分:0)
这可能是由于连接未被关闭。你如何在春天访问你的连接?您是否正在使用JdbcTemplate查询数据库?或者只是从春天获得连接?
答案 2 :(得分:0)
我读过Spring释放的东西 来自这种锅炉板的开发商 编码
这取决于您运营的Spring级别。 JdbcTemplate
提供了许多不同的操作,其中一些是即发即忘,其中一些操作仍然需要您正确地管理JDBC资源(连接,结果集,语句等)。经验法则是,如果您发现自己正在呼叫getConnection()
,那么在某些时候您还需要拨打releaseConnection()
。
ORA-00020:最大进程数 (150)超过
您使用的是连接池吗?如果是这样,那么请确保它没有配置比数据库能够处理的更大数量的最大连接数(在本例中为150)。如果你没有使用连接池,那么你真的应该是。
答案 3 :(得分:0)
你说“jdbcTemplate是在xml文件中配置的”。您通常应该为每个用法创建一个新的jdbcTemplate实例,而不是由spring管理它。
我猜想每次从spring请求一个新的jdbcTemplate bean时,它都会创建一个新的连接到数据库的新连接,但是在它超出代码范围之后它仍然被spring的applicationContext引用,所以不要关闭连接。
答案 4 :(得分:0)
我的软管仅提供20个连接。我通过手动关闭每个db请求的连接完成。我没有在bean中声明一个destory方法(这不起作用“我不知道为什么”),但我在每次请求调用中都做了。 (提示:在dao类中扩展JdbcDaoSupport)。
public void cleanUp() {
try {
if (!this.getJdbcTemplate().getDataSource().getConnection().isClosed()) {
this.getJdbcTemplate().getDataSource().getConnection().close();
}
} catch (Exception e) {
Logger.getLogger(myDAOImpl.class.getName()).log(Level.SEVERE, null, e);
}
}