我知道这将是一个重复的问题,但我觉得我的问题有点不同。
我有像
这样的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=?)");
答案 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());
}
});