Утечка соединения MySQL не происходит в соответствии с кодом Java

#mysql #jsp #jdbc #jboss7.x

#mysql #jsp #jdbc #jboss7.x

Вопрос:

В MySQL утечка соединения не происходит в соответствии с кодом JSP.

Сервер: JBoss 7
Версия MySQL: 5.7
MySQL-connector-java-5.1.18.jar

Чтобы обеспечить утечку соединения из кода Java, я получаю приведенную ниже ошибку в server.log:

[org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager] (http-/ 0.0.0.0:80-7) IJ000100: закрытие соединения для вас. Пожалуйста, закройте их самостоятельно: org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6@73a1aa : java.lang.Throwable: STACKTRACE

 JSP code:

Statement st = null;
ResultSet rs = null;
Connection conn = null;
DataSource dataSource = null;
try{
        dataSource = (DataSource) new InitialContext().lookup("java:/MySql");
        conn = dataSource.getConnection();
        st = conn.createStatement();
        rs=st.executeQuery("select * from test.users");
    } catch (Exception e) {
    }
  
 standalone.xml code

<datasource jta="true" jndi-name="java:/MySql" pool-name="MySql" enabled="true" use-java-context="true" use-ccm="true">
    <connection-url>jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNullamp;amp;useOldAliasMetadataBehavior=trueamp;amp;autoReconnect=true</connection-url>
    <driver>com.mysql</driver>
    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
    <pool>
        <min-pool-size>5</min-pool-size>
        <max-pool-size>100</max-pool-size>
        <prefill>true</prefill>
        <use-strict-min>false</use-strict-min>
        <flush-strategy>FailingConnectionOnly</flush-strategy>
    </pool>
    <security>
        <user-name>web</user-name>
        <password>123</password>
    </security>
    <timeout>
        <idle-timeout-minutes>5</idle-timeout-minutes>
    </timeout>
    <statement>
        <prepared-statement-cache-size>32</prepared-statement-cache-size>
        <share-prepared-statements>true</share-prepared-statements>
    </statement>
</datasource>            
  

Я обращался к вышеупомянутой странице JSP 50 раз, и в списке процессов MySQL должно быть 50 спящих соединений. Но этого не происходит. Ниже приведены результаты:

Я выполнил приведенный ниже запрос в браузере запросов MySQL, чтобы определить утечку соединения:

выберите идентификатор, хост, команду, время, информацию из INFORMATION_SCHEMA.processlist, где user = ‘web’;

Фактический результат: он показывает только 7 спящих подключений

Ожидаемый результат: должно быть 50 спящих соединений

Пожалуйста, помогите мне понять поведение и исправить его, если я ошибаюсь.

Заранее спасибо

Комментарии:

1. Ваш код JSP не закрывает соединение, когда оно выполнено. И действительно, вы должны делать подобные вещи в коде JSP. И зарегистрированное предупреждение означает, что пул соединений закрыл его для вас. Ваш пул соединений делает это, чтобы предотвратить утечку соединения из пула. Но, учитывая, что восстановление происходит медленнее (или в некоторых случаях: непреднамеренно), лучше, если вы сделаете это самостоятельно. Исправьте свой код, узнайте о try-with-resources.

2. Большое спасибо, Марк. Как вы сказали, если я включу <cached-connection-manager debug=»true»>, соединение jdbc будет автоматически закрыто с помощью пула соединений. Если я не включаю, происходит утечка соединения. Обычно я буду использовать try с ресурсами. Но я хочу изучить, как происходит утечка соединения. Спасибо за ваше время.

3. Соединение протекает, потому что вы его не закрываете. Закрытие — это то, что возвращает его в пул соединений. А использование try-with-resources упрощает закрытие, потому что для этого вам нужно меньше шаблонов.