2015-12-22 3 views
2

Я использую смоляной сервер + весенний каркас и пул соединений c3p0. Я настроил пул соединений со следующим файлом свойств. Но как-то каждые 24 часа или около того мой сайт сталкивается с ошибками тайм-аута соединения, а затем мне нужно перезагрузить мой сервер смонтирования, чтобы снова вернуться к веб-сайту. Скажите, пожалуйста, что случилось в следующем файле конфигурации и что здесь отсутствует.Пул соединений C3P0 дает ошибку таймаута соединения с этой конфигурацией

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.databaseURL=jdbc:mysql://localhost/my_database1_url 
jdbc.StockDatabaseURL=jdbc:mysql://localhost/my_database2_url 
jdbc.username=my_username 
jdbc.password=my_password 
jdbc.acquireIncrement=10 
jdbc.minPoolSize=20 
jdbc.maxPoolSize=30 
jdbc.maxStockPoolSize=30 
jdbc.maxStatements=100 
jdbc.numOfHelperThreads=6 
jdbc.testConnectionOnCheckout=true 
jdbc.testConnectionOnCheckin=true 
jdbc.idleConnectionTestPeriod=30 
jdbc.prefferedTestQuery=select curdate(); 
jdbc.maxIdleTime=7200 
jdbc.maxIdleTimeExcessConnections=5 
+0

Одной из причин таймаута соединения может быть то, что все соединения исчерпаны. Согласитесь ли вы, если я скажу, что могут быть утечки связи в вашем приложении? Если да, попробуйте определить и исправить их. Идентификацию утечек можно легко выполнить с помощью пула c3p0. – Yasin

+0

Да. Есть утечки соединений, но я не вижу, как это вызывает ошибки таймаута. – user2522497

+0

У меня была аналогичная проблема, но с другим сервером базы данных. 'http: // stackoverflow.com/questions/26864383/mysql-hibernate-connection-issue-while-using-c3p0'. Попробуйте включить журналы для c3p0 и проверьте, что происходит. –

ответ

3

Итак, куча вещей.

  • c3p0 имеет встроенные средства для наблюдения и отладки для утечек соединения. Задайте параметры конфигурации unusedConnectionTimeout unreturnedConnectionTimeout и debugUnreturnedConnectionStackTraces. Установите unreturnedConnectionTimeout, который определяет период времени, после которого c3p0 должен предполагать, что соединение просочилось, и закройте его. Установите debugUnreturnedConnectionStackTraces, чтобы попросить c3p0 зарегистрировать трассировку стека, которая проверила соединение, которое не было правильно проверено. См. Configuring to Debug and Workaround Broken Client Applications.
  • Вы настраиваете c3p0 нестандартным способом. Это может быть хорошо или нет, но вы хотите проверить, что конфигурация, которую вы собираетесь установить, - это конфиг c3p0. c3p0 DataSources выгружают свою конфигурацию в INFO при инициализации пула. Обратите внимание, что убедитесь, что вы получаете конфигурацию, которую собираетесь использовать. В качестве альтернативы вы можете проверить конфигурацию времени выполнения DataSource через JMX.
  • Помимо нестандартных средств конфигурации, некоторые из ваших свойств конфигурации кажутся неправильными. prefferedTestQuery должно быть preferredTestQuery. numOfHelperThreads должно быть numHelperThreads.
  • Ниже перечислены не все имена конфигурации c3p0. Возможно, вы внутренне сопоставляете их с конфигурацией c3p0, но вы хотите проверить это. Вот не-c3p0-property-names:

    jdbc.driverClassName=com.mysql.jdbc.Driver 
    jdbc.databaseURL=jdbc:mysql://localhost/my_database1_url 
    jdbc.StockDatabaseURL=jdbc:mysql://localhost/my_database2_url 
    jdbc.username=my_username 
    jdbc.maxStockPoolSize=30 
    

    В стандартном c3p0.свойства образуют то, что вы, вероятно, имеете в виду

    c3p0.driverClass=com.mysql.jdbc.Driver 
    c3p0.jdbcURL=jdbc:mysql://localhost/my_database1_url 
    # no equivalent -- jdbc.StockDatabaseURL=jdbc:mysql://localhost/my_database2_url 
    c3p0.user=my_username 
    # no equivalent -- jdbc.maxStockPoolSize=30 
    

    Пожалуйста, см Configuration Properties. Опять же, c3p0 ничего не знает о jdbc. -предоставляемых свойствах, но, возможно, что-то в ваших собственных библиотеках или промежуточном программном обеспечении выбирает их.

