2016-12-31 4 views
1

5-6リクエスト後にエラーが発生します。Spring Hibernate Connection Leak

org.springframework.dao.DataAccessResourceFailureException 
Unable to acquire JDBC Connection; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection 

以下のコードを使用すると、いくつかのリクエストの後に接続プールが使い果たされることを除いて、完全に機能します。

私はSpringフレームワークには新しく、これらのすべてをオンラインサンプルを使用して構成しました。私はいくつかの変種を試してみましたが、すべて失敗しました。どんな助けもありがとう。ありがとう。

application.yml

spring: 
    datasource: 
     type: com.zaxxer.hikari.HikariDataSource 
     dataSourceClassName: com.mysql.jdbc.jdbc2.optional.MysqlDataSource 
     jdbcUrl: jdbc:mysql://localhost:3306/db_name?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=utf8 
     catalog: db_name 
     username: myusername 
     password: mypassword 
     testOnBorrow: true 
     validationQuery: SELECT 1 
     testWhileIdle: true 
     timeBetweenEvictionRunsMillis: 3600000 
    jpa: 
     show_sql: true 

hibernate: 
    dialect: org.hibernate.dialect.MySQLDialect 
    show_sql: false 
    format_sql: true 
    connection: 
     provider_class: com.zaxxer.hikari.hibernate.HikariConnectionProvider 
     release_mode: after_transaction 
... 

ApplicationConfiguration.java

@Configuration 
@PropertySource("classpath:application.yml") 
@EnableTransactionManagement 
@EnableSwagger2 
@EntityScan("com...dal.data") 
public class ApplicationConfiguration extends WebMvcConfigurerAdapter { 

    @Configuration 
    @ConfigurationProperties(prefix="spring.datasource") 
    public class JpaConfig extends HikariConfig {} 

    @Autowired 
    private JpaConfig jpaConfig; 

    @Bean(destroyMethod = "close") 
    public DataSource dataSource() { 
     return new HikariDataSource(jpaConfig); 
    } 

    @Bean 
    public SessionFactory sessionFactory() { 
     LocalSessionFactoryBuilder factoryBuilder = new LocalSessionFactoryBuilder(dataSource()); 
     factoryBuilder.addAnnotatedClasses(
       com...dal.data.MyEntity.class, ... 
     ); 
     return factoryBuilder.buildSessionFactory(); 
    } 

TestDaoImpl.java

@Repository 
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class TestDaoImpl implements TestDao { 

    private static final Logger logger = LoggerFactory.getLogger(TestDaoImpl.class); 

    @PersistenceContext 
    private EntityManager em; 

    @SuppressWarnings("unchecked") 
    @Override 
    public List<MyEntity> getEntities() { 
     return em.unwrap(Session.class) 
       .createCriteria(MyEntity.class, "myEntity") 
       .list(); 
    } 

    @Override 
    @Transactional 
    public void saveTest(MyEntity test) throws OperationException { 
     try { 
      em.persist(test); 
     } catch (Exception e) { 
      logger.error("ERROR saving test", e); 
      throw new OperationException("PS-SERVER"); 
     } 
    } 

答えて

0

このコードはうまく機能しています。

問題は、コードがテストサービスで呼び出されることはありません場合でも、プロジェクト内の別の@Repositoryクラスが接続を食べていた

@Inject 
private SessionFactory sessionFactory; 

をしていたとありました。私はまだそれがどのように機能するのかまだ分かりませんが、一度コードを置き換えると、

@PersistenceContext 
private EntityManager em; 

となりました。

+0

私はHibernateSessionを取得するために以下の手法を使用しています:http://stackoverflow.com/a/33881946/272180そしてしばらくしてアプリケーションでもリークが発生します。以前はよく働いていました。奇妙な。 – yglodt

関連する問題