прочитать сгусток из оракула, используя спящий режим

У меня большая головная боль, чтобы выяснить, в чем здесь проблема.

Я получаю сеанс из фабрики сеансов, а затем получаю клочок из постоянного объекта. Когда дело доходит до 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)

person JSixface    schedule 07.02.2011    source источник


Ответы (3)


Причина этой ошибки в том, что сеанс, к которому подключена ваша сущность, теперь закрыт.

попробуйте соединение с базой данных с отключенной автоматической фиксацией (hibernate.connection.autocommit) или вам нужна открытая транзакция.

person ayush    schedule 07.02.2011
comment
отключение автофиксации не работает, ага... и для открытой транзакции я вставил session.beginTransaction() сразу после оператора Hibernate.initialize()... это тоже не сработало... - person JSixface; 07.02.2011
comment
какая БД оракула? оракул 9? - person ayush; 07.02.2011
comment
Теперь это сработало.. Я вставил session.beginTransaction() внутри блока try, и теперь он работает.. но я не могу понять, почему он работает сейчас, а не раньше.. может быть, какая-то проблема с областью действия, я надеюсь.. - person JSixface; 08.02.2011

Есть ли конкретная причина, по которой вам нужно, чтобы это был Clob? Глядя на пример кода, похоже, что вы помещаете его в String, а Hibernate поддерживает размещение Clobs в String, char[] и Clob. Это должно решить проблему.

Если требуется, чтобы в строке были только символы ASCII, вы всегда можете сделать что-то вроде:

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

Предупреждение: если вы перейдете на использование String, вы можете столкнуться с этой ошибкой, однако попробовать все равно стоит .

person Thomas    schedule 07.02.2011
comment
Я храню некоторый файл HTML и XML в CLOB. Размер файла XML может иметь максимальный размер 2 МБ. Вот почему я использую clob .. - person JSixface; 08.02.2011

Вы можете попробовать добавить системное свойство hibernate.jdbc.use_streams_for_binary=true (для меня это исправило ошибки закрытого соединения)

person Swen Thümmler    schedule 08.06.2011