繁体   English   中英

Java JDBC连接和Oracle

[英]Java JDBC connections and Oracle

我有一个场景,问题如下

应用程序服务器有两个与数据库的连接池。 AB

指向-> DatabaseA A >具有128 connections

A具有存储过程,可通过DB link访问DatabaseB

B指向-> DatabaseB B >具有36 connections

现在假设Java代码通过使用连接池A调用了DatabaseA的Stored Proc。 此存储的过程正在通过数据库链接从DatabaseB获取数据

题:

基于这种情况,如果前端出现connection closed错误。 可以说,即使java从池A(128)调用SP(在DatabaseA ),但是由于SP从DatabaseB带来数据,所以它的连接数较少(36)。

基本上,我想知道何时通过这样的DB链接来传输数据...它是否不占用分配给池B pointint到DatabaseB的36个连接?

确切异常我得到的确切异常是: --- Cause: java.sql.SQLException: Closed Connection

一些堆栈跟踪:

引起原因:java.sql.SQLException:com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList上com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:185)处的关闭连接(GeneralStatement.java:123)在com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:614)在com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:588) org.springframework.orm.ibatis.SqlMapClientTemplate $ 3.doInSqlMapClient(SqlMapClientTemplate.java:268)上的com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:118)在org.springframework.orm.ibatis.SqlMapClientTemplate上org.springframework.orm.ibatis.SqlMapClientTemplate.executeWithListResult(SqlMapClientTemplate.java:219)处的org.springframework.orm.ibatis.SqlMapClientTemplate.queryForList(SqlMapClientTemplate.java:266)的.execute(SqlMapClientTemplate.java:193)

另外,我正在使用iBatis ...所以没有try..catch..finally

该存储过程是数据库运行; 当它与另一个数据库建立连接时,将建立直接连接,并且不会通过应用程序服务器的池。 实际上,它可以建立与链接到A的任何数据库的连接,而不管应用服务器是否维护与该数据库的连接池。

该异常表示资源泄漏,即JDBC代码未正确关闭finally块中的连接(以确保即使在发生异常的情况下也被关闭),或者该连接在多个线程之间共享。 如果两个线程共享来自池的相同连接,而一个线程关闭它,则当另一个线程使用该连接时,将发生此异常。

应该编写JDBC代码,以便在完全相同的方法块中获取并关闭连接(以及语句和结果集)(以相反的顺序)。 例如

Connection connection = null;
// ...
try {
     connection = database.getConnection();
     // ...
} finally {
     // ...
     if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}

另一个可能的原因是该池将连接保持空闲状态的时间过长,并且在释放之前未对其进行测试/验证。 这可以在体面的连接池中进行配置。 请查阅其文档。

“基本上,我想知道何时通过这样的DB链接来传送数据...它是否不占用分配给池B pointint的36个连接到DatabaseB的连接?”

否。数据库服务器将与其他数据库服务器建立独特的连接,而不管连接池如何。

一段时间不活动之后,我必须经过防火墙切断连接的连接,因此我经常看到此错误。 查看dbms_session.close_database_link,因为数据库链接连接通常会在会话期间保持不变(并且由于您有连接池,因此该会话可能会停留很长时间)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM