我正在使用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预处理语句之前,我想我会在这里询问是否有一个简单的解决方案。
感谢。