2011-02-07 69 views
0

我有在找出什么是这里的问题大伤脑筋从Oracle CLOB ..阅读使用Hibernate

我从会话工厂一个会话,然后得到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) 

回答

2

这样做的原因错误是你的实体连接的会话现已结束。

尝试db connection with autocommit turned off(hibernate.connection.autocommit)或者您需要一个打开的事务。

+0

关闭自动提交不起作用AYUSH ..和一个开放的交易,我插session.beginTransaction()紧跟在Hibernate.initialize()语句后面,也没有解决.. – JSixface 2011-02-07 18:04:15

+0

是哪个oracle数据库呢? oracle 9? – ayush 2011-02-07 18:20:39

0

是否有一个特定的原因,你需要它是一个Clob?看看示例代码,它看起来像你把它放到一个字符串中,休眠支持将Clobs放入Stringchar[]Clob。这应该解决这个问题。

如果要求是只有ASCII字符的字符串中,你总是可以这样做:

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

警告:如果更改使用String你可能会碰到this bug,但它仍然是值得一试。

0

你可以尝试添加系统属性hibernate.jdbc.use_streams_for_binary在= TRUE(这个固定为我关闭的连接错误)