Spring 数据库连接没有关闭
Spring Database connection not getting closed
我正在使用 SPRING BatchPreparedStatementSetter
对象在 1 table 中批量插入记录。
一旦完成,它将在另一个 table 中执行批量更新。
这个过程会根据记录的数量重复多次。
现在,我遇到的问题是,在修复无迭代后,无法获取数据库连接并且系统只是挂起,因为 Spring 没有返回任何输出。
分析后发现系统已达到最大允许连接限制,这是完全有效的,但我理解 Spring 框架应在每次 CRUD 操作后处理连接释放过程。
有没有办法处理这个连接池问题。我正在使用 Apache BasicDataSource 作为 DataSource
对象。
提前致谢。
Code detail is something like this -
Service class -
public class ServiceImpl {
----
if (list.size() == 1000) {
daoInstance.storeRecordsinDB(list);
daoInstance.updateRecordsInDB(list2);
}
-----
}
Another class DaoInstance -
public class DaoInstance extends JdbcTemplate {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate =jdbcTemplate;
}
public void storeRecords(List<dtoObj> valueList) {
getJdbcTemplate().batchUpdate(insertSql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
dtoObj dto = valueList.get(i);
ps.setLong(1, dto.getId());
ps.setString(2, dto.getName();
}
@Override
public int getBatchSize() {
return valueList.size();
}
}) ;
}
public void updateRecordsInDB(final List<Long> idList) {
try {
getJdbcTemplate().batchUpdate(updateSQL, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
long id = idList.get(i)
ps.setLong(1, id);
}
@Override
public int getBatchSize() {
if (idList != null ) {
return idList.size();
}else {
return 0;
}
}
});
}
Implemented transaction management on service class in Spring xml file as -
<tx:advice id = "txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
<!-- <tx:method name="*" read-only="true"/> -->
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* com.package.serviceImpl.process*(..))" id="accuracyOperation"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="accuracyOperation"/>
</aop:config>
已通过在代码中实施事务管理解决此问题。
另一个主要问题是,在 select 子句之一中,连接没有关闭。因此,通过在 Connection 对象上显式调用 close 方法,它会被关闭,因此系统不会超过最大连接限制。
我正在使用 SPRING BatchPreparedStatementSetter
对象在 1 table 中批量插入记录。
一旦完成,它将在另一个 table 中执行批量更新。
这个过程会根据记录的数量重复多次。
现在,我遇到的问题是,在修复无迭代后,无法获取数据库连接并且系统只是挂起,因为 Spring 没有返回任何输出。
分析后发现系统已达到最大允许连接限制,这是完全有效的,但我理解 Spring 框架应在每次 CRUD 操作后处理连接释放过程。
有没有办法处理这个连接池问题。我正在使用 Apache BasicDataSource 作为 DataSource
对象。
提前致谢。
Code detail is something like this -
Service class -
public class ServiceImpl {
----
if (list.size() == 1000) {
daoInstance.storeRecordsinDB(list);
daoInstance.updateRecordsInDB(list2);
}
-----
}
Another class DaoInstance -
public class DaoInstance extends JdbcTemplate {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate =jdbcTemplate;
}
public void storeRecords(List<dtoObj> valueList) {
getJdbcTemplate().batchUpdate(insertSql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
dtoObj dto = valueList.get(i);
ps.setLong(1, dto.getId());
ps.setString(2, dto.getName();
}
@Override
public int getBatchSize() {
return valueList.size();
}
}) ;
}
public void updateRecordsInDB(final List<Long> idList) {
try {
getJdbcTemplate().batchUpdate(updateSQL, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
long id = idList.get(i)
ps.setLong(1, id);
}
@Override
public int getBatchSize() {
if (idList != null ) {
return idList.size();
}else {
return 0;
}
}
});
}
Implemented transaction management on service class in Spring xml file as -
<tx:advice id = "txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
<!-- <tx:method name="*" read-only="true"/> -->
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* com.package.serviceImpl.process*(..))" id="accuracyOperation"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="accuracyOperation"/>
</aop:config>
已通过在代码中实施事务管理解决此问题。
另一个主要问题是,在 select 子句之一中,连接没有关闭。因此,通过在 Connection 对象上显式调用 close 方法,它会被关闭,因此系统不会超过最大连接限制。