2013-03-31 3 views
4

Учитывая следующие Tomcat JDBC настройки подключения:Есть не достаточно простаивающие соединения в Tomcat JDBC пула

<Resource name="jdbc/pc4" 
      maxActive="200" 
      maxIdle="100" 
      minIdle="50" 
      initialSize="50" 
      maxWait="15000" 
      auth="Container" 
      type="javax.sql.DataSource" 
      username="....." 
      password="....." 
      testOnBorrow="true" 
      testWhileIdle="true" 
      validationQuery="select 1" 
      driverClassName="com.mysql.jdbc.Driver" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      url="jdbc:mysql://server_address/db_name?autoReconnect=true&amp;autoReconnectForPools=true&amp;zeroDateTimeBehavior=convertToNull&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;socketTimeout=300000" /> 

И следующие параметры MySQL:

max_connections = 100000 
wait_timeout = 31536000 
interactive_timeout = 31536000 

Я ожидаю, что по крайней мере 50 простаивает соединения в пуле соединений в любое время.

Но на самом деле происходит: есть 50 подключений, когда сервер запускается, через какое-то время все соединения умирают, за исключением последнего.

Ошибка:

Окружающая среда:

  • Linux 3.4 64-разрядный
  • OpenJDK 7
  • Tomcat 7
  • MySQL 5,5

ответ

0

Я не эксперт MySQL, но с использованием Tomcat JDBC с Oracle на некоторое время. Простые соединения сохраняются здесь, пока приложение не закрывается. Я бы проверил журналы подключений в MySQL и включил ведение журнала в Tomcat JDBC, чтобы узнать, кто действительно отключает подключения. Либо один делает.

0

Я не знаю, является ли это причиной вашей проблемы, но когда я использую библиотеку JDBC MySQL, у меня всегда возникает проблема: если соединение открыто в течение длительного времени (более 1 часа), оно случайным образом вызывает сломанную трубу, когда я использую ее снова.

Может быть, бассейн не повторно установить соединение после такой ошибки (ошибка с testWhileIdle?) Вы можете попытаться установить removeAbandoned и removeAbandonedTimeout, со значением, скажем, 30 минут? Я знаю, что это длинный выстрел.

+0

спасибо. Я дам ему попробовать. – 2013-04-01 22:11:59

0

Это проблема с mysql. Как сказал @Djebel, попробуйте очистить неиспользуемое соединение. Один вопрос, начинает ли он работать, если вы перезапускаете службу mysql всякий раз, когда вы получаете эту ошибку? Также убедитесь, что все соединения закрыты при выключении сервера. Вы можете использовать shutdownHook, если Tomcat не сделает это за вас.

+0

Спасибо за ваш вклад. Ошибка ни на MySQL, ни на Tomcat, это происходит автоматически через несколько минут (иногда несколько часов). – 2013-04-01 22:11:36

0

Я изменил конфигурацию, и ситуация улучшилась, теперь в связном пуле уже есть более 25 подключений (все еще не знаю почему).

<Resource name="jdbc/pc4" 
      maxActive="-1" 
      maxIdle="-1" 
      minIdle="20" 
      initialSize="20" 
      maxWait="-1" 
      auth="Container" 
      type="javax.sql.DataSource" 
      username="__" 
      password="__" 
      driverClassName="com.mysql.jdbc.Driver" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      testOnBorrow="true" 
      testWhileIdle="true" 
      testOnReturn="true" 
      timeBetweenEvictionRunsMillis="60000" 
      minEvictableIdleTimeMillis="60000" 
      removeAbandoned="false" 
      validationQuery="SELECT 1;" 
      url="jdbc:mysql://__/__?autoReconnect=true&amp;autoReconnectForPools=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull&amp;socketTimeout=72000000" /> 
Смежные вопросы