问题:
我的程序是这样的
String querySql="select A.name,B.name " +
" from A inner join B on A.id=B.id " +
" where A.s='q' ";
Session session = this.getSession();
List<Object> objList = (List<Object> )session.createSQLQuery(querySql).list();前20次执行都成功了,再次执行时,执行到 session.createSQLQuery(querySql).list() 就没有动静了。
看了别人的取的session也出现了这样的问题,
别人的代码是这样的 Session session = this.getHibernateTemplate().getSessionFactory().getCurrentSession();
session.createSQLQuery(querySql).list();
出错的原因是能查询的某个对象处于持久化状态或流离状态,需要清空下session缓存(flush()或者clear())。
所有我一开始执行了this.getSession().flush(),但是没有效果,后来发现我用的session 是 org.springframework.orm.hibernate3.support.HibernateDaoSupport.getSession(), 本来想将它改为this.getHibernateTemplate().getSessionFactory().getCurrentSession(),执行getHibernateTemplate().flush()清缓存,但是发现this.getHibernateTemplate().getSessionFactory()不为null,但是this.getHibernateTemplate().getSessionFactory().getCurrentSession()就是一个获取不到的变量 ,所以这种办法也不行。
根本原因:
配置文件里设置了最大的连接数据库的次数。所以,每次到达最大连接次数时,就无法连接和操作数据库了。
解决:
一:
修改这个最大连接数。最好每次使用完数据库时,断开和数据库的连接。
二:
其实一开始用的Hql,但是因为关联查询另一个表,我用join方式查询不了,所以改为sql,但是HQL支持where语句里写连接条件的表关联查询,所以最后代码改成 HQL方式查询了。
List<Object> objList=null;
String hql="select A.name,B.name " +
" from A, B " +
" where A.id=B.id and A.s='q' ";
try {
objList=(List<Object>)this.getHibernateTemplate().find(hql);
} catch (RuntimeException e) {
// TODO: handle exception
throw e;
}