私は、Hibernateを持つJavaアプリケーションを持っています。私はちょうどc3p0を実装します。私がホストでTomcatサーバーを再起動するとすぐにすべてが動作します。しかし、いくつかの顧客アクセスの直後に、私たちのBD mysqlとのやりとりのために、より多くのセッションを作成することはありません。 誰も私に助けてくれますか?私は感謝するでしょう。接続プーリング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:
LOG次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;
}
...
このWebサービス:
2016年3月27日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(不明なソース)で sun.reflect.DelegatingConstructorAccessorImplで 以上のものを持っています。新しいインスタンス(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) (com.mysql.jdbc.Util.handleNewInstance(Util.java:404) 、com.mysql) jdbc.Util.getInstance(Util.java:387) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870) at com.mysql.jdbc.MysqlIO.checkErrorPacket(My com.mysql.jdbcでcom.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1686) でcom.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871) でsqlIO.java:3806) 。 MysqlIO.doHandshake(MysqlIO.java:1207)COMでcom.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2285) でcom.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2254) で 。 mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2084) com.mysql.jdbc.ConnectionImpl(ConnectionImpl.java:795) com.mysql.jdbc.JDBC4Connection。(JDBC4Connection.java:44) at 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)で コムで 。 com.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。com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool $ 1でのmchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnectionで(WrapperConnectionPoolDataSource.java:195) (WrapperConnectionPoolDataSource.java:184) com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccessでcom.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1086) でPooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:200) (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)
2016年3月27日午前四時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(不明なソース)で sun.reflect.DelegatingConstructorAccessorImplで 以上のものを持っています。新しいインスタンス(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) (com.mysql.jdbc.Util.handleNewInstance(Util.java:404) 、com.mysql) jdbc.Util.getInstance(Util.java:387) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870) at com.mysql.jdbc.MysqlIO.checkErrorPacket(My com.mysql.jdbcでcom.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1686) でcom.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871) でsqlIO.java:3806) 。 MysqlIO.doHandshake(MysqlIO.java:1207)COMでcom.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2285) でcom.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2254) で 。 mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2084) com.mysql.jdbc.ConnectionImpl(ConnectionImpl.java:795) com.mysql.jdbc.JDBC4Connection。(JDBC4Connection.java:44) at 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)で コムで 。 com.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: com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnectionでcom.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:195) (WrapperConnectionPoolDataSource.java:184)com.mchange.v2で における146) 。 c3p0.impl.C3P0PooledConnectionPool $ 1PooledConnec tionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:200)com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccessでcom.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1086) で (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)
2016年3月27日午前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 警告: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(不明なソース)で sun.reflect.DelegatingConstructorAccessorImplで 以上のものを持っています。新しいインスタンス(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) (com.mysql.jdbc.Util.handleNewInstance(Util.java:404) 、com.mysql) jdbc.Util.getInstance(Util.java:387) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:941) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3870) at com.mysql.jdbc.MysqlIO.checkErrorPacket(My com.mysql.jdbcでcom.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1686) でcom.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871) でsqlIO.java:3806) 。 MysqlIO.doHandshake(MysqlIO.java:1207)COMでcom.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2285) でcom.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2254) で 。 mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2084) com.mysql.jdbc.ConnectionImpl(ConnectionImpl.java:795) com.mysql.jdbc.JDBC4Connection。(JDBC4Connection.java:44) at 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)で コムで 。 com.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: (WrapperConnectionPoolDataSource)。Javaの:184) com.mchange.v2.resourcepool.BasicResourcePool.doAcquireでcom.mchange.v2.c3p0.impl.C3P0PooledConnectionPool $ 1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:200) (BasicResourcePool.java:1086) でのcom.mchange.v2.resourcepool.BasicResourcePoolでcom.mchange.v2.resourcepool.BasicResourcePool.access $ 800(BasicResourcePool.java:44)でcom.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073) com.mchange.v2.async.ThreadPoolAsynchronousRunner $ PoolThread.runで$ ScatteredAcquireTask.run(BasicResourcePool.java:1810) (ThreadPoolAsynchronousRunner.java:648)
org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47):私は、このWebサービスUPを接続しようとしたときに自分のアプリケーションのアンドロイドStudioでログに続いて最高のヘルプについては、 (org.apache.org)プロパティImpl.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.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) プロパティ。 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();
質問:CidadesDaoのインスタンスはいくつありますか?それはシングルトンですか?データベースに接続するDAOはいくつありますか? DAOコンストラクタでセッションを作成するのはなぜですか?すべてのDAOでセッションを作成しますか? –
私はこれに似た4つのクラスdaoを持っており、これらのセッションをインスタンス化する同じロジックも持っています。あなたの提案は何ですか? –
提案は、メソッドでセッションを作成し、Steveが提案したようにメンバ変数として維持しないことです。なぜ私は接続が疲れていたのか知りたかったので、クラスとインスタンスを求めました。すべてのインスタンスがプールからの接続を使用していて、それを返さない場合、それらは使い果たされます。私はカウントのアイデアを得たかった。 –