另外一个团队一个很古老的服务,也不知道传了几代,突然异常,领导让我们这边支援一下。从他们分享看到日志看到异常如下,这个是根本的问题。
[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;
}
}
优化后,紧急发布,问题解决。