при получении соединения, показывающего ошибку закрытого соединения - PullRequest
0 голосов
/ 05 февраля 2019

Я периодически вижу ошибку закрытого соединения, когда я создаю подготовленное заявление, есть ли какая-либо подсказка, в чем здесь проблема?

Ниже показано, как получить соединение и подготовить заявление

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>

pastebin для ConnectionManager https://pastebin.com/aqNKtwaH

1 Ответ

0 голосов
/ 05 февраля 2019

Обратите внимание, что Hikari печатает трассировку стека предупреждений после утечки, когда в пуле нет доступных соединений, поэтому ваш код может просачиваться из другого метода

Существует проблема сВаш код:

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

Если rs или pst равны нулю conn не будет закрыт, и у вас будет утечка

Добавить нольпроверьте перед вызовом close() метод или используйте try с ресурсами

...