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

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

我'm able to inject this DataSource object using Spring' s @Autowired 注释并对数据库执行操作 . 我正在运行MySQL服务器的测试实例(连接限制为150)并在几分钟内达到该限制 . 我检查了连接数,150个连接中的大多数都在休眠 .

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

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

2)我在 Connection 对象上手动调用 close() 方法 . 在这样做之后,下次我使用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预处理语句之前,我想我会在这里询问是否有一个简单的解决方案 .

谢谢 .