Java JDBC连接和Oracle

时间:2010-06-04 22:51:50

标签: java oracle jdbc connection-pooling

我有一个场景,问题如下

应用程序服务器有两个到DB的连接池。 AB

A指向 - > DatabaseA - >有128 connections

A具有存储过程,可以访问位于DatabaseB上的DB link的表格

B指向 - > DatabaseB - >有36 connections

现在假设Java代码使用连接池DatabaseAA中调用Stored Proc。此存储过程从DatabaseB

通过数据库链接获取数据

问题:

如果我们在前端出现connection closed错误,则根据此方案。即使java从池A(128)调用SP(在DatabaseA中),但由于SP从DatabaseB引入数据,因此它具有较少的连接数(36),这是否可行。

基本上我想知道数据何时通过这样的数据库链接...这是否会将36个连接分配给池B pointint到DatabaseB?

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

一些堆栈跟踪:

  

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

应该编写JDBC代码,以便在同一个方法块中获取和关闭连接(以及语句和结果集)(以相反的顺序)。 E.g。

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

另一个可能的原因是池在空闲时保持连接太长而在释放之前没有测试/验证它们。这可以在一个不错的连接池中配置。查阅其文档。

答案 2 :(得分:0)

“基本上我想知道数据何时被带到这样的数据库链接上......它是否会将36个连接分配给池B的pointint到DatabaseB?”

没有。无论任何连接池如何,数据库服务器都将与其他数据库服务器建立不同的连接。

我必须在一段时间不活动后遭受防火墙切断连接,所以我看到这个错误很多。查看dbms_session.close_database_link,因为数据库链接连接通常会在会话期间保持不变(并且由于您有连接池,该会话可能会存在很长时间)。