批量执⾏sql使⽤hikariCP连接池,资源耗尽
使⽤hibernate框架时,通常数据库的交互离不开框架的缓存机制。如果因业务需求,需要批量执⾏更新语句等情况也是难免的,但是直接多次执⾏更新语句明显性能会下降了许多。因此,可以采⽤jdbc的批量处理sql。原来程序使⽤c3p0线程池,换成hikariCP后,批量执⾏sql⼀⼩段时间后,会陷⼊疑似阻塞的状态,也就是说整个程序不再执⾏任务了。
经排查,是数据库连接池没有回收,最终导致⽆可⽤资源导致的。
下⾯贴出我的修改部分,希望能帮到有缘⼈....
public void updateSqlList(List<String> updateSqlList) throws Exception {
Session session = SessionFactory().openSession();
Connection connection = tion();
Statement statement = null;
try {
connection.setAutoCommit(false);
statement = ateStatement();
int updateSqlListSize = updateSqlList.size();
long startTimeTotal = System.currentTimeMillis();
批量更新sql语句for (int i = 0; i < updateSqlListSize; i++) {
statement.(i));
if (i % 1000 == 0 && i != 0) {
long startTime = System.currentTimeMillis();
int[] count = new int[0];
try {
count = uteBatch();
} catch (SQLException e) {
if(null != count){
for (int j = 0, countSize=count.length; j < countSize; j++) {
int i1 = count[j];
if(Statement.EXECUTE_FAILED == count[j]){
System.out.println("语句有误:" + (j));
}
}
}
<("语句有误", e);
throw e;
}
connectionmit();
statement.clearBatch();
}
}
connectionmit();
connection.setAutoCommit(true);
} catch (Exception e) {
<("批量执⾏语句失败!", e);
try {
} catch (Exception e1) {
<("回滚批量执⾏语句失败!", e1);
}
throw new Exception("系统异常,批量执⾏语句失败!");
} finally {
if (statement != null) {
try {
statement.close();
} catch (SQLException sqlex) {
<("⽆法关闭数据库连接!", sqlex);
<("⽆法关闭数据库连接!", sqlex); }
}
if (connection != null) {
try {
connection.setAutoCommit(true);
connection.close();
logger.info("关闭数据库连接成功...");
} catch (SQLException sqlex) {
<("⽆法关闭数据库连接!", sqlex); }
}
if(null != session){
session.close();
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论