2016-03-27 3 views
0

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

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

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 4:30:32 PM com.mchange.v2.resourcepool.BasicResourcePool $ ScatteredAcquireTask запустить ADVERTÊNCIA: com[email protected]172ea03 - Ошибка при попытке приобретения !!! Очистка ожидающих приобретений. При попытке получить необходимый новый ресурс нам не удалось добиться большего, чем максимальное количество разрешенных попыток приобретения (30). Последнее приобретение попытка исключения: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: cupone_plinhares пользователя уже более активных соединений 'max_user_connections' на sun.reflect.GeneratedConstructorAccessor28.newInstance (Unknown Source) в sun.reflect.DelegatingConstructorAccessorImpl. newInstance (DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance (Constructor.java:422) at com.mysql.jdbc.Util.handleNewInstance (Util.java:404) at 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.jdbc.MysqlIO.checkErrorPacket (My sqlIO.java:3806) на com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:871) на com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication (MysqlIO.java:1686) в com.mysql.jdbc. MysqlIO.doHandshake (MysqlIO.java:1207) в com.mysql.jdbc.ConnectionImpl.coreConnect (ConnectionImpl.java:2254) в com.mysql.jdbc.ConnectionImpl.connectOneTryOnly (ConnectionImpl.java:2285) на ком. mysql.jdbc.ConnectionImpl.createNewIO (ConnectionImpl.java:2084) на com.mysql.jdbc.ConnectionImpl. (ConnectionImpl.java:795) на com.mysql.jdbc.JDBC4Connection. (JDBC4Connection.java:44) на sun.reflect.GeneratedConstructorAccessor23.newInstance (Неизвестный источник) at sun.reflect.DelegatingConstruct orAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) в java.lang.reflect.Constructor.newInstance (Constructor.java:422) в com.mysql.jdbc.Util.handleNewInstance (Util.java:404) на ком. mysql.jdbc.ConnectionImpl.getInstance (ConnectionImpl.java:400) at com.mysql.jdbc.NonRegisteringDriver.connect (NonRegisteringDriver.java:327) at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection (DriverManagerDataSource.java: 146) at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection (WrapperConnectionPoolDataSource.java:195) на com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection (WrapperConnectionPoolDataSource.java:184) в com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool $ 1 PooledConnectionResourcePoolManager.acquireResource (C3P0PooledConnectionPool.java:200) на com.mchange.v2.resourcepool.BasicResourcePool.doAcquire (BasicResourcePool.java:1086) в com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess (BasicResourcePool.java:1073) на com.mchange.v2.resourcepool.BasicResourcePool.access $ 800 (BasicResourcePool.java:44) на com.mchange.v2.resourcepool.BasicResourcePool $ ScatteredAcquireTask.run (BasicResourcePool.java:1810) на com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run (ThreadPoolAsynchronousRunner.java:648)

