锁定老帖子 主题:执行几次查询之后就不能查询了,页面不动了
精华帖 (1) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-09-18
java代码如下: public class Employee_sortDAOImpl extends HibernateDaoSupport implements Employee_sortDAO { public int getEmployee_sortCount() throws HibernateException { String querySentence = "SELECT count(*) FROM Employee_sort_info"; List list = this.getHibernateTemplate().find(querySentence); Integer count = (Integer) list.get(0); return count; } public List getEmployee_sortByPage(Page page) throws HibernateException { String querySentence = "FROM Employee_sort_info"; Query query = getSession().createQuery(querySentence); query.setFirstResult(page.getBeginIndex()).setMaxResults(page.getEveryPage()); return query.list(); } } 警告: finalizing with closed connection 2006-9-18 14:38:26 org.hibernate.jdbc.ConnectionManager finalize 执行几次查询之后就不能查询了,页面不动了,是因为connection没有关闭吗? 问题已经解决了,谢谢哈 修改如下: public class Employee_sortDAOImpl extends HibernateDaoSupport implements Employee_sortDAO { public int getEmployee_sortCount() throws HibernateException { String querySentence = "SELECT count(*) FROM Employee_sort_info"; List list = this.getHibernateTemplate().find(querySentence); Integer count = (Integer) list.get(0); return count; } public List getEmployee_sortByPage(Page page) throws HibernateException { String querySentence = "FROM Employee_sort_info"; Session session=this.getHibernateTemplate().getSessionFactory() .openSession(); Query query = session.createQuery(querySentence); query.setFirstResult(page.getBeginIndex()).setMaxResults(page.getEveryPage()); List list = query.list(); session.close(); return list; } } 还有个问题:如果要实现如下功能,但是让它自己管理session,如何解决,我没有找到HibernateTemplate里面有类似setFirstResult和setMaxResults的方法啊 public List getEmployee_sortByPage(Page page) throws HibernateException { String querySentence = "FROM Employee_sort_info"; Query query = this.getHibernateTemplate().getSessionFactory().openSession().createQuery(querySentence); query.setFirstResult(page.getBeginIndex()).setMaxResults(page.getEveryPage()); return query.list(); } 上面的问题都已经解决,谢谢各位,代码如下: public List getEmployee_sortByPage(final Page page) throws HibernateException { return (List)getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { String querySentence = "FROM Employee_sort_info"; Query query = session.createQuery(querySentence); query.setFirstResult(page.getBeginIndex()).setMaxResults(page.getEveryPage()); return query.list(); } } ); } 上面的虽然解决了问题,但是太难看了,加了OpenSessionInViewInterceptor方便啊,session可以不管了,也不用使用难看的callback了,呵呵 <!-- SimpleUrlHandlerMapping --> <bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="interceptors" ref="openSessionInViewInterceptor"/> <property name="mappings"> <props> 。。。 </props> </property> </bean> <bean id="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> <property name="sessionFactory" ref="sessionFactory"/> </bean> public class Employee_sortDAOImpl extends HibernateDaoSupport implements Employee_sortDAO { public int getEmployee_sortCount() throws HibernateException { String querySentence = "SELECT count(*) FROM Employee_sort_info"; List list = this.getHibernateTemplate().find(querySentence); Integer count = (Integer) list.get(0); return count; } public List getEmployee_sortByPage(Page page) throws HibernateException { String querySentence = "FROM Employee_sort_info"; Query query = this.getSession().createQuery(querySentence); query.setFirstResult(page.getBeginIndex()).setMaxResults(page.getEveryPage()); return query.list(); } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-09-18
部分配置文件:
<!-- =============================事务处理=============================== --> <bean id="manager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="proxyInterfaces"> <list> <value>com.ctgusec.service.IManager</value> </list> </property> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="target"> <ref local="managerTarget" /> </property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mappingResources"> <list> <value>com/ctgusec/model/Employee_sort_info.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> |
|
返回顶楼 | |
发表时间:2006-09-18
session么关
|
|
返回顶楼 | |
发表时间:2006-09-18
据我所知,使用 getSession() 方法取出来的 Session 并不会在事务结束后自己关闭,问题应该就是出在这里了。
个人建议: 既然你的类都已经 extends HibernateDaoSupport 了,那么大部分常规的操作应该尽量使用 getHibernateTemplate().* 来进行,因为它已可以自己完成相当全面的事务管理(Transaction Management)了。 |
|
返回顶楼 | |
发表时间:2006-09-18
编程风格也不太好!
((Integer)query.iterate().next()).intValue(); query是否为null,hasNext(),null.intValue()? |
|
返回顶楼 | |
发表时间:2006-09-18
Allen 写道 据我所知,使用 getSession() 方法取出来的 Session 并不会在事务结束后自己关闭,问题应该就是出在这里了。
个人建议: 既然你的类都已经 extends HibernateDaoSupport 了,那么大部分常规的操作应该尽量使用 getHibernateTemplate().* 来进行,因为它已可以自己完成相当全面的事务管理(Transaction Management)了。 改成这样,情况依旧 警告: unclosed connection, forgot to call close() on your session? public class Employee_sortDAOImpl extends HibernateDaoSupport implements Employee_sortDAO { public int getEmployee_sortCount() throws HibernateException { int count = 0; String querySentence = "SELECT count(*) FROM Employee_sort_info"; List list = this.getHibernateTemplate().find(querySentence); count = (Integer)list.get(0); return count; } public List getEmployee_sortByPage(Page page) throws HibernateException { String querySentence = "FROM Employee_sort_info"; Query query = this.getHibernateTemplate().getSessionFactory().openSession().createQuery(querySentence); query.setFirstResult(page.getBeginIndex()).setMaxResults(page.getEveryPage()); return query.list(); } } |
|
返回顶楼 | |
发表时间:2006-09-18
galaxystar 写道 编程风格也不太好!
((Integer)query.iterate().next()).intValue(); query是否为null,hasNext(),null.intValue()? 谢谢您的提醒 |
|
返回顶楼 | |
发表时间:2006-09-18
public int getEmployee_sortCount() throws HibernateException { int count = 0; String querySentence = "SELECT count(*) FROM Employee_sort_info"; List list = this.getHibernateTemplate().find(querySentence); count = (Integer)list.get(0); return count; } 这个也可以执行?? int vs Integer?? |
|
返回顶楼 | |
发表时间:2006-09-18
应该是事务管理配置有些问题,参考一下Spring中jpetstore的事务配置吧。
另外,count = ((Integer)query.iterate().next()).intValue();的代码没有问题。因为针对select count(*)的语句,query.iterate()是不会为null的。 |
|
返回顶楼 | |
发表时间:2006-09-18
xxrong 写道 public int getEmployee_sortCount() throws HibernateException { int count = 0; String querySentence = "SELECT count(*) FROM Employee_sort_info"; List list = this.getHibernateTemplate().find(querySentence); count = (Integer)list.get(0); return count; } 这个也可以执行?? int vs Integer?? jdk1.5版本的是不会出问题的 我已经屡试不爽了 呵呵 |
|
返回顶楼 | |