Пул подключений Hibernate

У меня есть приложение Java с Hibernate. Я просто реализую это c3p0. Aperentemente все работает сначала (как только я перезагружаю сервер Tomcat на нашем хосте). Но вскоре после нескольких обращений клиентов, это не создает больше сеансов для взаимодействия с нашим BD MySQL. Может ли кто-нибудь помочь мне в этом? Буду благодарен

следующие коды:

hibernate.cfg.xml:

<property name="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.min_size">7</property>
<property name="hibernate.c3p0.max_size">53</property>
<property name="hibernate.c3p0.timeout">100</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">1000</property>
<property name="hibernate.c3p0.validate">true</property>

HibernateUtil.java:

public final class HibernateUtil{  
     private static SessionFactory sessionFactory;  
        public static SessionFactory getSessionFactory()  throws MappingException  
        {  
            if(sessionFactory == null) {
                //sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
                sessionFactory = new Configuration().configure().buildSessionFactory();
            }  
            return sessionFactory;  
        } 

        public static Session openSession()  
        {  
            return getSessionFactory().openSession();  
        }  

}

CidadesDao.java:

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.Transformers;
import org.hibernate.type.StandardBasicTypes;
import ConnectionHibernate.ConnectionHibernate;
import ConnectionHibernate.HibernateUtil;
import br.com.cuponero.bean.Cidades;

public class CidadesDao {
    private static final String TABLE = "Cidades";
    Session session;

    public CidadesDao() {
        this.session = HibernateUtil.getSessionFactory().openSession();
        this.session.beginTransaction();
    }

    /**
     * Select todos
     * @return 
     **/
    public List<Cidades> getTodos(){
          List<Cidades> lCit = null;

          try{
             Query q = session.createSQLQuery("SELECT * FROM "+TABLE)
                     .addScalar("id", StandardBasicTypes.BIG_INTEGER)
                     .addScalar("nome", StandardBasicTypes.STRING)
                     .addScalar("ddd", StandardBasicTypes.STRING)
                     .addScalar("estaoId", StandardBasicTypes.INTEGER)
                     .addScalar("ativo", StandardBasicTypes.INTEGER)

                     .setResultTransformer(Transformers.aliasToBean(Cidades.class));
             //System.out.println("list 0: "+q.list().get(0));

             lCit = q.list();
             //tx.commit();

          }catch (HibernateException e) {
             if (session!=null) session.beginTransaction().rollback();
             e.printStackTrace(); 
          }finally{
              //closeMyConnection();
              //mySessionClose();

              session.beginTransaction().commit();
          }

          return lCit;
    }

...

следуя LOG это веб-сервис:

27 марта 2016 г. 16:30:32 com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask run ADVERTÊNCIA: com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@172ea03 - Ошибка получения запроса!!! Очистка в ожидании приобретений. При попытке получить необходимый новый ресурс нам не удалось достичь большего, чем максимальное количество разрешенных попыток приобретения (30). Исключение при последней попытке получения: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: пользователь cupone_plinhares уже имеет более активных подключений 'max_user_connections' на sun.reflect.GeneratedConstructorAccessor28.newInstance(неизвестный источник) делегат-делегат (на неизвестном уровне).java:45) в java.lang.reflect.Constructor.newInstance(Constructor.java:422) в com.mysql.jdbc.Util.handleNewInstance(Util.java:404) в com.mysql.jdbc.Util.getInstance(Util.java:387) в com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941) в com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870) в com.mysql.jetb.MD (MysqlIO.doHandshake(MysqlIO.java:1207) в com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2254) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2285) в com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2084) в com.mysql.jdbc.ConnectionImpl.jj: Соединение (7). в com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:44) в sun.reflect.GeneratedConstructorAccessor23.newInstance(неизвестный источник) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAjlan.jpg):ccess.jpg Constructor.newInstance (Constructor.java:422) в com.mysql.jdbc.Util.handleNewInstance(Util.java:404) в com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:400) в com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:327) по адресу com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:146) по адресу com.mchange.v2.c3p0.WrapperConnectionPoolDooction_Player com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:184) на com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:ques.resource.ol.resource.ol.resource.ol.resource.co.resource.ol.resource.resource.ol.resource.resource.ol.resource.resource.ol). по адресу com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073) по адресу com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePools. ScatteredAcquireTask.run(BasicResourcePool.java:1810) на com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:648)