27 мар 2016 г. 4:30:32 PM com.mchange.v2.resourcepool.BasicResourcePool $ ScatteredAcquireTask запустить ADVERTÊNCIA : com[email protected]3ba80 - Ошибка при сборе данных !!! Очистка ожидающих приобретений. При попытке получить необходимый новый ресурс нам не удалось добиться большего, чем максимальное количество разрешенных попыток приобретения (30). Последнее приобретение попытка исключения: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: cupone_plinhares пользователя уже более активных соединений 'max_user_connections' на sun.reflect.GeneratedConstructorAccessor28.newInstance (Unknown Source) в sun.reflect.DelegatingConstructorAccessorImpl. newInstance (DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance (Constructor.java:422) at com.mysql.jdbc.Util.handleNewInstance (Util.java:404) at 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.jdbc.MysqlIO.checkErrorPacket (My sqlIO.java:3806) на com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:871) на com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication (MysqlIO.java:1686) в com.mysql.jdbc. MysqlIO.doHandshake (MysqlIO.java:1207) в com.mysql.jdbc.ConnectionImpl.coreConnect (ConnectionImpl.java:2254) в com.mysql.jdbc.ConnectionImpl.connectOneTryOnly (ConnectionImpl.java:2285) на ком. mysql.jdbc.ConnectionImpl.createNewIO (ConnectionImpl.java:2084) на com.mysql.jdbc.ConnectionImpl. (ConnectionImpl.java:795) на com.mysql.jdbc.JDBC4Connection. (JDBC4Connection.java:44) на sun.reflect.GeneratedConstructorAccessor23.newInstance (Неизвестный источник) at sun.reflect.DelegatingConstruct orAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) в java.lang.reflect.Constructor.newInstance (Constructor.java:422) в com.mysql.jdbc.Util.handleNewInstance (Util.java:404) на ком. mysql.jdbc.ConnectionImpl.getInstance (ConnectionImpl.java:400) at com.mysql.jdbc.NonRegisteringDriver.connect (NonRegisteringDriver.java:327) at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection (DriverManagerDataSource.java: 146) на com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection (WrapperConnectionPoolDataSource.java:195) в com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection (WrapperConnectionPoolDataSource.java:184) в com.mchange.v2. c3p0.impl.C3P0PooledConnectionPool $ 1PooledConnec tionResourcePoolManager.acquireResource (C3P0PooledConnectionPool.java:200) на com.mchange.v2.resourcepool.BasicResourcePool.doAcquire (BasicResourcePool.java:1086) в com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess (BasicResourcePool.java: 1073) at com.mchange.v2.resourcepool.BasicResourcePool.access $ 800 (BasicResourcePool.java:44) at com.mchange.v2.resourcepool.BasicResourcePool $ ScatteredAcquireTask.run (BasicResourcePool.java:1810) at com .mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.run (ThreadPoolAsynchronousRunner.java:648)

