2017-01-27 20 views
1

私はHibernate sessionFactoryのパフォーマンス上の問題に直面しています。 それは春ブーツです - 私もこの質問に記載されているすべてのさまざまな方法を試してみましたが、このSpring&Hibernate SessionFactoryパフォーマンスの問題

@Bean 
public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf){ 
    return hemf.getSessionFactory(); 
} 

のように構成されたSessionFactoryでアプリを休止私のDAOは、この

@Autowired 
private SessionFactory sessionFactory; 


@Transactional 
public List<Type> findAll() { 
    return sessionFactory.getCurrentSession().createQuery("from Type").list(); 
} 
のように見えます Spring Boot - Handle to Hibernate SessionFactory

同時db要求の数が構成されたmaximumPoolSize(この例では10)より大きい場合、アプリケーションは応答しなくなります。

@RequestMapping(value = "/stress-sessionfactory") 
public void stressTest(@RequestParam int threadsCount) { 
    List<Thread> threads = new ArrayList<>(); 
    for (int i = 0; i < threadsCount; i++) { 
     final int k = i; 
     Runnable runnable 
       =() -> { 

      List<Type> all = typeDAOHibernate.findAll(); 
      LOG.info("{}:sessionfactory:{} ", k, all.size()); 
     }; 
     Thread t = new Thread(runnable); 
     threads.add(t); 
    } 
    threads.stream().forEach(t -> t.start()); 
} 

githubにスタンドアロンの例があります。 この例はmaximumPoolSize=10で構成されています。 ちょうど http://localhost:8080/stress-sessionfactory?threadsCount=11を押すと、私が話しているエラーが発生します。

一方、Spring Dataリポジトリでは、何千もの同時リクエストを簡単に処理できます。 (例えばhttp://localhost:8080/stress-jpa?threadsCount=2000

私は別のデータソース(ひかり、Tomcatの)、異なるデータベース(オラクル、H2)と異なる休止状態 バージョン(5.011-決勝、v4.3.11-決勝)と同じシナリオを試してみましたし、私は常に取得同じエラー。

STACKTRACE

Exception in thread "Thread-51" Exception in thread "Thread-47" org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431) at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:447) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:277) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656) at com.example.dao.TypeDAOHibernate$$EnhancerBySpringCGLIB$$e6373e2e.findAll(<generated>) at com.example.controller.StressController.lambda$stressTest$0(StressController.java:36) at java.lang.Thread.run(Thread.java:745) Caused by: javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1700) at org.hibernate.jpa.internal.TransactionImpl.begin(TransactionImpl.java:48) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:189) at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380) ... 9 more Caused by: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:48) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95) at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:90) at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:112) at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement(LogicalConnectionManagedImpl.java:230) at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:237) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:214) at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:52) at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1512) at org.hibernate.jpa.internal.TransactionImpl.begin(TransactionImpl.java:45) ... 11 more Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30001ms. at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:591) at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:194) at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:146) at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:386) at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:87) ... 18 more []

答えて

0

私はあなたのSessionFactoryを注入したが、スプリング・フレームワークのトランザクション機能を使用していないことに気づきました。 このように使いたい場合は、dao層のsessionFactoryから取得しているセッションを閉じる必要があります。

+1

こんにちは、提案されたソリューションをチェックしましたか?それは働いたのですか?これは、ポスターの質問に対する答えのようには見えません! – pleft

+0

はいfindAllメソッドはすでにトランザクションとしてマークされています。それ以外の方法ではセッションを手動で終了しようとしましたが、問題は引き続き発生します。これはそうではありません – ltsallas

関連する問題