通过hibernate的Session得到conn执行sql的问题。

cklxh520 2010-10-25 08:14:36
Dao方法:

public Connection getConnection()
{
Connection conn=this.getSession().connection();

return conn;
}



Spring配置:

<bean id="DataSourceDAO"
class="net.segns.dataSource.DataSourceImp" >
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>



测试代码:

public static void main(String[] args) {
int c=0;
try {

Connection conn=getCon();
PreparedStatement ps=conn.prepareStatement("select * from sys_area order by areaid");
ResultSet rs=ps.executeQuery();
while( rs.next())
c++;
} catch (Exception e) {
System.out.println("有:"+c);
e.printStackTrace();
}

}

异常:

有:1068
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.validateClosedState(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.validateClosedState(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.commonFetchInitialize(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.next(Unknown Source)
at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:196)
at net.segns.common.util.db.SQLHandle.main(SQLHandle.java:305)


很郁闷,我感觉应该是 spring帮我管理了连接,给我关闭了。。但是我又不知道是什么地方管理的。数据实际几千条,但是有时能读出1000多,有时2000多,如果数据量小就不会报错。
...全文
351 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cklxh520 2010-10-25
  • 打赏
  • 举报
回复
上面Dao类DataSourceImp .java有一个方法名贴错了,下面这个才是正确的。

package net.segns.dataSource;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class DataSourceImp extends HibernateDaoSupport implements DataSource {


public void eee()
{
Connection conn=this.getSession().connection();
int c=0;
try {

PreparedStatement ps=conn.prepareStatement("select * from sys_area order by areaid");
ResultSet rs=ps.executeQuery();
while( rs.next())
c++;
rs.close();
ps.close();
conn.close();
} catch (Exception e) {
System.out.println("有:"+c);
e.printStackTrace();
}

}

}

cklxh520 2010-10-25
  • 打赏
  • 举报
回复
Dao类:DataSourceImp.java


package net.segns.dataSource;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class DataSourceImp extends HibernateDaoSupport implements DataSource {


public Connection getConnection()
{
Connection conn=this.getSession().connection();
int c=0;
try {

PreparedStatement ps=conn.prepareStatement("select * from sys_area order by areaid");
ResultSet rs=ps.executeQuery();
while( rs.next())
c++;
rs.close();
ps.close();
conn.close();
} catch (Exception e) {
System.out.println("有:"+c);
e.printStackTrace();
}
return conn;
}

}



Spring配置:sessionfactory.xml

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<description>sessionFactory</description>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>hibernatecfg/org_broadcastschedule.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>
</beans>



Spring配置:DataSource.xml

<bean id="DataSourceDAO"
class="net.segns.dataSource.DataSourceImp" >
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>


测试方法:

public static void main(String[] args) {

try {
DataSource ds=(DataSource)SpringApplicationContextFactory
.getService("DataSourceDAO");

ds.eee();

} catch (Exception e) {

e.printStackTrace();
}

}


异常打印:

有:1930
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.validateClosedState(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.validateClosedState(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.commonFetchInitialize(Unknown Source)
at com.microsoft.jdbc.base.BaseResultSet.next(Unknown Source)
at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:196)
at net.segns.dataSource.DataSourceImp.eee(DataSourceImp.java:21)
at net.segns.common.util.db.SQLHandle.main(SQLHandle.java:304)

wwm402654282 2010-10-25
  • 打赏
  • 举报
回复
你的方法改了么? 全部贴出来看看
cklxh520 2010-10-25
  • 打赏
  • 举报
回复
sessionFactory 是这样的,其它地方都正常。


<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<description>sessionFactory</description>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
... <value>hibernatecfg/org_broadcastschedule.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>
</beans>



还有一点:异常前有一个
WARN ConnectionManager:376 - unclosed connection, forgot to call close() on your session?
警告,说我session没关,我郁闷了。。数据都没查询完就异常了,还说我没关session。
wwm402654282 2010-10-25
  • 打赏
  • 举报
回复
你配置了sessionFactory 配对了的话 就这样写呀

Session session = this.getSession();
Connection con = session.connection();
PreparedStatement ps = con.prepareStatement(select * from sys_area order by areaid);//预处理
ps.execute();//执行操作
cklxh520 2010-10-25
  • 打赏
  • 举报
回复
是因为程序是以前的程序,写的不规范。。用了hibernate和JDBC,hibernate的缓存会引起问题,现在就用用hibernate去得到连接来执行sql。所以才搞的这么一出。
wwm402654282 2010-10-25
  • 打赏
  • 举报
回复
使用hibernate的时候 直接获取session hibernate帮你管理的就是连接 你在这里使用了hibernate还获取连接没什么意义吧

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