论坛首页 Java版 Hibernate

sql server中session.iterate()为什么报错

浏览 2753 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2004-04-24
最近用hibernate做demo。
用find是可以的,createQuery也是可以的。但是在iterate的时候就报错,说连接已经关闭,不能在关闭的连接上做这个操作。

我的环境是jboss3.0.2+tomcat4.0.4+hibernate2.1 +sql server2000
望高手解答一下,
   
最后更新时间:2004-04-24
你是不是关闭了相应的session,再遍历iterator的
   
0 请登录后投票
最后更新时间:2004-04-24
没有的,是遍历以后才关闭的。
   
0 请登录后投票
最后更新时间:2004-04-24
跟用find是一样的,就是将find换成iterate,然后变了相应的接收参数。就报这个错误啊。
   
0 请登录后投票
最后更新时间:2004-04-25
贴出代码,映射
   
0 请登录后投票
最后更新时间:2004-04-25
【引用】跟用find是一样的,就是将find换成iterate,然后变了相应的接收参数。就报这个错误啊。
【引用】没有的,是遍历以后才关闭的。
这两句话没有必然联系,还是帖出映射与代码,让斑竹为你诊断吧:)
   
0 请登录后投票
最后更新时间:2004-04-26
jboss中hibernate的配置如下:

<server>
<mbean code="net.sf.hibernate.jmx.HibernateService" name="jboss.jca:service=HibernateFactory,                         name=HibernateFactory">
    <depends>jboss.jca:service=RARDeployer</depends>
    <depends>jboss.jca:service=LocalTxCM,name=DataSource</depends>
    <!-- Make it deploy ONLY after DataSource had been started -->
    <attribute name="MapResources">mappings/User.hbm.xml</attribute>
    <attribute name="JndiName">HibernateFactory</attribute>
    <attribute name="Datasource">java:/DataSource</attribute>
    <attribute name="Dialect">net.sf.hibernate.dialect.SybaseDialect</attribute>
    <attribute name="TransactionStrategy">net.sf.hibernate.transaction.JTATransactionFactory</attribute>
    <attribute name="TransactionManagerLookupStrategy">net.sf.hibernate.transaction.JBossTransactionManagerLookup</attribute>
    <attribute name="UseOuterJoin">false</attribute>
    <attribute name="ShowSql">false</attribute>
    <attribute name="UserTransactionName">UserTransaction</attribute>
</mbean>
</server>


mapping文件是这样的。

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"  "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
    <class name="dbdemo.User" table="Users">
        <id name="userID"   unsaved-value="null">
<column name="userID" sql-type="char(32)" not-null="true"/>
            <generator class="uuid.hex"/>
        </id>
<property name="emailAddress">
<column name="emailAddress" sql-type="varchar(16)" not-null="true"/>
</property>
    </class>
</hibernate-mapping>



Session session1 =sessionFactory.openSession();
Transaction tx= session1.beginTransaction();


//Iterator q = session1.iterate("select user from User as user where user.userID like '%'");
//Iterator q = session1.iterate("from User as user where user.userID like '%'");
Iterator q = session1.find("from User as user").iterator();
//Query que=session1.createQuery("from User as user");
//que.setFirstResult(1000);
//que.setMaxResults(1);
//List uList=que.list();
//Iterator q=uList.iterator();
Vector v1=new Vector();
Vector v2=new Vector();
User user=null;
int i=0;
while(q.hasNext()){
i++;
user=(User)q.next();
v1.add(user.getUserID());
v2.add(user.getEmailAddress());
//session1.evict(user);
}
out.print(" total:"+i);
tx.commit();


数据源用的是jboss提供的数据源,这个程序在asa上测试完全通过的,现在就是把jboss的数据源改在另一个sql server2000的服务器上,更改了相应的配置,插入数据是好的,就是在查询的时候用iterate就出错,而find、Query都是可以用的。
   
0 请登录后投票
最后更新时间:2004-04-26
楼主要记住,只要session一关闭,iterator里的数据就会消失,这是它和用find取数据的不同的地方
   
0 请登录后投票
最后更新时间:2004-04-26
我的关闭语句没有贴出来,它是在commit()之后的。

还有就是evict()好像没有启作用啊,加与不加在查询所用的时间是差不多的,而在asa上是很明显的。查询10000条数据在asa上用时在evict()时如下:41048/3704  用jdbc直接连接的用时4334。

我们准备将系统转到hibernate上,现在做一个性能上的测试。如果感兴趣的朋友可以看看这些数据。
   
0 请登录后投票
最后更新时间:2004-04-26
这里是一个性能测试报告,
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