Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “如何修复”;在配置的阻塞超时(60000[ms])内没有可用的托管连接;_Java_Ojdbc_Wildfly 15 - Fatal编程技术网

Java “如何修复”;在配置的阻塞超时(60000[ms])内没有可用的托管连接;

Java “如何修复”;在配置的阻塞超时(60000[ms])内没有可用的托管连接;,java,ojdbc,wildfly-15,Java,Ojdbc,Wildfly 15,我已经在wildfly-15.0.1.FINAl服务器上部署了java应用程序。我正在使用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-ur

我已经在
wildfly-15.0.1.FINAl
服务器上部署了
java
应用程序。我正在使用
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>
我读了很多关于这个错误的博客,但我的观点不同。 从博客中我发现了一些问题:

  • 也许你有连接泄漏。您没有关闭连接
    • 我所做的:我检查了代码的每一行,我确信每一行
      连接
      可调用语句
      正在关闭
  • 可能池中的所有连接都已在使用中,请尝试增大连接池大小(默认值为20)
    • 我所做的:当出现此问题时,我检查了数据库端的连接,但没有活动连接,所有连接都处于非活动状态,而且池中有200个连接,数量如此之多,我最多同时有30个活动会话,我有60秒的时间等待,直到池中的连接空闲

  • 当我重新启动我的
    Wildfly
    服务器时,问题解决了,但我感兴趣的是为什么会发生这种错误,将来是否会发生这种错误(我认为它们还会再次发生)以及如何避免它们?

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

  • 数据源配置
  • 关闭连接时发生泄漏
  • 我尝试通过将最大池大小设置为20来更改数据源配置, 但我在满足第21个请求后也犯了同样的错误

    我在datasource配置中启用了stats,并在jboss console->datasource配置中验证了池统计信息,发现正在创建连接,但没有关闭连接

    重新启动后不会出现此错误,因为所有这些连接都将被刷新,20个新连接将随时可用

    因此,我尝试跟踪连接泄漏,并在下面添加了这些配置,这些配置将手动关闭数据源连接,并在出现连接泄漏时记录错误。

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

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

    这将起作用(使用整洁封闭的数据源的最终代码):

    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
    
       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();
                }