使用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到底是新获取的,还是怎么回事?谢谢

解决方案 »

  1.   

    你这里获取的connection不用关闭,你只要管理好你的session就可以了
      

  2.   

    我一般用query = session.createSQLQuery(sql);来执行本地sql
      

  3.   

    Session session = getSessionFactory().openSession();
    String sql = "select...";
    Query query = (Query) session.createQuery(sql);
    List list = query.list();
    session.close();
      

  4.   

    我写了一个公共的类执行sql,是这样的:
    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吗?
    请高人指点。
      

  5.   

    我也用这个  没有用到statement 这种  很少见
      

  6.   

    hibernate  可以执行原声的sql语句,不用在创建 Connection 对象了
      

  7.   

    执行原生态的sql可以用createNativeQuery
      

  8.   

    既然要用hibernate了,怎么还有jdbc代码,这不是很乱吗?用hql语句操作就是了,不建议两个嵌套用,这样很乱还不好管理。也不建议用createSQLQuery()方法执行本地查询语句,效果很差。
      

  9.   

    使用Hibernate的回调方法(new HibernateCallback(){XXX})。。不要直接使用getSession(),直接使用getSession的话,spring不能管理事务。。然后使用回调参数里边的那个session来进行获取数据库连接操作
      

  10.   


    new HibernateCallback() { 
       public Object doInHibernate(Session s) throws HibernateException, 
         SQLException { 
        java.sql.Connection con=s.connection() ;//得到了一个原生的Connection对象
       } 
      }
      

  11.   

    这样写后就不需要你在另外去写什么开启事务 ,关闭 数据库连接了(在spring进行了正确配置 的情况下,spring会自动按你的配置进行管理的)
      

  12.   

    管理session就行了   
      

  13.   

    使用了hibernate就可以不用使用sql语句进行查询呀 而且使用了spring的话可以都交给spring管理 
      

  14.   

    Hibernat就是封装了jdbc  现在lz在hibernate中使用jdbc  这样用hibernate干什么呢