DataSource留下了睡眠连接

时间:2015-04-14 22:59:28

标签: mysql spring spring-mvc datasource jdbctemplate

我正在使用Spring并设置了一个DataSource bean:

@Bean DataSource getDataSource(){
    MysqlDataSource ds = new MysqlDataSource();
    ds.setUrl(DATABASE_URL);
    return ds;
}

我能够使用Spring的@Autowired注释注入此DataSource对象,并对数据库执行操作。我正在运行MySQL服务器的测试实例(连接限制为150)并在几分钟内达到该限制。我检查了连接数,150个连接中的大多数都在睡觉。

为了减少睡眠连接的数量,我尝试了以下方法,但没有一个成功:

1)我没有在我的每个DAO方法中调用dataSource.getConnection(),而是@Autowired一个名为setDataSource(DataSource ds)的方法,其中我保存了对Connection的引用。我的想法是,不是每次调用dataSource.getConnection(),而是DAO的特定实例将使用一个连接。做这一切工作正常,它减少了睡眠连接的数量,但不是很多。

2)我在close()对象上手动调用了Connection方法。在这样做之后,下次我使用dataSource(在任何DAO中)时,Spring抛出一个错误,表明连接已经关闭。 (我假设Spring 重新实例化@Beans?)

3)我修改了MySQL配置文件并将wait_timeout变量设置为几分钟。然而,在清理了睡眠连接后,我收到了Spring中的错误,类似于#2中的错误(com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

在我尝试重写所有DAO操作以使用JdbcTemplate而不是普通的Java SQL预处理语句之前,我想我会在这里询问是否有一个简单的解决方案。

感谢。

0 个答案:

没有答案