论坛首页 Java企业应用论坛

执行几次查询之后就不能查询了,页面不动了

浏览 40641 次
精华帖 (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();	
	}
   发表时间: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>
0 请登录后投票
   发表时间:2006-09-18  
session么关
0 请登录后投票
   发表时间:2006-09-18  
据我所知,使用 getSession() 方法取出来的 Session 并不会在事务结束后自己关闭,问题应该就是出在这里了。

个人建议:
既然你的类都已经 extends HibernateDaoSupport 了,那么大部分常规的操作应该尽量使用 getHibernateTemplate().* 来进行,因为它已可以自己完成相当全面的事务管理(Transaction Management)了。
0 请登录后投票
   发表时间:2006-09-18  
编程风格也不太好!
((Integer)query.iterate().next()).intValue();
query是否为null,hasNext(),null.intValue()?
0 请登录后投票
   发表时间: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();        
    }

}


0 请登录后投票
   发表时间:2006-09-18  
galaxystar 写道
编程风格也不太好!
((Integer)query.iterate().next()).intValue();
query是否为null,hasNext(),null.intValue()?


谢谢您的提醒
0 请登录后投票
   发表时间: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??
0 请登录后投票
   发表时间:2006-09-18  
应该是事务管理配置有些问题,参考一下Spring中jpetstore的事务配置吧。

另外,count = ((Integer)query.iterate().next()).intValue();的代码没有问题。因为针对select count(*)的语句,query.iterate()是不会为null的。
0 请登录后投票
   发表时间: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版本的是不会出问题的
我已经屡试不爽了
呵呵
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics