0

ここで何が問題なのかを見つけるのに大きな頭痛の種です..

セッション ファクトリからセッションを取得し、永続オブジェクトから clob を取得します。clob.getCharcterStream() または getAsciiStream() になると、例外がスローされます - 接続が閉じられました。

誰かがこれで私を助けることができますか?

コード:

    Session session = Dao.getSession(connId);
    Package pack = (Package) session.load(Package.class, packId);
    Hibernate.initialize(pack);

    Clob reportClob = pack.getExpReportFile();

    String result = null;
    InputStream stream = null;
    try
    {
        System.out.println(session.isConnected() + " " + session.isOpen());
        stream = reportClob.getAsciiStream();
        result = IOUtils.toString(stream);

    }
    catch (SQLException e)
    {
        e.printStackTrace();
    }
    return result;

例外 :

true true
 java.sql.SQLException: Closed Connection
at oracle.sql.CLOB.getDBAccess(CLOB.java:1389)
at oracle.sql.CLOB.getAsciiStream(CLOB.java:330)
at org.hibernate.lob.SerializableClob.getAsciiStream(SerializableClob.java:68)
at com.server.WebServiceImpl.fetchPackageReport(WebServiceImpl.java:2070)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:562)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:188)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:224)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
4

3 に答える 3

2

このエラーの理由は、エンティティが接続されているセッションが現在閉じられているためです。

自動コミットをオフにしてデータベース接続を試す(hibernate.connection.autocommitか、開いているトランザクションが必要です。

于 2011-02-07T17:50:46.053 に答える
0

システムプロパティを追加してみてくださいhibernate.jdbc.use_streams_for_binary=true(これにより、閉じた接続エラーが修正されました)

于 2011-06-08T21:58:56.567 に答える
0

Clob にする必要がある特定の理由はありますか? サンプル コードを見ると、文字列に入れているように見えStringます。これで問題は解決するはずです。char[]Clob

文字列にASCII文字のみを含める必要がある場合は、いつでも次のようにすることができます。

String ascii = new String(oldString.getBytes("ASCII"),"ASCII");

警告: 使用するように変更すると、このバグStringに遭遇する可能性がありますが、試してみる価値はあります。

于 2011-02-07T23:32:01.753 に答える