Примечание: Я люблю видеть @ пути NiSay о проверке на герметичность подключения, потому что я люблю видеть людей, используя более продвинутые C3P0 API. Он будет работать, пока вы не будете обновлять конфигурацию вашего DataSource. Но вам не нужно так много беспокоиться, и нет гарантии, что этот подход будет продолжать работать в будущих версиях. C3p0 не дает никаких обещаний о жизненных циклах ConnectionCustomizer. ConnectionCustomizers предназначены для апатридов. Легче и безопаснее использовать встроенную систему проверки утечки c3p0, описанную в первой брошюре выше.

+0

Да Стив им внутренне отображает их в правильные значения в файле web.xml. Имена, указанные в файле свойств jdbc, являются просто переменными, вызываемыми в файле web.xml. И я это подтвердил. preferredTestQuery и numHelperThreads верны в файле web.xml. – user2522497

+0

Спасибо Стив. Я добавил unusedConnectionTimeout и debugUnreturnedConnectionStackTraces, как вы предлагали. И теперь мой сайт не упал с 4 дней. Но я не знаю, как долго это будет держать мой сайт, не отбрасывая. Скажите, пожалуйста, если для меня возникли проблемы с утечкой данных? и как решить утечку соединения. – user2522497

+0

@Steve Waldman +1 для первой точки. – Yasin

1

Как могло быть возможность утечки соединения в программе (вероятной причиной соединения тайм-аута), необходимо выполнить следующие шаги для выявления утечек.

сделать как запись в вашем c3p0.properties файл

c3p0.connectionCustomizerClassName = some.package.ConnectionLeakDetector 

Создайте класс с именем «ConnectionLeakDetector» и поместите его в соответствующем пакете. Ниже приведен контент этого класса.

import java.sql.Connection; 
import java.util.concurrent.atomic.AtomicInteger; 

public class ConnectionLeakDetector implements com.mchange.v2.c3p0.ConnectionCustomizer { 

    static AtomicInteger connectionCount = new AtomicInteger(0); 
    @Override 
    public void onAcquire(Connection c, String parentDataSourceIdentityToken) 
      throws Exception { 

    } 

    @Override 
    public void onDestroy(Connection c, String parentDataSourceIdentityToken) 
      throws Exception { 
    } 

    @Override 
    public void onCheckOut(Connection c, String parentDataSourceIdentityToken) 
      throws Exception { 
     System.out.println("Connections acquired: " + connectionCount.decrementAndGet()); 
    } 

    @Override 
    public void onCheckIn(Connection c, String parentDataSourceIdentityToken) 
      throws Exception { 
     System.out.println("Connections released: " + connectionCount.incrementAndGet()); 
    } 

} 

Метод onCheckOut будет увеличивать количество, когда соединение приобретается, где, как onCheckOut будет уменьшать его, когда соединение высвобождается.

Выполнение некоторых сценариев и просмотр статистики на вашей консоли. Если счетчик больше 0, тогда выполненный сценарий имеет утечку соединения. Попытайтесь исправить их, и вы заметите разницу.

В качестве побочного примечания вы можете увеличить размер jdbc.maxPoolSize в качестве временного решения до тех пор, пока не будет установлено исправление.

+0

Хорошо, я попробую это решение и отправлю свой ответ в ближайшее время. Спасибо – user2522497