Java Spring数据库连接未关闭
我使用SPRINGJava Spring数据库连接未关闭,java,spring,Java,Spring,我使用SPRINGBatchPreparedStatementSetter对象在1个表中批量插入记录 完成后,它将在另一个表中执行批处理更新 根据记录的数量,此过程会重复多次 现在,我遇到的问题是,在修复之后,并没有迭代,数据库连接并没有获得,系统只是挂起,因为Spring并没有返回任何输出 分析后,发现系统达到了连接的最大允许极限,这是完全有效的,但我认为Spring framework应该在每次CRUD操作后负责连接释放过程 是否仍然存在处理此连接池问题的方法。我使用apachebasicd
BatchPreparedStatementSetter
对象在1个表中批量插入记录
完成后,它将在另一个表中执行批处理更新
根据记录的数量,此过程会重复多次
现在,我遇到的问题是,在修复之后,并没有迭代,数据库连接并没有获得,系统只是挂起,因为Spring并没有返回任何输出
分析后,发现系统达到了连接的最大允许极限,这是完全有效的,但我认为Spring framework应该在每次CRUD操作后负责连接释放过程
是否仍然存在处理此连接池问题的方法。我使用apachebasicdatasource作为数据源
对象
提前感谢。代码详细信息如下-
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>
服务等级-
公共类ServiceImpl{
----
如果(list.size()==1000){
daoInstance.storeRecordsinDB(列表);
daoInstance.updateRecordsInDB(列表2);
}
-----
}
另一个类实例-
公共类实例扩展JdbcTemplate{
私有JdbcTemplate JdbcTemplate;
公共void setJdbcTemplate(JdbcTemplate JdbcTemplate){
this.jdbcTemplate=jdbcTemplate;
}
公共记录(列表值列表){
getJdbcTemplate().batchUpdate(插入SQL,新的BatchPreparedStatementSetter()){
@凌驾
公共void setValues(PreparedStatement ps,int i)引发SQLException{
dtoObj dto=valueList.get(i);
ps.setLong(1,dto.getId());
ps.setString(2,dto.getName();
}
@凌驾
public int getBatchSize(){
返回valueList.size();
}
}) ;
}
public void updateRecordsInDB(最终列表idList){
试一试{
getJdbcTemplate().batchUpdate(updateSQL,新的BatchPreparedStatementSetter()){
@凌驾
公共void setValues(PreparedStatement ps,int i)引发SQLException{
long id=idList.get(i)
ps.setLong(1,id);
}
@凌驾
public int getBatchSize(){
if(idList!=null){
返回idList.size();
}否则{
返回0;
}
}
});
}
在SpringXML文件中实现服务类的事务管理-
通过在代码中实现事务管理,解决了这一问题
另一个主要问题是,在其中一个select子句中,连接没有关闭。因此,通过显式调用连接对象上的close方法,连接正在关闭,因此系统没有通过max connection LIMIT。您可以共享一些源代码吗?发布使用springWh进行批插入的方法实现您是否将代码作为答案发布???您需要使用此代码编辑您的答案。