2011-02-07 66 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(這個固定爲我關閉的連接錯誤)