首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧Hibernate连接泄漏

弹簧Hibernate连接泄漏
EN

Stack Overflow用户
提问于 2016-12-31 07:11:11
回答 1查看 2.4K关注 0票数 1

在5-6次请求之后,我得到了低于错误的结果。

代码语言:javascript
复制
org.springframework.dao.DataAccessResourceFailureException
Unable to acquire JDBC Connection; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection

使用下面的代码工作得很好,除了它在几个请求之后耗尽了连接池。

我对Spring框架很陌生,并使用在线示例编写了所有这些内容。我尝试了几个变体,但都失败了。任何帮助都将不胜感激。谢谢。

application.yml

代码语言:javascript
复制
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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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");
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-04 13:12:11

本守则运作良好。

问题是项目中的另一个@Repository类正在执行

代码语言:javascript
复制
@Inject
private SessionFactory sessionFactory;

它占用了连接,即使在测试服务中不调用代码时也是如此。我仍然不确定它是如何工作的,但是一旦我用

代码语言:javascript
复制
@PersistenceContext
private EntityManager em;

啊,真灵。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41406283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档