27 марта 2016 г. 16:30:32 com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask run ADVERTÊNCIA: com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@3ba80 - Ошибка получения сообщения!!! Очистка в ожидании приобретений. При попытке получить необходимый новый ресурс нам не удалось достичь большего, чем максимальное количество разрешенных попыток приобретения (30). Исключение при последней попытке получения: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: пользователь cupone_plinhares уже имеет более активных подключений 'max_user_connections' на sun.reflect.GeneratedConstructorAccessor28.newInstance(неизвестный источник) делегат-делегат (на неизвестном уровне).java:45) в java.lang.reflect.Constructor.newInstance(Constructor.java:422) в com.mysql.jdbc.Util.handleNewInstance(Util.java:404) в com.mysql.jdbc.Util.getInstance(Util.java:387) в com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941) в com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870) в com.mysql.jetb.MD (MysqlIO.doHandshake(MysqlIO.java:1207) в com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2254) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2285) в com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2084) в com.mysql.jdbc.ConnectionImpl.jj: Соединение (7). в com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:44) в sun.reflect.GeneratedConstructorAccessor23.newInstance(неизвестный источник) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAjlan.jpg):ccess.jpg Constructor.newInstance (Constructor.java:422) в com.mysql.jdbc.Util.handleNewInstance(Util.java:404) в com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:400) в com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:327) по адресу com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:146) по адресу com.mchange.v2.c3p0.WrapperConnectionPoolDooction_Player com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:184) на com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:ques.resource.ol.resource.ol.resource.ol.resource.co.resource.ol.resource.resource.ol.resource.resource.ol.resource.resource.ol). по адресу com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073) по адресу com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePools. ScatteredAcquireTask.run(BasicResourcePool.java:1810) на com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:648)

27 марта 2016 г. 16:30:32 вечера com.mchange.v2.resourcepool.BasicResourcePool forceKillAcquires ADVERTÊNCIA: не удалось получить ресурс, com.mchange.v2.resourcepool.BasicResourcePool@16df536 прерывает все потоки, ожидающие проверки ресурса из. Повторим попытку в ответ на новые запросы клиентов. 27 марта 2016 г. 16:30:32 вечера com.mchange.v2.resourcepool.BasicResourcePool forceKillAcquires ADVERTÊNCIA: не удалось получить ресурс, com.mchange.v2.resourcepool.BasicResourcePool@16df536 прерывает все потоки, ожидающие проверки ресурса из. Повторим попытку в ответ на новые запросы клиентов. 27 марта 2016 г. 16:30:32 вечера org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ПРЕДУПРЕЖДЕНИЕ: ошибка SQL: 0, SQLState: ноль 27 марта 2016 г. 16:30:32 org.hibernate.engine.jdbc. spi.SqlExceptionHelper logExceptions ОШИБКА: Не удалось получить соединения из базовой базы данных! 27 марта 2016 г. 16:30:32 com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask run ADVERTÊNCIA: com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@2386af - Ошибка получения сообщения!!! Очистка в ожидании приобретений. При попытке получить необходимый новый ресурс нам не удалось достичь большего, чем максимальное количество разрешенных попыток приобретения (30). Исключение при последней попытке получения: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: пользователь cupone_plinhares уже имеет более активных подключений 'max_user_connections' на sun.reflect.GeneratedConstructorAccessor28.newInstance(неизвестный источник) делегат-делегат (на неизвестном уровне).java:45) в java.lang.reflect.Constructor.newInstance(Constructor.java:422) в com.mysql.jdbc.Util.handleNewInstance(Util.java:404) в com.mysql.jdbc.Util.getInstance(Util.java:387) в com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941) в com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870) в com.mysql.jetb.MD (MysqlIO.doHandshake(MysqlIO.java:1207) в com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2254) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2285) в com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2084) в com.mysql.jdbc.ConnectionImpl.jj: Соединение (7). в com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:44) в sun.reflect.GeneratedConstructorAccessor23.newInstance(неизвестный источник) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAjlan.jpg):ccess.jpg Constructor.newInstance (Constructor.java:422) в com.mysql.jdbc.Util.handleNewInstance(Util.java:404) в com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:400) в com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:327) по адресу com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:146) по адресу com.mchange.v2.c3p0.WrapperConnectionPoolDooction_Player com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:184) на com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:ques.resource.ol.resource.ol.resource.ol.resource.co.resource.ol.resource.resource.ol.resource.resource.ol.resource.resource.ol). по адресу com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073) по адресу com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePools. ScatteredAcquireTask.run(BasicResourcePool.java:1810) на com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:648)