27 марта 2016 4:30:32 PM com.mchange.v2.resourcepool.BasicResourcePool forceKillAcquires ADVERTÊNCIA: Не сумев приобрести ресурс, [email protected] прерывает все потоки, ожидающие ресурса для проверки. Повторите попытку в ответ на новые запросы клиентов. mar 27, 2016 4:30:32 PM com.mchange.v2.resourcepool.BasicResourcePool forceKillAcquires ADVERTÊNCIA: Не удалось получить ресурс, [email protected] прерывает все потоки, ожидающие ресурса проверить. Повторите попытку в ответ на новые запросы клиентов. mar 27, 2016 4:30:32 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: Ошибка SQL: 0, SQLState: null mar 27, 2016 4:30:32 PM org.hibernate.engine .jdbc.spi.SqlExceptionHelper logExceptions ОШИБКА: Соединения не могут быть получены из базовой базы данных! mar 27, 2016 4:30:32 PM com.mchange.v2.resourcepool.BasicResourcePool $ ScatteredAcquireTask run ADVERTÊNCIA: com[email protected]2386af - Ошибка при сборе! Очистка ожидающих приобретений. При попытке получить необходимый новый ресурс нам не удалось добиться большего, чем максимальное количество разрешенных попыток приобретения (30). Последнее приобретение попытка исключения: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: cupone_plinhares пользователя уже более активных соединений 'max_user_connections' на sun.reflect.GeneratedConstructorAccessor28.newInstance (Unknown Source) в sun.reflect.DelegatingConstructorAccessorImpl. newInstance (DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance (Constructor.java:422) at com.mysql.jdbc.Util.handleNewInstance (Util.java:404) at 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.jdbc.MysqlIO.checkErrorPacket (My sqlIO.java:3806) на com.mysql.jdbc.MysqlIO.checkErrorPacket (MysqlIO.java:871) на com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication (MysqlIO.java:1686) в com.mysql.jdbc. MysqlIO.doHandshake (MysqlIO.java:1207) в com.mysql.jdbc.ConnectionImpl.coreConnect (ConnectionImpl.java:2254) в com.mysql.jdbc.ConnectionImpl.connectOneTryOnly (ConnectionImpl.java:2285) на ком. mysql.jdbc.ConnectionImpl.createNewIO (ConnectionImpl.java:2084) на com.mysql.jdbc.ConnectionImpl. (ConnectionImpl.java:795) на com.mysql.jdbc.JDBC4Connection. (JDBC4Connection.java:44) на sun.reflect.GeneratedConstructorAccessor23.newInstance (Неизвестный источник) at sun.reflect.DelegatingConstruct orAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) в java.lang.reflect.Constructor.newInstance (Constructor.java:422) в com.mysql.jdbc.Util.handleNewInstance (Util.java:404) на ком. mysql.jdbc.ConnectionImpl.getInstance (ConnectionImpl.java:400) at com.mysql.jdbc.NonRegisteringDriver.connect (NonRegisteringDriver.java:327) at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection (DriverManagerDataSource.java: 146) at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection (WrapperConnectionPoolDataSource.java:195) at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection (WrapperConnectionPoolDataSource.Java: 184) в com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool $ 1PooledConnectionResourcePoolManager.acquireResource (C3P0PooledConnectionPool.java:200) в com.mchange.v2.resourcepool.BasicResourcePool.doAcquire (BasicResourcePool.java:1086) в com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess (BasicResourcePool.java:1073) at com.mchange.v2.resourcepool.BasicResourcePool.access $ 800 (BasicResourcePool.java:44) at com.mchange.v2.resourcepool.BasicResourcePool $ 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.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert (SqlExceptionHelper.java:95) org.hibernate.resource.jdbc .internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded (LogicalConnectionManagedImpl.java:90) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection (LogicalConnectionManaged Impl.java:112) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement (LogicalConnectionManagedImpl.java:230) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin (LogicalConnectionManagedImpl.java:237) орг .hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl $ TransactionDriverControlImpl.begin (JdbcResourceLocalTransactionCoordinatorImpl.java:213) org.hibernate.engine.transaction.internal.TransactionImpl.begin (TransactionImpl.java:52) org.hibernate .internal.SessionImpl.beginTransaction (SessionImpl.java:1454) br.com.cuponero.dao.CidadesDao. <INIT> (CidadesDao.java:31) br.com.cuponero.actionsDaServlet.CidadesActionDaServlet.getJsonRegiao (CidadesActionDaServlet.java:35) br.com.cuponero.servlet.CidadesServlet.doPost (CidadesServlet.java:69) javax .servlet.http.HttpServlet.service (HttpServlet.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:689) com.mchange.v2.c3p0.impl .AbstractPoolBackedDataSource.getConnection (AbstractPoolBackedDataSource.java:140) org.hibernate.c3p0.internal.C3P0ConnectionProvider.getConnection (C3P0ConnectionProvider.java:73) org.hibernate.internal.AbstractSessionImpl $ NonContextualJdbcConnectionAccess.obtainConnection (AbstractSessionImpl.java:382) org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded (LogicalConnectionManagedImpl.java:87) org.hibernate.resource.jdbc.internal.LogicalConnectionM anagedImpl.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:213) org.hibernate.engine.

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

this.session.beginTransaction();

+0

Вопросы: Сколько экземпляров CidadesDao у вас есть? это одноэлемент? Сколько еще DAO, которые подключаются к базе данных? Почему вы используете создание сеанса в конструкторе DAO - вы делаете это во всех своих DAO? –

+0

Итак, у меня есть еще 4 класса dao, аналогичные этому, и у них также есть такая же логика, чтобы создавать эти сеансы. Каково ваше предложение ? –

+0

Предлагается создать сеанс в методе и не поддерживать его как переменную-член, как предположил Стив. Я попросил классы и примеры, потому что я хотел знать, почему соединения были исчерпаны. Если каждый экземпляр использует соединение из пула и не возвращает его, он будет исчерпан. Я хотел получить представление о графе. –

ответ

1

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

User cupone_plinhares already has more than 'max_user_connections' active connections

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

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

Лучшая идея была бы не иметь 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(); } 
} 

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

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

+0

Затем я тестирую экземпляр Transition вместо Session, как я делаю. Но одна вещь, которая разрешила мою проблему, была частично закрыта Session Dao после печати на экране любых результатов из банка. ... out.print («результат банка»); myInstanceDao.closeMySessions(); И вот в моем методе I: public void closeMySessions() { session.beginTransaction() commit(); session.close(); } Но мое приложение по-прежнему потребляет много памяти, и я считаю, что это связано с чем-то. Кто может продолжать помогать там, спасибо. –