问题描述:在spring+hibernate的结构中,用session获得Connection后,调用oracle自定义函数时,在页面每执行一次查询,都导致open_cursor增加,关闭web服务后cursor全部释放,自定义函数是类似"select .... into ... from .... "的简单语句个人分析:首先select into 中的确有个隐式游标,不过当和oracle的连接断开时,这个游标自动被释放,不会增加open_cursor的值。个人感觉是代码中没有关闭连接,但的确写有关闭连接语句,并且在每次进入时输入的log也显示conn为null。请教大家导致open_cursor的原因大概在何处,以下是代码,如不足提供分析问题的信息,请各位提出。谢谢大家
以下是出现问题的部分代码:

public class PageReference extends HibernateDaoSupport {
public List sqlfind(final String sql, final Object[] paramObj) {
try {
List list = null; if (conn == null || conn.isClosed())
conn = super.getSession().connection();
if (sql == null || "".equals(sql)) {
return new ArrayList();
}
if (paramObj == null) {
try {
st=conn.createStatement();
rs=st.executeQuery(sql);
list = formatArrayList(rs);
} catch (Exception ex) {
log.info( ex.getCause() + ":" + ex.getMessage());
}
} else {
ps = conn.prepareStatement(sql);
for (int i = 0; paramObj != null && i < paramObj.length; i++) {
if (paramObj[i] == null) {
ps.setObject(i + 1, "");
} else if (paramObj[i] != null && paramObj[i].getClass().getSimpleName().equalsIgnoreCase("date")) {
ps.setTimestamp(i + 1, new java.sql.Timestamp(((java.util.Date) paramObj[i]).getTime()));
} else {
ps.setObject(i + 1, paramObj[i]);
}
}
rs=ps.executeQuery();
list = formatArrayList(rs);
}
return list;
} catch (Exception ex) {
return new ArrayList();
} finally {
try {
if (conn != null) {
conn.close();
conn = null;
}
if (st != null) {
st.close();
st = null;
}
if (ps != null) {
ps.close();
ps = null;
}
if (rs != null) {
rs.close();
rs = null;
}
} catch (Exception ex) { }
}
}
public ArrayList formatArrayList(ResultSet rs) {
try {
ArrayList list = new ArrayList(); if (rs == null)
return list; int k = rs.getMetaData().getColumnCount(); while (rs.next()) {
ArrayList listTemp = new ArrayList();
listTemp.add(0, new Integer(k));
for (int i = 1; i <= k; i++) {
listTemp.add(i, rs.getObject(i));
}
list.add(listTemp);
} return list;
} catch (Exception ex) {
log.info("formate:::" + ex.getCause() + ":::" + ex.getMessage() + ":::" + ex.getLocalizedMessage());
try {
rs.close();
rs=null;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} finally {
try {
rs.close();
rs=null;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

解决方案 »

  1.   

    看这样的代码就知道是新手写的!1、不要将Resultset作为参数传递
    2、在formatArrayList(ResultSet rs) close rs,又在声明方法的finally close
    3、建议 多学习 jdbc 自己带的代码例子!
      

  2.   

    不太清楚,我们的框架是这样写的:
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
    public abstract class G extends HibernateDaoSupport{
    ...public Object executeSql(String  sql) throws Exception{

    List result =new ArrayList();
    try {
     this.beginTransaction();
     result= this.getHibernateTemplate().getSessionFactory().getCurrentSession().createSQLQuery(sql).list();
     this.commitTransaction();
    } catch (Throwable e) {
     logger.debug(e);
     this.endTransaction();
    }
    return result;
    }}不是很了解spring,hibernate