另外一个团队一个很古老的服务,也不知道传了几代,突然异常,领导让我们这边支援一下。从他们分享看到异常看到异常如下,这个是根本的问题。
[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 条评论) “” |