2012-01-27 43 views
1

我已經定義了一個PL/SQL存儲過程,它返回一個SYS_REFCURSORHibernate是否自動關閉參考光標?

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對象被檢索後自動關閉遊標或程序員是否必須手動關閉它?

在此先感謝。

+0

我想這個鏈接或多或少地回答我的問題: http://www.zugiart.com/2010/08/handling-oracle-cursors-in-jdbc/ – 2012-01-30 09:34:11

回答

1

您無法關閉此遊標。 Hibernate引用希望您在使用存儲過程進行查詢時返回一個遊標。

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

我的猜測是,休眠轉換返回光標移到用於迭代查詢結果的ResultSet。如果ResultSet保持打開狀態,那將是一個嚴重的Hibernate錯誤。 無論如何,當數據庫連接池回收/關閉jdbc連接/語句時,最糟糕的情況是關閉此ResultSet。

+0

我認爲這是一個非常想到的答案。謝謝回答。 – 2012-01-30 01:58:31