3

我试图多次使用 OracleDataSource 连接。在课堂上,我将 cacheProperty 设置为 10:

cacheProps.setProperty("MaxLimit", "10");

调用连接的类正在等待返回值,因此两个调用不会同时进行。使用连接的类在类中的随机位置获取带有连接变量的空指针。它总是发生在第 5 个请求上。是否有一些我不知道的属性意味着您只能使用连接池 4 次?

这是出现空指针的代码片段:

int threadNo = 2;
Connection conn = OraConnODS.getConnection("env " + threadNo);
conn.setAutoCommit(false);
Statement stm = conn.createStatement();

通常在第二行,有时在第三行。

4

2 回答 2

1

尝试此查询以检查在 oracle 中实际打开了多少个连接

SELECT
  'Currently, ' 
  || (SELECT COUNT(*) FROM V$SESSION)
  || ' out of ' 
  || VP.VALUE 
  || ' connections are used.' AS USAGE_MESSAGE
FROM 
  V$PARAMETER VP
WHERE VP.NAME = 'sessions'

看看计数是否 > 10。如果 > 10,那么您需要发布您的完整代码/xml 让我们看看。

于 2013-07-07T16:29:07.830 回答
0

首先,您应该尝试使用像 C3P0 这样的数据库连接池,而不是直接使用数据源。这样,您将对它有更多的控制权。

无论如何,您的问题似乎是关系连接泄漏。可能有一些陈旧的连接会阻止您创建更多连接。所以下一步将是检查有多少连接是打开的[参见 satya 的答案]。但是下一个问题将是删除陈旧的连接,这将是困难的,所以我再次建议数据库连接池。

编辑:好的,我可以看到您正在使用连接池,然后尝试打印活动连接总数,您将能够解决根本问题。由于连接泄漏,我遇到了同样的问题,粗略的解决方法是用蛮力清理连接[通常连接池提供这样的 api,至少 C3P0 提供]。获取连接池日志,您将知道根本原因。

于 2013-07-07T16:35:36.940 回答