Для лучшей помощи, после входа в Android Studio моего приложения, когда я пытаюсь подключить эту веб-службу UP:

org.hibernate.exception.internal.StandardSQLExceptionConverter.convert (StandardSQLExceptionConverter.java:47) org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert (SqlExceptionHelper.java:109) org.hiberb.pl.convert(SqlExceptionHelper.java:95) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:90) org.hibernate.resource.jdbc.internalIm.jpg hibernate.resource.jdbc.internal. internal.JdbcResourceLocalTransactionCoordinatorImpl $ TransactionDriverControlImpl.begin (JdbcResourceLocalTransactionCoordinatorImpl.java:213) org.hibernate.engi ne.transaction.internal.TransactionImpl.begin (TransactionImpl.java:52) org.hibernate.internal.SessionImpl.beginTransaction (SessionImpl.java:1454) br.com.cuponero.dao.CidadesDao. (CidadesDao.java: 31) br.com.cuponero.actionsDaServlet.CidadesActionDaServlet.getJsonRegiao (CidadesActionDaServlet.java:35) br.com.cuponero.servlet.CidadesServlet.doPost (CidadesServlet.java:69) портовый сервлет (сервлет). Java:650) javax.servlet.http.HttpServlet.service(HttpServlet.java:731) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

первопричина java.sql.SQLException: Соединения не могут быть получены из базовой базы данных! com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118) com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:68imp.getConnection(AbstractPoolBackedDataSource.java:140) org.hibernate.c3p0.internal.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:73) org.hibernate.internal.AbstractSessionImpl.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:87) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:112) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement(LogicalConnectionManagedImpl. Java:230) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:237) org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:21nate) org.h.

видите, что в этой строке журнала она говорит, что проблема здесь: br.com.cuponero.dao.CidadesDao. & lt; init & gt; (CidadesDao.java:31) эта строка имеет следующий код:

this.session.beginTransaction ();

1 ответ

Так что это прямо из ваших следов стека:

Пользователь cupone_plinhares уже имеет более активных подключений 'max_user_connections'

Очевидная вещь, чтобы попытаться увеличить max_user_connection для пользователя cupone_plinhares,

Прежде чем посмотреть на ваши следы стека, я подумал, что проблема будет в утечке соединения. Ваш DAO создает сеанс гибернации как переменную-член в своем конструкторе, и ничто, похоже, не закрывает его. Кроме того, ваше управление транзакциями выглядит ненадежным.

Лучшей идеей было бы НЕ иметь session как переменная-член вообще, но иметь что-то вроде

Session session = null;
Transaction txn = null;
try {
  session = HibernateUtil.getSessionFactory().openSession();
  txn = session.beginTransaction();

  //do important stuff here

  txn.commit()
} catch ( Exception e ) {
  try { if (txn != null) txn.rollback() }
  catch (HibernateException he) { 
    he.printStackTrace(); 
    e.addSuppressed( he );
    throw e;
  }
} finally {
  try { if (session != null) session.close() }
  catch (SQLException sqle) { sqle.printStackTrace(); }
}

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

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

Другие вопросы по тегам