有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java JDBC连接和Oracle

我有一个场景,问题如下

应用服务器有两个到数据库的连接池AB

A指向->DatabaseA->;有128 connections

A有一些存储过程,它们通过DB link访问DatabaseB中的表

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

现在让我们假设Java代码通过使用连接池A调用DatabaseA中存储的Proc。这个存储的进程正在通过数据库链接从DatabaseB获取数据

问题:

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

基本上,我想知道数据什么时候通过DB链接传输,就像这样。。。它是否会减少分配给池B pointint到数据库B的36个连接

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

一些堆栈跟踪:

Caused by: java.sql.SQLException: Closed Connection at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:185) at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForList(GeneralStatement.java:123) at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:614) at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:588) at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:118) at org.springframework.orm.ibatis.SqlMapClientTemplate$3.doInSqlMapClient(SqlMapClientTemplate.java:268) at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:193) at org.springframework.orm.ibatis.SqlMapClientTemplate.executeWithListResult(SqlMapClientTemplate.java:219) at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForList(SqlMapClientTemplate.java:266)

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


共 (3) 个答案

  1. # 1 楼答案

    “基本上,我想知道什么时候数据会像这样通过DB链接……它会从分配给池B pointint到数据库B的36个连接中删除吗?”

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

    我不得不忍受防火墙在一段时间不活动后切断连接,所以我经常看到这个错误。查看dbms_会话。关闭_database _link,因为数据库链接连接通常会在会话期间保持(而且由于您有一个连接池,该会话可能会占用很长时间)

  2. # 2 楼答案

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

  3. # 3 楼答案

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

    编写JDBC代码时,应该确保在同一个方法块中获取和关闭连接(以及语句和结果集)(顺序相反)。例如

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

    另一个可能的原因是池中的连接闲置时间过长,并且在释放之前没有测试/验证它们。这可以在一个合适的连接池中配置。查阅其文件