問題:
我的程序是這樣的
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;
}