Hibernate SessionFactory.openSession () ждет, пока соединение с базой данных не будет доступно из пула - PullRequest
5 голосов
/ 05 июля 2019

Ожидает ли hibernate SessionFactory.openSession() ожидания подключения к базе данных из пула?

Я предположил, что это так, но у меня есть клиент с этим исключением

org.hibernate.exception.GenericJDBCException: Could not open connection
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:235)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:171)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:162)
    at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1471)
    at com.jthink.songlayer.hibernate.HibernateUtil.beginTransaction(HibernateUtil.java:192)
    at com.jthink.songkong.analyse.analyser.MusicBrainzSongMatcher.call(MusicBrainzSongMatcher.java:83)
    at com.jthink.songkong.analyse.analyser.MusicBrainzSongMatcher.call(MusicBrainzSongMatcher.java:35)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at com.jthink.songkong.analyse.analyser.MainAnalyserService$EnsureIncreaseCountIfRunOnCallingThread.rejectedExecution(MainAnalyserService.java:100)
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
    at com.jthink.songkong.analyse.analyser.MainAnalyserService.submit(MainAnalyserService.java:121)
    at com.jthink.songkong.analyse.analyser.MusicBrainzMetadataMatcher.processMetadataFailedToMatch(MusicBrainzMetadataMatcher.java:107)
    at com.jthink.songkong.analyse.analyser.MusicBrainzMetadataMatcher.call(MusicBrainzMetadataMatcher.java:381)
    at com.jthink.songkong.analyse.analyser.MusicBrainzMetadataMatcher.call(MusicBrainzMetadataMatcher.java:34)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database!
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:689)
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)
    at org.hibernate.c3p0.internal.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:90)
    at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:380)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:228)
    ... 20 more
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1418)
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:606)
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:526)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:755)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:682)

заставляет меня думать, что это не так, или это ждет определенное время, а затем сдаваться, я использую Hibernate 4.3.11 с C3p0 и H2 1,5

Моя конфигурация Hibernate

    config.setProperty("hibernate.c3p0.min_size","1");
    config.setProperty("hibernate.c3p0.max_size","50");
    config.setProperty("hibernate.c3p0.max_statements","3000");
    config.setProperty("hibernate.c3p0.timeout","2000");
    config.setProperty("hibernate.c3p0.maxStatementsPerConnection","50");
    config.setProperty("hibernate.c3p0.idle_test_period","3000");
    config.setProperty("hibernate.c3p0.acquireRetryAttempts","10");

Ответы [ 2 ]

2 голосов
/ 13 июля 2019

Hibernate SessionFactory Метод openSession () всегда открывает новый сеанс.Вы должны закрыть этот объект сеанса, как только закончите со всеми операциями базы данных.Объекты сессий не являются поточно-ориентированными, вы должны открывать новый сеанс для каждого запроса в многопоточной среде

на основе этой ссылки https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/SessionFactory.html#openSession()

Сеанс openSession () вызывает HibernateException OpenСессия.Соединения JDBC будут получены из сконфигурированного ConnectionProvider по мере необходимости для выполнения запрошенной работы.

Возвраты: Созданный сеанс. Броски: HibernateException - Указывает на проблему, открывающую сеанс; довольно редко здесь.

также вы можете проверить эти ссылки для решения проблемы:

ResourcePool не удалось получить ресурс из его первичной фабрики или источника

com.mchange.v2.resourcepool.CannotAcquireResourceException: ResourcePool не удалось получить ресурс из своей первичной фабрики или источника

0 голосов
/ 08 июля 2019

Краткий ответ: Нет. OpenSession () не нужно ждать, пока будет доступно физическое соединение. Это не является частью метода контракта.

В документации по спящему режиму (v 5.1) говорится, что

JDBC-соединение (-ы) будут получены от настроенного ConnectionProvider по мере необходимости для выполнения запрошенной работы.

Ключевое слово здесь "необходимо". На самом деле физическое соединение не требуется, пока вы не начнете транзакцию или не выполните свой первый выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...