java hibernate 连接池 被打满

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

[ERROR] o.h.e.jdbc.spi.SqlExceptionHelper 129 - HikariConnectionPool - Connection is not available, request timed out after 30008ms.

经过源码分析与资料查询,发现是连接池被打满,为什么导致问题。找到一段代码

@Override    public Student findOne(String userId){        Session session = sessionFactory.openSession();        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;        }    }

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

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章