2016-03-27 24 views
0

私は、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();

+0

質問:CidadesDaoのインスタンスはいくつありますか?それはシングルトンですか?データベースに接続するDAOはいくつありますか? DAOコンストラクタでセッションを作成するのはなぜですか?すべてのDAOでセッションを作成しますか? –

+0

私はこれに似た4つのクラスdaoを持っており、これらのセッションをインスタンス化する同じロジックも持っています。あなたの提案は何ですか? –

+0

提案は、メソッドでセッションを作成し、Steveが提案したようにメンバ変数として維持しないことです。なぜ私は接続が疲れていたのか知​​りたかったので、クラスとインスタンスを求めました。すべてのインスタンスがプールからの接続を使用していて、それを返さない場合、それらは使い果たされます。私はカウントのアイデアを得たかった。 –

答えて

1

だからこれはあなたのスタックトレースからまっすぐです:しようとする

User cupone_plinhares already has more than 'max_user_connections' active connections

明白なことは、ユーザーcupone_plinharesためincreasemax_user_connectionにあります。

スタックトレースを見る前に、問題がConnectionリークになると思っていました。あなたの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()が失敗した場合に伝播します。しかし、一貫性のあるトランザクションを開始/コミット/ロールバックする必要があります。必要に応じてセッションを作成し、ライフサイクルが不確定なメンバ変数でそれらを開いたままにするのではなく、

接続プールのポイントは、セッションの作成を安価にすることです。したがって、永続セッションの管理の複雑さに対処する必要はありません。

+0

私は、Sessionの代わりにTransitionのインスタンスを使用してテストします。しかし、私の問題を解決したことの1つは、銀行からの結果を画面に印刷した後、セッションダオを閉鎖することでした。 ... out.print( "銀行の結果"); myInstanceDao.closeMySessions(); そして、ここに私の方法Iで: ます。public void closeMySessions(){ session.beginTransaction()コミット(); session.close(); } しかし、私のアプリケーションはまだ多くのメモリを消費しており、それは何か関連していると思います。誰がそこに助け続けることができる、大丈夫です。 –

関連する問題