某个函数里面有调用Query的list()方法,然后它有时会出现这种症状:
忽然停住不动,但是也没报异常,就是界面死了。
我的查询差不多是这样:
Query q=sessionFactory.openSession().createSQLQuery("select * from XEntity where x=x").addEntity(XX.class);
List resultList=q.list();
这个sessionFactory是在Spring配置文件里面配好的,用它管理session。
我调试的时候发现一些特征,如果记录在数据库中没有,List就会停住(这种现象观察到很多次);
但是后来又观察到其实不一定出现这种情况,有时list也会返回null,所以不是原生SQL查询的问题。
于是上网搜了很久,中文关键词搜索,见到百度知道中有一个问题跟我一模一样的,但是可惜没人回答,至于其他的问题,也是风马牛不相及,慨叹中文社区不热心之余,查了下英文,估计是关键词不对头,没查到什么有用的东西。
感觉这下惨了,自己慢慢调---看着各个线程在那里跳来跳去,忽然想到会不会是session的问题,因为在搜索中似乎有见到说session有时会不够用,从而程序可能停止或抛出异常,于是我立马想到我的函数中没有释放session!
我现在spring配置文件中把数据库连接池的大小调高了很多,发现情况有明显好转,但还会有死掉的情况,于是动手在每个涉及数据库访问的函数中加了session.close(),这下果然可以运行了。
估计是session没close时,会引用了分配的数据库连接,在一段时间内这个连接时不会释放的,即使是空闲的连接,所以出现了等待的情况。
困扰了我几个小时的问题终于解决,爽!