我使用数据源对象从连接池获取Oracle JDBC连接。 并使用连接将一些日志从java插入DB(通过java静态方法)。 由于每个用户将有大约10到20个插入,我正在做的是,我在Filter中请求级别提交连接并在会话级别关闭连接(通过Session Listener的sessionDestroyed()方法) 我没有在测试中得到任何错误,但在生产环境中,我得到的错误如下,
java.sql.SQLException: execute, Exception = null (one scenario)
java.sql.SQLException: close, Exception = null (for another scenario)
如何避免这些错误?我可以改为在java静态方法中提交和关闭连接,而不是在请求级别提交并在会话级别关闭吗?
但令我感到有趣的是,尽管我的java静态方法中存在以下逻辑,但这些错误仍在发生,
if (con.isClosed() || con == null) {
DBConnectionHelper connHelper = DBConnectionHelper.createInstance();
con=connHelper.getConnection("ds");
con.setAutoCommit(false);
}
所以我正在检查上面的内容,所以在我尝试执行时无法关闭连接,我是对的吗? 但不确定和混淆为什么会发生它。
答案 0 :(得分:1)
我猜你的con对象是null?
考虑以下块:
if (con.isClosed() || con == null) {
DBConnectionHelper connHelper = DBConnectionHelper.createInstance();
con=connHelper.getConnection("ds");
con.setAutoCommit(false);
}
首先询问连接是否已关闭。然后你看它是否为null。如果con确实为null,则会出现NullpointerException。
切换支票,看看它是否有帮助: - )
if (con == null || con.isClosed()) {
DBConnectionHelper connHelper = DBConnectionHelper.createInstance();
con=connHelper.getConnection("ds");
con.setAutoCommit(false);
}
答案 1 :(得分:1)
更改
if (con.isClosed() || con == null) {
到
if ( con == null || con.isClosed() ) {
看看是否存在差异。
您是如何检查con=connHelper.getConnection("ds");
成功的?
在执行con
之前,我担心null
为con.setAutoCommit(false);
如果是这种情况,则需要检查生产数据库的连接字符串是否正确。