如何解决295次插入后,关闭连接并创建一个不超过最大光标的新连接
以前的开发人员在代码中留下了此消息。
它运行create语句并执行查询,并在295条记录后创建新连接。
以下是Java代码:
private void dbupdate() throws sqlException,Exception {
Statement st = null;
String sql = "";
int count = 0;
try {
getNewConnection();
conn.setAutoCommit(false);
for (Iterator it = sqlList.iterator(); it.hasNext();) {
if (count < 295) { //Closes connection and creates a new one so as not to exceed max cursors
count++;
} else {
st.close();
conn.close();
getNewConnection();
count = 0;
}
sql = (String) it.next();
// System.out.println(sql + " insert count=" + count);
st = conn.createStatement();
try {
st.executeQuery(sql);
} catch(Exception ex) {
Logger.getLogger(LoadMain.class.getName()).log(Level.SEVERE,sql);
Logger.getLogger(LoadMain.class.getName()).log(Level.SEVERE,ex.getLocalizedMessage(),ex);
sb.append("\n").append("Error sql:" + sql + "|LocalizedMessage:" +ex.getLocalizedMessage());
}
}
} catch (sqlException ex) {
Logger.getLogger(LoadMain.class.getName()).log(Level.INFO,sql);
Logger.getLogger(LoadMain.class.getName()).log(Level.SEVERE,ex);
throw new sqlException(ex);
} catch (Exception ex) {
// Logger.getLogger(loadMain.class.getName()).log(Level.SEVERE,ex);
throw new Exception(ex);
} finally {
try {
st.close();
conn.close();
} catch (sqlException ex) {
Logger.getLogger(LoadMain.class.getName()).log(Level.SEVERE,null,ex);
}
}
}
重新连接背后是否有任何逻辑? (另外,开发人员将autocommit设置为false,但是没有看到提交或回滚,而仅使用st.close()方法。)
任何人都可以开导
解决方法
似乎开发人员尝试实现连接池,现在可以轻松地将其与DBCP / Hikari /其他数据库连接池集成。
例如,您不需要在DAO级别/方法上进行提交 如果代码是通过@Transactional方法调用的,或者在服务级别处理了commit。
此外,您不能依靠close进行提交或回滚,使用不同的oracle驱动程序可能会有不同的结果
根据javadoc,在调用close方法之前,您应该尝试提交或回滚。否则结果将由实现定义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。