使用hibernate从oracle中读取clob

时间:2011-02-07 17:39:00

标签: java oracle hibernate clob

我很难找到问题所在......

我从会话工厂获得一个会话,然后从持久对象中获取clob。当涉及到clob.getCharcterStream()或getAsciiStream()时,它会抛出异常 - Closed连接。

有人可以帮助我。

代码:

    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)

3 个答案:

答案 0 :(得分:2)

此错误的原因是您的实体所附加的会话现已关闭。

尝试db connection with autocommit turned off (hibernate.connection.autocommit)或者您需要一个开放的交易。

答案 1 :(得分:0)

是否有特定原因需要它成为Clob?查看示例代码,看起来您将它放入String中,Hibernate支持将Clobs放入Stringchar[]Clob。这应该可以解决问题。

如果要求字符串中只包含ASCII字符,则可以执行以下操作:

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

警告:如果您更改为使用String,则可能会遇到this bug,但仍值得一试。

答案 2 :(得分:0)

您可以尝试添加系统属性hibernate.jdbc.use_streams_for_binary = true(这为我修复了已关闭的连接错误)