连接太多spring spring jdbc

时间:2016-04-21 08:54:27

标签: spring amazon-web-services jdbc spring-boot

我知道这将是一个重复的问题,但我觉得我的问题有点不同。

我有像

这样的JdbcDAO类
    @Component
    public class JdbcUserDAO implements UserDAO {
    @Autowired
    MyJdbc myJdbc;
   }

我已经按如下方式定义了MyJdbc类:

@Component
public class MyJdbc {

@Autowired
    protected JdbcTemplate jdbc;

}

在MyJdbc类中,我定义了insert和batchupdate,并通过jdbc变量调用它们。 它是否会创建太多连接异常。

我在application.properties文件中定义了jdbc参数:

spring.datasource.url=#databaseurl
spring.datasource.username=#username
spring.datasource.password=#password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.test-on-borrow=true
spring.datasource.max-active=100
spring.datasource.max-wait=10000
spring.datasource.min-idle=10
spring.datasource.validation-query=SELECT 1
spring.datasource.time-between-eviction-runs-millis= 5000
spring.datasource.min-evictable-idle-time-millis=30000
spring.datasource.test-while-idle=true
spring.datasource.test-on-borrow=true
spring.datasource.test-on-return=false

我得到了例外:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections

我对application.properties文件做了很多更改,但是它没有用。我的数据库托管在AWS RDS上。

但是为了更新blob图像值我做了:

blob= myJdbc.jdbc.getDataSource().getConnection().createBlob();
            blob.setBytes(1, str.getBytes());
            pstmt = myJdbc.jdbc.getDataSource().getConnection().prepareStatement("update user_profile set profileImage=? where user_profile.id in ( select id from user_login where email=?)");

1 个答案:

答案 0 :(得分:2)

blob= myJdbc.jdbc.getDataSource().getConnection().createBlob();
blob.setBytes(1, str.getBytes());
pstmt = myJdbc.jdbc.getDataSource().getConnection().prepareStatement("update user_profile set profileImage=? where user_profile.id in ( select id from user_login where email=?)");

问题在于您的代码。该代码打开 2 与数据库的其他连接而不关闭它们。你自己打开连接然后你也应该关闭它们。但是,在这些情况下最好使用ConnectionCallback

myJdbc.execute(new ConnectionCallback() {
    public Object doInConnection(Connection con) throws SQLException, DataAccessException {
        blob = con.createBlob();
        blob.setBytes(1, str.getBytes());
       pstmt = con.prepareStatement("update user_profile set profileImage=? where user_profile.id in ( select id from user_login where email=?)");
       return null;
    }
});

然而,使用Spring JDBCs Blob支持更加容易(参见the reference guide)。这样你就不需要自己搞乱连接和blob了。

final String query = "update user_profile set profileImage=? where user_profile.id in ( select id from user_login where email=?)";
myJdbc.jdbc.execute(query, new AbstractLobCreatingPreparedStatementCallback(lobHandler) { 1
    protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException {
        byte[] bytes = str.getBytes();
        ps.setString(2, email);
        lobCreator.setBlobAsBinaryStream(ps, 1, str.getBytes()); 
    }
});