2012-01-27 12 views
1

私はその後、私はHibernateのエンティティに戻さカーソルをマップ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; 

を返すPL/SQLストアド・プロシージャを定義しています。

.... 
@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/ –

答えて

1

このカーソルを閉じる方法はありません。 Hibernateのリファレンスでは、ストアド・プロシージャをクエリに使用するときにカーソルを返す必要があります。

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

私の推測では、Hibernateはクエリ結果を反復するために使用するResultSetに返されたカーソルを変換することです。 ResultSetが開いたままであれば、深刻な休止状態のバグになります。 データベース接続プールがjdbc接続/文をリサイクル/クローズすると、このResultSetは最悪の場合閉鎖されます。

+0

私は、これは非常に考えた答えだと思います。回答ありがとうございます。 –

関連する問題