这个问题可能会混淆 Java 和数据库问题之间的界限,所以如果这个问题不该发在这里,我深表歉意。目前还不确定哪一方应该受到指责。
我是一名 Java 开发人员,暂时担任项目的 DBA,因此我在这方面还很陌生。我们在 Java 应用程序使用的 Red Hat Linux 64 位服务器上运行 Oracle 11.2.0.1。我们最近决定将 Oracle 11g 实例从专用服务器切换到共享服务器,现在我们的应用程序经常抛出以下错误:
09:58:00,077 ERROR [main] SparqlHelper:198 - Error performing query:
com.hp.hpl.jena.shared.JenaException: java.sql.SQLRecoverableException: Closed Connection
at oracle.spatial.rdf.client.jena.OracleSemQueryPlan.executeBindings(OracleSemQueryPlan.java:494)
at oracle.spatial.rdf.client.jena.OracleStagePattern.<init>(OracleStagePattern.java:216)
at oracle.spatial.rdf.client.jena.OracleQueryIterBlockTriplesQH.nextStage(OracleQueryIterBlockTriplesQH.java:98)
at com.hp.hpl.jena.sparql.engine.iterator.QueryIterRepeatApply.makeNextStage(QueryIterRepeatApply.java:94)
at com.hp.hpl.jena.sparql.engine.iterator.QueryIterRepeatApply.hasNextBinding(QueryIterRepeatApply.java:55)
at com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:69)
... (lots more)
Caused by: java.sql.SQLRecoverableException: Closed Connection
at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3331)
at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3232)
at oracle.jdbc.OracleConnectionWrapper.prepareStatement(OracleConnectionWrapper.java:115)
at oracle.spatial.rdf.client.jena.Oracle.executeQuery(Oracle.java:411)
at oracle.spatial.rdf.client.jena.Oracle.executeQuery(Oracle.java:374)
at oracle.spatial.rdf.client.jena.Oracle.executeQuery(Oracle.java:366)
at oracle.spatial.rdf.client.jena.Oracle.executeQuery(Oracle.java:354)
at oracle.spatial.rdf.client.jena.OracleSemQueryPlan.executeBindings(OracleSemQueryPlan.java:457)
... 75 more
当我们关闭共享服务器时,应用程序又可以正常运行。
我们甚至不确定该去哪里查找导致该问题的原因,无论是应用程序端还是数据库端的配置。如果您能提供关于该错误或查找位置的任何信息,我们将不胜感激。
没有相应的 ORA 错误,因为数据库似乎将此视为正常业务。我们尝试增加共享服务器以及调度程序的数量,
如果我需要补充任何我忽略的信息,请告诉我。谢谢!
更新:我们能够通过打开服务器上的调度程序池来解决这些错误。这意味着我们在调度程序参数中添加了 (POOL=on)。现在我们看到间歇性 SQL 查询挂起,我认为这是由于共享服务器分配不足造成的,但其中有 3 或 4 个服务器没有处理一条消息。