【问题标题】:when retrieving connection showing closed connection error检索连接时显示关闭连接错误
【发布时间】:2019-06-29 09:38:08
【问题描述】:

我在创建准备好的语句时间歇性地看到关闭连接错误任何线索这里的问题是什么?

下面是我如何获得连接和preparestatement

ConnectionManager.getConnection();
con.preparestatement(" select * from my_table ");

以下是 HikariCP 的配置:

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    <property name="poolName" value="my-pool" />
    <property name="registerMbeans" value="true" />
    <property name="driverClassName" value="${my.dbDriverClassName}" />
    <property name="jdbcUrl" value="${my.dbConnectionUrl}" />
    <property name="username" value="${my.dbUserName}" />
    <property name="password" value="${my.dbPassword}" />
     <property name="connectionTestQuery" value="SELECT 1 FROM DUAL" />
    <property name="maximumPoolSize" value="100" />
    <property name="minimumIdle" value="10" />
    <property name="leakDetectionThreshold" value="120000" />
    <property name="maxLifetime" value="600000" />
    <property name="idleTimeout" value="60000" />
</bean>

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy- 
  method="close">
    <constructor-arg ref="hikariConfig" />
</bean>

<bean  
 class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"
       c:dataSource-ref="dataSource"  />

<bean  id="jdbcTransactionManager" 
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
       p:dataSource-ref="dataSource"/>
<tx:annotation-driven transaction-manager="jdbcTransactionManager"/>

<bean id="jdbcTemplate"
      class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

ConnectionManager 的pastebin https://pastebin.com/aqNKtwaH

【问题讨论】:

  • 你能显示代码吗?是否有其他错误或泄漏警告?
  • @user7294900 是的,我看到连接泄漏错误
  • 你能添加堆栈跟踪吗?
  • 在 pastebin pastebin.com/UUEfayzJ 我在第 33 行看到错误
  • 你的代码是如何编译的? ResultSet = null;Product=null;?

标签: spring oracle spring-jdbc hikaricp


【解决方案1】:

请注意,当池中没有可用连接时,Hikari 的泄漏警告堆栈跟踪会打印 泄漏发生后,因此您的代码可能会从其他方法泄漏

您的代码有问题:

}finally{
 rs.close();
pst.close();
  con.close();          
}

如果rspst 为空,conn 将不会被关闭,您将有泄漏

在调用close() 方法之前添加空检查或对资源使用try

【讨论】:

  • 我同意对连接使用空检查,但为什么我会在第 33 行看到已关闭的连接?
  • @Ayub 泄漏警告发生 泄漏发生后,因此泄漏可能发生在不同的代码中,但是当池中没有更多可用连接时,泄漏会在第 33 行捕获
  • 嗯好的,谢谢你的线索,会尽力让你知道
  • 为什么会出现间歇性关闭连接错误?一旦第一次抛出关闭连接错误,它不应该使所有请求失败。如果池中没有更多可用连接,如何处理其他请求?
  • 我在关闭前执行了空检查,但这似乎并没有停止关闭连接消息,我没有看到连接泄漏错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2020-06-04
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多