`
温柔一刀
  • 浏览: 860595 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多
每执行依次查询,控制台就有这样的警告

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();	
	}
分享到:
评论
19 楼 温柔一刀 2006-09-19  
dada 写道
温柔一刀 写道
再问一哈,如果要实现如下功能,但是让它自己管理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();        
    }


execute方法


能说详细点么?我看了下源码,execute方法好象实现不了
public Object execute(HibernateCallback action) throws DataAccessException {
		return execute(action, isExposeNativeSession());
	}

public Object execute(HibernateCallback action, boolean exposeNativeSession) throws DataAccessException {
		Session session = getSession();
		boolean existingTransaction = SessionFactoryUtils.isSessionTransactional(session, getSessionFactory());
		if (existingTransaction) {
			logger.debug("Found thread-bound Session for HibernateTemplate");
		}

		FlushMode previousFlushMode = null;
		try {
			previousFlushMode = applyFlushMode(session, existingTransaction);
			enableFilters(session);
			Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));
			Object result = action.doInHibernate(sessionToExpose);
			flushIfNecessary(session, existingTransaction);
			return result;
		}
		catch (HibernateException ex) {
			throw convertHibernateAccessException(ex);
		}
		catch (SQLException ex) {
			throw convertJdbcAccessException(ex);
		}
		catch (RuntimeException ex) {
			// Callback code threw application exception...
			throw ex;
		}
		finally {
			if (existingTransaction) {
				logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate");
				disableFilters(session);
				if (previousFlushMode != null) {
					session.setFlushMode(previousFlushMode);
				}
			}
			else {
				SessionFactoryUtils.releaseSession(session, getSessionFactory());
			}
		}
	}
18 楼 温柔一刀 2006-09-19  
downpour 写道
都在搞什么搞啊,HibernateTemplate里面的getSession()方法是受到Spring管理的,拿到的是当前线程安全的Session,无需手动管理。你可以先把Spring和Hibernate的日志打成DEBUG,看一下Transaction和Session的日志。再不明白可以跟踪一下Spring的源码看一下。其实文档里面都有写。查阅一下吧。

根据你提供的情况,应该是你的Transaction的配置有问题,先修改Transaction的配置再试试。


HibernateTemplate里面的getSession()方法是protected的,不能直接得到,我的transactionManager没有问题,我属hibernate初学者,不熟悉hibernate机制,事务处理是按照ibatis的配置简单改过来的
<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>

17 楼 downpour 2006-09-19  
都在搞什么搞啊,HibernateTemplate里面的getSession()方法是受到Spring管理的,拿到的是当前线程安全的Session,无需手动管理。你可以先把Spring和Hibernate的日志打成DEBUG,看一下Transaction和Session的日志。再不明白可以跟踪一下Spring的源码看一下。其实文档里面都有写。查阅一下吧。

根据你提供的情况,应该是你的Transaction的配置有问题,先修改Transaction的配置再试试。
16 楼 dada 2006-09-19  
温柔一刀 写道
再问一哈,如果要实现如下功能,但是让它自己管理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();        
    }


execute方法
15 楼 ctguharry 2006-09-19  
初学

14 楼 温柔一刀 2006-09-19  
再问一哈,如果要实现如下功能,但是让它自己管理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();        
    }
13 楼 温柔一刀 2006-09-19  
Allen 写道

你已经把 Session 取出来由自己控制了,那么这个 Session 就脱离了 HibernateTemplate 的“监管”。
既然这个 Session 已经交由你编写的类来管理,当然就需要靠自己写点代码来进行 close() 咯!


谢谢您,我已经知道了,修改如下就可以了,呵呵,果然自己要close
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;
	}
}
12 楼 Allen 2006-09-19  
温柔一刀 写道
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();        
    }

}




引用
Query query = this.getHibernateTemplate().getSessionFactory().openSession().createQuery(querySentence);


你已经把 Session 取出来由自己控制了,那么这个 Session 就脱离了 HibernateTemplate 的“监管”。
既然这个 Session 已经交由你编写的类来管理,当然就需要靠自己写点代码来进行 close() 咯!
11 楼 downpour 2006-09-18  
没看出哪里不好,Hibernate Reference都是这样的写法。说说你的好风格。
10 楼 温柔一刀 2006-09-18  
downpour 写道

另外,count = ((Integer)query.iterate().next()).intValue();的代码没有问题。因为针对select count(*)的语句,query.iterate()是不会为null的。


这个我也知道
但是编程风格确实不太好呵
9 楼 温柔一刀 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版本的是不会出问题的
我已经屡试不爽了
呵呵
8 楼 downpour 2006-09-18  
应该是事务管理配置有些问题,参考一下Spring中jpetstore的事务配置吧。

另外,count = ((Integer)query.iterate().next()).intValue();的代码没有问题。因为针对select count(*)的语句,query.iterate()是不会为null的。
7 楼 xxrong 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??
6 楼 温柔一刀 2006-09-18  
galaxystar 写道
编程风格也不太好!
((Integer)query.iterate().next()).intValue();
query是否为null,hasNext(),null.intValue()?


谢谢您的提醒
5 楼 温柔一刀 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();        
    }

}


4 楼 galaxystar 2006-09-18  
编程风格也不太好!
((Integer)query.iterate().next()).intValue();
query是否为null,hasNext(),null.intValue()?
3 楼 Allen 2006-09-18  
据我所知,使用 getSession() 方法取出来的 Session 并不会在事务结束后自己关闭,问题应该就是出在这里了。

个人建议:
既然你的类都已经 extends HibernateDaoSupport 了,那么大部分常规的操作应该尽量使用 getHibernateTemplate().* 来进行,因为它已可以自己完成相当全面的事务管理(Transaction Management)了。
2 楼 dada 2006-09-18  
session么关
1 楼 温柔一刀 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>

相关推荐

    javascript页面加载完执行事件代码

    本文将深入探讨如何在页面加载完成后执行特定的JavaScript事件代码,以及在实现此功能时需要注意的几个关键点。 首先,介绍页面加载状态的判断方法。在JavaScript中,可以通过监听document对象的readyState属性变化...

    屏幕滚动到相应位置,执行css动画

    "屏幕滚动到相应位置,执行css动画"这一技术主要涉及到CSS的定位、媒体查询(Media Queries)以及CSS动画(CSS Animation)等相关知识。下面我们将详细探讨这些关键点。 首先,CSS定位是实现这一效果的基础。在HTML...

    aspx页面事件执行顺序

    ASPX页面事件执行顺序是网页开发中至关重要的概念,它涉及到.NET Framework下的ASP.NET应用程序的生命周期管理。在ASP.NET中,每一个.aspx页面经历一系列的事件,这些事件在页面的加载和处理过程中依次触发,允许...

    Ajax 动态载入html页面后不能执行其中的js快速解决方法

    有一个公用页面需要在多个页面调用,其中涉及到部分js已经写在了公用页面中,通过ajax加载该页面后无法执行其中的js。 解决思路 1. 采用附加一个iframe的方法去执行js,为我等代码洁癖者所不齿。 2. 使用[removed]...

    JSP中把动态页面转换为静态页面.doc

    然而,动态页面每次请求都需要执行服务器上的代码,这可能导致数据库查询的频繁发生。将动态页面转换为静态页面可以显著减少数据库的负载,提高网站的响应速度。 动态页面转换为静态页面的主要思路是利用Filter...

    网页模板——vue实现动态表格数据查询筛选代码.zip

    在本资源中,“网页模板——vue实现动态表格数据查询筛选代码.zip”是一个包含Vue.js实现的动态表格数据查询和筛选功能的代码示例。Vue.js是目前非常流行的前端JavaScript框架,它简化了网页开发,尤其是处理用户...

    查询数据库,由JSP生成静态页面

    在IT行业中,动态网站开发是常见的应用场景,而“查询数据库,由JSP生成静态页面”是一种优化网站性能的策略。这种技术旨在通过将频繁访问的数据转换为静态HTML页面,从而减轻服务器的压力,提高用户访问速度,提升...

    asp.net 动态页面静态化

    ASP.NET动态页面静态化是一种优化网站性能的技术,它将原本由服务器实时生成的动态网页转换为HTML静态页面,从而减少服务器处理和数据库查询的工作量,加快网页加载速度,提高用户体验。这种技术尤其适用于内容更新...

    单页面的js文件动态加载组件

    这样可以减少初始页面加载时间,提高用户体验,因为不是所有的代码都在页面加载时就需要执行。有几种常见的方法可以实现动态加载: 1. **`&lt;script&gt;`标签的async和defer属性**:这两个属性可以在不阻塞页面渲染的...

    JSP页面中模糊查询

    这种技术在软件系统中非常常见,比如搜索引擎Google、Baidu等,在用户输入一个字或词后就能在下拉列表框中列出数据库中的匹配项供用户选择,极大地提高了用户的输入效率。 #### 二、传统C/S结构中的模糊查询实现 ...

    动态Jsp页面转换成静态Html页面

    5. 链接更新:如果动态页面包含其他动态链接,需要修改为静态页面的URL,确保页面间的导航正常。 三、实现步骤 1. 创建Servlet:编写一个Servlet,配置在web.xml中,设定URL映射规则,使得特定的JSP请求会被这个...

    js页面输入查询组件

    在本主题"js页面输入查询组件"中,我们主要讨论的是如何利用JavaScript实现在网页上实时搜索的功能,即用户在输入框中输入文字时,页面能即时展示与输入相匹配的结果。 这种功能在现代Web应用中非常常见,例如搜索...

    jsp动态页面转化静态化--实例

    1. 预生成:在用户请求之前就生成静态页面,适用于内容较少且更新不频繁的网站。 2. 后生成:在用户首次请求时生成静态页面,之后的相同请求直接返回静态HTML。 3. 定期刷新:设定定时任务,定期检查并重新生成静态...

    ASP的多条件动态查询

    在构建好查询字符串后,可以使用ADO的`Command`对象来执行SQL语句,并通过`Recordset`对象来获取查询结果。这通常涉及到以下步骤: 1. 创建`ADODB.Command`对象。 2. 设置命令文本(即SQL查询语句)。 3. 设置命令...

    asp做的成绩查询系统动态网站

    登录成功后,用户可能被导向不同的页面,如个人成绩查询页、班级平均分页等。 3. 查询功能:系统的核心在于查询功能。这可能涉及编写ASP脚本来接收用户的查询参数(如学号、姓名或学期),然后通过SQL查询语句从...

    C# 获取js执行之后的网页源代码(使用线程并设置超时功能)_20200712_140337.rar

    在C#编程中,有时我们需要获取网页的源代码,但有些网页的内容是通过JavaScript动态生成的,单纯使用HttpClient或WebClient等方法无法获取到完整的HTML,因为它们不会执行页面上的JavaScript代码。在这种情况下,...

    不动产学习文档

    - **信息查询**: 查询不动产登记信息。 - **主页**: 提供系统的主要功能入口。 #### 三、实例操作流程 以“集体建设地使用权/房屋所有权首次登记”为例,具体操作步骤如下: 1. **权籍调查**: 首先在权籍调查系统中...

    看一遍就会明白的动态生成静态页面(C#)

    动态生成是指服务器根据用户的请求实时生成网页内容,而静态页面则是提前生成并存储为HTML文件,用户请求时直接返回这些文件,无需再次执行数据库查询或服务器端逻辑。在ASP.NET框架下,我们可以利用C#语言来实现这...

    JSP中把动态页面转换为静态页面

    - 静态页面不能依赖于Session,因为静态文件无法存储会话信息。 - 用户个性化内容或需要登录验证的页面不适合此方法,因为这些页面的内容与用户状态相关。 - 要注意防止递归生成静态页面,即避免Filter生成静态...

Global site tag (gtag.js) - Google Analytics