2016-04-28 38 views
0

JPA/Hibernateバックエンドを使用してWildfly/RESTeasyでJAX-RS JSON APIを開発しましたが、重大なデータベースアクセスの問題があります。JPA/JAX-RSアプリケーションを微調整する方法

は例えば、突然、アプリケーションが応答を停止し、ログがの束を示しています。私はこれが(たとえば15、20人のユーザーが同時に)、以来1を持つ別のユーザーが複数のアクセスによるものだと思う

ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (EJB default - 4) IJ031012: Unable to obtain lock in 60 seconds: org.jboss.jca.adapters.jdbc.local.LocalManagedConnection 

INFO [org.jboss.jca.core.connectionmanager.listener.TxConnectionListener] IJ000302: Unregistered handle that was not registered: org.jboss.jca.adapters.jdbc.jdk7.WrappedConnectionJDK7 

WARN [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] IJ000609: Attempt to return connection twice: org.jboss.jca.core.connectionmanager.listener.TxConnectionListener 

WARN [org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory] (default task-9) IJ030020: Detected queued threads during cleanup 

ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (ForkJoinPool.commonPool-worker-0) IJ031041: Connection handle has been closed and is unusable 

ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (ForkJoinPool.commonPool-worker-1) IJ031050: The result set is closed 

を/ 2人のユーザーはこれは起こりません。

私はHibernate 5.1とWildfly 10、およびSQL Server 2014を使用しています。これはバニラインストールで、調整やカスタム設定はありません。これらの問題を回避するためにインフラストラクチャを微調整するにはどうすればよいですか?

答えて

0

、それのサンプルです。その解決策は、ロックの問題をなくして、@Stateless DAOをRESTサービスに注入することでした。

0

HikariCP接続プールを使用します。 トラフィックに基づいて、接続プール内およびデータベース内の接続は何も設定されません。 接続プールには、常に使用可能な量の接続を維持するオプションがあります。また、接続分離タイプをコミット後のみに設定します。以下

問題はRESTサービスが@Statelessされ、従って、各リクエストに応じてトランザクションを開くに関連した

<persistence-unit name="sample" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties> 

      <!-- provider --> 
      <property name="hibernate.connection.provider_class" value="com.xo.web.persistence.XOHikariCPConnectionProvider"/> 

      <!-- Hibernate properties --> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> 
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
      <property name="hibernate.archive.autodetection" value="hbm" /> 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
      <property name="show_sql" value="false"/> 
      <property name="hibernate.connection.release_mode" value="after_transaction"/> 
      <property name="hibernate.connection.autocommit" value="false"/> 
      <property name="hibernate.connection.isolation" value="2"/> 
      <property name="hibernate.ejb.interceptor" value="com.xo.web.persistence.intercept.XoEntityInterceptor"/> 
      <property name="hibernate.jdbc.batch_size" value="100"/> 
      <property name="hibernate.order_inserts" value="true"/> 
      <property name="hibernate.order_updates" value="true"/> 


      <!-- Hikari settings --> 
      <property name="maximumPoolSize" value="80" /> 
      <property name="autoCommit" value="false" /> 
      <property name="minimumPoolSize" value="20" /> 
      <property name="idleTimeout" value="60000" /> 
      <property name="maxLifetime" value="600000" /> 
      <property name="connectionInitSql" value="select 1" /> 
      <property name="connectionTimeout" value="1000" /> 
      <property name="validationTimeout" value="1000" /> 
      <property name="cachePrepStmts" value="true" /> 
      <property name="prepStmtCacheSize" value="250" /> 
      <property name="prepStmtCacheSqlLimit" value="2048" /> 

     </properties> 
    </persistence-unit> 
+0

ありがとうございました!しかし、接続プールは問題の原因ではないようです。一部のエンティティをフリーズするのは「60秒でロックを取得できません」です。 –

関連する問題