您的位置 首页 java

java hibernate 连接池 被打满

另外一个团队一个很古老的服务,也不知道传了几代,突然异常,领导让我们这边支援一下。从他们分享看到日志看到异常如下,这个是根本的问题。

[ERROR] o.h.e.jdbc.spi.Sql Exception Helper 129 – HikariConnectionPool – Connection is not available, request timed out after 30008ms.

经过源码分析与资料查询,发现是连接池被打满,是如下代码块导致的问题

 @Override
    public Student findOne(String userId){
        Session session = sessionFactory.open Session ();
        Query query = session.createQuery("from Student s where s.id=?");
        query.setParameter(0,userId);
        Student result=(Student)query.uniqueResult();
        session.close();
        return result;
    }  

原来是代码中使用了 Hibernate 的Session,乍一看代码没有毛病。但是经过详细的调用链日志发现两个地方会引起异常

1.传入的参数为空或者null

2.返回结果为空或者null

如果报空指针异常,Session没有被close,连接不会被释放,连接也不会回收到连接池。

优化后的代码如下:

 @Override
    public Student findOne(String userId){
        Session session = sessionFactory.openSession();
        Student result=null;
        try {
            Query query = session.createQuery("from Student s where s.id=?");
            query.setParameter(0,userId);
            result=(Student)query.uniqueResult();
            session.close();            
        } catch (HibernateException e) {
            log.error("调用findOne异常",e);
        } finally {
            session.close();
            return result;
        }
    }  

优化后,紧急发布,问题解决。

文章来源:智云一二三科技

文章标题:java hibernate 连接池 被打满

文章地址:https://www.zhihuclub.com/183807.shtml

关于作者: 智云科技

热门文章

网站地图