Java 获取连接池中的SQLException错误
我正在使用数据源对象从连接池获取Oracle JDBC连接。 并使用该连接从java(通过java静态方法)将一些日志插入数据库。 因为每个用户大约有10到20个插入,所以我要做的是,在筛选器的请求级别提交连接,并在会话级别关闭连接(通过会话侦听器的sessionDestroyed()方法) 我在测试中没有得到任何错误,但在生产环境中,我得到的错误很少,如下所示:Java 获取连接池中的SQLException错误,java,oracle,jdbc,Java,Oracle,Jdbc,我正在使用数据源对象从连接池获取Oracle JDBC连接。 并使用该连接从java(通过java静态方法)将一些日志插入数据库。 因为每个用户大约有10到20个插入,所以我要做的是,在筛选器的请求级别提交连接,并在会话级别关闭连接(通过会话侦听器的sessionDestroyed()方法) 我在测试中没有得到任何错误,但在生产环境中,我得到的错误很少,如下所示: java.sql.SQLException: execute, Exception = null (one scenario) ja
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);
}
所以我正在检查上面的内容,所以当我尝试执行时,连接无法关闭,对吗?
但我不确定,也不明白它为什么会发生。我猜你的con对象是空的 考虑以下块:
if (con.isClosed() || con == null) {
DBConnectionHelper connHelper = DBConnectionHelper.createInstance();
con=connHelper.getConnection("ds");
con.setAutoCommit(false);
}
首先,您询问连接是否已关闭。然后你看它是否为空。如果con真的为null,您将得到一个NullpointerException
切换检查,看看是否有帮助:-)
改变
if (con.isClosed() || con == null) {
到
看看有没有区别
您如何检查con=connheloper.getConnection(“ds”)代码>成功吗?
我担心con
在执行con.setAutoCommit(false)之前是null
代码>
如果是这种情况,您需要检查生产数据库的连接字符串是否正确。为什么要关闭连接池中的连接?另外,在if中,我会在con.isClosed()之前先检查con是否为null。@Mike:一些连接池拦截close()
调用,而将连接返回到池中。@skaffman-嗯,在第一次连接之前,con
指向什么?@Mike如果使用连接池,然后,您确实需要关闭连接:这是连接池可供重用的信号。您(通常)不会得到实际的连接,而是一个由连接池管理的代理(正如skaffman所说:拦截关闭)。好吧,让我更改一下,然后看看。我应该在静态java方法中手动关闭连接池对象吗?还是最后关闭一次(就像我在会话侦听器中的sessionDestroyed()方法中所做的那样)?好的,让我更改一下,然后看看。我应该在静态java方法中手动关闭连接池对象,还是最后关闭一次(就像我在会话侦听器的sessionDestroyed()方法中所做的那样)?
if (con.isClosed() || con == null) {
if ( con == null || con.isClosed() ) {