【问题标题】:Does Hibernate close the reference cursor automatically?Hibernate 会自动关闭引用光标吗?
【发布时间】:2012-01-27 15:04:06
【问题描述】:

我已经定义了一个 PL/SQL 存储过程,它返回一个 SYS_REFCURSOR

CREATE OR REPLACE PROCEDURE findByName
(  res OUT SYS_REFCURSOR, 
   vName IN emp.name%type  ) AS
BEGIN
  OPEN res FOR
    SELECT * FROM emp WHERE name = vName;
END findByName;

然后,我将返回的光标映射到 Hibernate 实体。

....
@Entity
@org.hibernate.annotations.NamedNativeQuery(name = "findByName", query = "call findByName(?, :vName)", callable = true, resultClass = Employee.class)
@Table(name = "EMP", schema = "WEBUI")
public class Employee implements java.io.Serializable {
....

这是一个调用存储过程的DAO方法。

....
public Employee findByName(final String name) {
    Session session = factory.getSession();
    Query query = session.getNamedQuery("findByName");
    query.setString("vName", name);
    return (Employee) query.uniqueResult();      
}
....

如果我从 PL/SQL 代码调用存储过程,我会这样做。

DECLARE
    emp_cursor  SYS_REFCURSOR;
    emp_rec emp_cursor%ROWTYPE;
BEGIN
    findByName 
    (  res => emp_cursor,
       vName => 'Timothy Jones');
    FETCH emp_cursor
        INTO emp_rec;
    DBMS_OUTPUT.PUT_LINE(emp_rec.name);
    CLOSE emp_cursor; -- close the cursor
END;

我想强调一个事实,即有必要以某种方式关闭emp_cursor。否则会导致内存泄漏。

我的问题是: Hibernate 是如何处理这个问题的?是在 Employee 对象被检索后自动关闭光标还是程序员必须手动关闭它?

提前致谢。

【问题讨论】:

标签: hibernate plsql


【解决方案1】:

您无法关闭此光标。 Hibernate 引用希望您在使用存储过程进行查询时返回游标。

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querysql.html#sp_query

我的猜测是 hibernate 将返回的游标转换为用于迭代查询结果的 ResultSet。如果 ResultSet 保持打开状态,这将是一个严重的休眠错误。 无论如何,当数据库连接池回收/关闭 jdbc 连接/语句时,这个 ResultSet 在最坏的情况下关闭。

【讨论】:

  • 我认为这是一个非常深思熟虑的答案。感谢您的回答。
猜你喜欢
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2021-12-16
相关资源
最近更新 更多