使用SSH开发的项目,想在hibernate中执行原生的select语句,使用如下方法:
String sql="select ...";
Connection con=session.connection();
Statement st=con.createStatement();
ResultSet rs=st.executeQuery(sql);
...
st.close();
rs.close();
现在的问题是,获取的connection不能关闭,一关闭的话,就抛异常了
java.sql.SQLException: You can't operate on a closed Connection!!!
如果不关闭,等项目运行一段时间,数据库的链接就满了。
请高手指点,此处该怎么办,到底需不需要关闭该connection,还有,此处的session应该是spring管理了的,从session中取出的connection到底是新获取的,还是怎么回事?谢谢
String sql="select ...";
Connection con=session.connection();
Statement st=con.createStatement();
ResultSet rs=st.executeQuery(sql);
...
st.close();
rs.close();
现在的问题是,获取的connection不能关闭,一关闭的话,就抛异常了
java.sql.SQLException: You can't operate on a closed Connection!!!
如果不关闭,等项目运行一段时间,数据库的链接就满了。
请高手指点,此处该怎么办,到底需不需要关闭该connection,还有,此处的session应该是spring管理了的,从session中取出的connection到底是新获取的,还是怎么回事?谢谢
String sql = "select...";
Query query = (Query) session.createQuery(sql);
List list = query.list();
session.close();
public class Common<POJO> extends HibernateDaoSupport {
private Statement st=null;
private ResultSet rs=null; public ResultSet querySql(final String sql) throws CommonException{
try{
return (ResultSet) super.getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws SQLException, HibernateException {
Connection con=session.connection();
st=con.createStatement();
rs=st.executeQuery(sql);
return rs;
}
});
} catch (Exception e) {
e.printStackTrace();
throw new CommonException(e);
}
} public void closed() throws CommonException{
try {
if(st!=null)
{
st.close();
}
if(rs!=null)
{
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
throw new CommonException(e);
}
}}
在dao中,调用querySql执行sql得到ResultSet,取出数据后,在调用closed()。
查了一些资料,说这样使用session,spring并没有去关闭,不知道是不是。
按一楼所说,只需管理好session,那这个地方spring会去管理我在上面所使用的session吗?
请高人指点。
new HibernateCallback() {
public Object doInHibernate(Session s) throws HibernateException,
SQLException {
java.sql.Connection con=s.connection() ;//得到了一个原生的Connection对象
}
}