3

我已经在java服务器上部署了应用程序。wildfly-15.0.1.FINAl我正在使用OJDBC 12.1.0.2.0驱动程序。

<datasource jndi-name="java:/DS_APP" pool-name="APP" enabled="true" use-java-context="true">
        <connection-url>jdbc:oracle:thin:@localhost:1521:MYDB</connection-url>      
        <driver>OracleJDBCDriver</driver>
        <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
        <pool>
             <min-pool-size>3</min-pool-size>
             <max-pool-size>200</max-pool-size>
        </pool>
        <security>
             <security-domain>Password4APP</security-domain>
        </security>
        <validation>
            <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
            <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
        </validation>
        <timeout>
            <blocking-timeout-millis>60000</blocking-timeout-millis>
            <idle-timeout-minutes>15</idle-timeout-minutes>
        </timeout>
        <statement>
            <track-statements>true</track-statements>
            <prepared-statement-cache-size>100</prepared-statement-cache-size>
        </statement>
    </datasource>

有一段时间我的应用程序无法获得数据库连接并记录这样的错误

Caused by: java.sql.SQLException: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:/DS_APP
    at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:146) ~[?:?]
    at org.jboss.as.connector.subsystems.datasources.WildFlyDataSource.getConnection(WildFlyDataSource.java:64) ~[?:?]
    at ge.app.ws.util.DbManager.getDatabaseConnection(DbManager.java:55) ~[classes:?]
    ... 2 more
Caused by: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:/DS_APP
    at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:690) ~[?:?]
    at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:440) ~[?:?]
    at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:789) ~[?:?]
    at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:138) ~[?:?]
    at org.jboss.as.connector.subsystems.datasources.WildFlyDataSource.getConnection(WildFlyDataSource.java:64) ~[?:?]
    at ge.app.ws.util.DbManager.getDatabaseConnection(DbManager.java:55) ~[classes:?]
    ... 2 more
Caused by: javax.resource.ResourceException: IJ000655: No managed connections available within configured blocking timeout (60000 [ms])
    at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreConcurrentLinkedDequeManagedConnectionPool.getConnection(SemaphoreConcurrentLinkedDequeManagedConnectionPool.java:570) ~[?:?]
    at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getSimpleConnection(AbstractPool.java:632) ~[?:?]
    at org.jboss.jca.core.connectionmanager.pool.AbstractPool.getConnection(AbstractPool.java:604) ~[?:?]
    at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.getManagedConnection(AbstractConnectionManager.java:624) ~[?:?]
    at org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerImpl.getManagedConnection(TxConnectionManagerImpl.java:440) ~[?:?]
    at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:789) ~[?:?]
    at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:138) ~[?:?]
    at org.jboss.as.connector.subsystems.datasources.WildFlyDataSource.getConnection(WildFlyDataSource.java:64) ~[?:?]
    at ge.app.ws.util.DbManager.getDatabaseConnection(DbManager.java:55) ~[classes:?]
    ... 2 more

我读了很多关于这个错误的博客,但我的观点不同。从博客中我发现了一些问题:

  1. 也许你有连接泄漏。您没有关闭连接
    • Connection我做了什么:我检查了我的代码的每一行,我确信每一行都在 CallableStatement关闭。
  2. 可能池中的所有连接都已在使用中,尝试增加连接池大小,默认为 20
    • 我做了什么:当出现这个问题时,我检查了数据库端的连接,没有活动连接,所有连接都处于非活动状态,池中有 200 个连接,太多了,我最多同时有 30 个活动会话我有 60 秒的时间等待池中的连接空闲。

当我重新启动Wildfly服务器时,问题解决了,但我对为什么会发生这个错误很感兴趣,如果将来会出现这个错误(我认为它们会再次发生)以及如何避免它们?

4

1 回答 1

2

我最近遇到了同样的问题。正如您所提到的,此修复的可能解决方案是处理

  1. 数据源配置
  2. 关闭连接时泄漏。

我尝试通过将最大池大小设置为 20 来更改数据源配置,但是在达到第 21 个请求后我得到了同样的错误。

我在数据源配置中启用了统计信息,并在 jboss 控制台-> 数据源配置中验证了池统计信息,发现连接正在创建但没有关闭。

重新启动后您将不会收到此错误,因为所有这些连接都将被刷新,并且 20 个新连接将随时可用。

因此,我尝试跟踪连接泄漏并添加了以下配置,这些配置将手动关闭数据源连接并在连接泄漏时记录错误https://access.redhat.com/solutions/309913

它解决了我的问题,但这不是永久的解决方案,因此重新检查了代码以查看连接泄漏的位置。然后我更改了代码以正确关闭数据源。

我认为这会起作用,但它没有(初始代码):

   try {
         Connection dbConnect = dataSource.getConnection();
         Statement stmt = dbConnect.createStatement();
         ResultSet rs = stmt.executeQuery("select s from soething");
         stmt.close();
         dbConnect.close();
         return something;
    } catch (SQLException e) {
         LOGGER.log(Level.INFO, e.getMessage());
         return e.getMessage();
    }

这将起作用(具有整齐封闭的数据源的最终代码):

        Statement stmt=null;
        Connection dbConnect=null;
          try {
                dbConnect = dataSource.getConnection();
                stmt = dbConnect.createStatement();
                ResultSet rs = stmt.executeQuery("select s from soething");
                return something;
            } catch (SQLException e) {
                LOGGER.log(Level.INFO, e.getMessage());
                return e.getMessage();
            }finally{
                if (stmt != null) stmt.close();
                if (dbConnect != null) dbConnect.close();
            }
于 2020-08-04T09:34:39.537 回答