Spring中的数据库连接管理

时间:2010-02-12 06:15:06

标签: java database spring

使用Spring Framework时是否必须显式管理数据库资源..喜欢关闭所有打开的连接等吗?

我已经读到Spring将开发人员从这种锅炉板编码中解放出来......

这是为了回答我在Spring网络应用中遇到的错误:

  

org.springframework.jdbc.CannotGetJdbcConnectionException:   无法获得JDBC连接;嵌套   java.sql.SQLException异常:   ORA-00020:最大进程数   (150)超过

{x}文件中配置了jdbcTemplate,DAO实现引用了用于查询数据库的jdbcTemplate bean。

5 个答案:

答案 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);
        }
    }