Пул подключений 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.
первопричина 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()
выходит из строя. Но вам нужно начать / зафиксировать / откатить согласованную транзакцию, и вы должны создавать сеансы по мере необходимости и быстро их уничтожать, а не держать их открытыми в переменной-члене, жизненный цикл которой не определен.
Задача пула подключений - сделать создание сеанса дешевым, чтобы вам не приходилось сталкиваться со сложностью управления постоянным сеансом.