Каков наилучший выбор для библиотеки пулов соединений с базой данных?(проблема c3p0) - PullRequest
6 голосов
/ 22 ноября 2010

У меня сильно загружено Java-приложение, использующее hirbernate.И я использовал в качестве пула соединений DBCP, но у него были проблемы с потерей соединения.Чем я перешел на c3p0.Но теперь это иногда блокирует поток, и я не знаю почему.Как здесь:

"1343694829@qtp-515693101-1941" prio=10 tid=0x00007fa6b0940000 nid=0x4e12 runnable [0x00007fa6f8f1c000]
   java.lang.Thread.State: RUNNABLE
    at com.mchange.v2.resourcepool.BasicResourcePool.doCheckinManaged(BasicResourcePool.java:1258)
    at com.mchange.v2.resourcepool.BasicResourcePool.checkinResource(BasicResourcePool.java:647)
    - locked <0x00007fa7286d9728> (a com.mchange.v2.resourcepool.BasicResourcePool)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$ConnectionEventListenerImpl.doCheckinResource(C3P0PooledConnectionPool.java:636)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$ConnectionEventListenerImpl.connectionClosed(C3P0PooledConnectionPool.java:630)
    at com.mchange.v2.c3p0.util.ConnectionEventSupport.fireConnectionClosed(ConnectionEventSupport.java:55)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.fireConnectionClosed(NewPooledConnection.java:510)
    at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:381)
    at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:1246)
    - locked <0x00007fa794ccf020> (a com.mchange.v2.c3p0.impl.NewProxyConnection)
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.closeConnection(LocalDataSourceConnectionProvider.java:96)
    at org.hibernate.jdbc.ConnectionManager.closeConnection(ConnectionManager.java:474)
    at org.hibernate.jdbc.ConnectionManager.cleanup(ConnectionManager.java:408)
    at org.hibernate.jdbc.ConnectionManager.close(ConnectionManager.java:347)
    at org.hibernate.impl.SessionImpl.close(SessionImpl.java:325)
    at org.springframework.orm.hibernate3.SessionFactoryUtils.closeSession(SessionFactoryUtils.java:791)
    at org.springframework.orm.hibernate3.SessionFactoryUtils.closeSessionOrRegisterDeferredClose(SessionFactoryUtils.java:777)
    at org.springframework.orm.hibernate3.SessionFactoryUtils.releaseSession(SessionFactoryUtils.java:755)

'Мой дамп стека показал, что этот поток заблокировал все мои другие потоки с блокировкой <0x00007fa7286d9728>, поэтому через некоторое время сервер был полностью заблокирован.Я не уверен, как долго этот поток работает, если один поток блокировал все другие потоки в течение долгого времени, или если только время, потраченное этим потоком, было чрезвычайно долгим, но в результате моя система была полностью заблокирована и крайне замедлена.Я много гуглил, но не знаю, как решить эту проблему.Мне нужен бассейн, чтобы закрыть соединение и закончить протектор как можно скорее.Должен ли я использовать какой-то другой пул соединений?Для меня абсолютно необходимо, чтобы эта библиотека пула сохранялась на 100%, без блокировок, жизненных блокировок, голодания, даже если она немного медленнее других библиотек.

спасибо за любую помощь

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Возможно, вы захотите взглянуть на BoneCP - http://jolbox.com.

Гораздо лучшая производительность, чем C3P0 / DBCP, и пока нет сообщений о каких-либо тупиках.

1 голос
/ 22 ноября 2010

1) Что вы имеете в виду, когда говорите о потере соединения в DBCP? Вы используете MySQL? Я знаю проблему с потерей соединения при работе с MySQL, если в течение некоторого времени не было никаких действий Это твой случай?

2) Использование Hibernate в высоконагруженных приложениях не очень хороший выбор. Hibernate слишком объемный и медленный, особенно для сложных данных и отношений (например, для каждой сессии требуется транзакция, даже если мы просто хотим получить данные)

3) Может быть, причина в том, что слишком много нужных потоков и недостаточно потоков в пуле?

Я участвовал в высоконагруженном проекте. Мы используем Hibernate для мягких данных (множество запросов состояло из нескольких записей, у которых было не очень сложное отображение) и самозаписывающейся оболочки через JDBC для тяжелых данных (не очень много запросов тысяч записей через SP с жестким ручным отображением). И у нас не было никаких проблем с DBCP, кроме потери соединения с базами данных MySQL после долгого времени бездействия.

...