Hibernate + Resteasy + Blobstream

я использую resteasy и сохраняю большие двоичные объекты с помощью спящего режима

я настроил открытый сеанс в представлении

мой обработчик отдыха не является транзакционным, моя служба, которая извлекает java.sql.blobs, является транзакционной.

Проблема: после извлечения блоба в службе jdbc-соединение закрывается HibernateTransactionManager:doCleanupAfterCompletion (сеанс гибернации не закрывается)

поэтому остальные не могут прочитать поток больших двоичных объектов позже, потому что он работает, только если одно и то же jdbc-соединение все еще открыто

как я могу в спящем режиме научить не закрывать jdbc-соединение после транзакционной сервисной функции?

Он должен закрыть его, когда сеанс закрыт


person wutzebaer    schedule 03.12.2012    source источник
comment
Как вы думаете, почему вы не можете прочитать большой двоичный объект из другого соединения?   -  person Stanislav Bashkyrtsev    schedule 03.12.2012
comment
потому что я закрываю соединение с исключением, когда пытаюсь читать из него   -  person wutzebaer    schedule 04.12.2012


Ответы (1)


я решил это, создав поставщика для BLOB-объектов, заимствованного из InputSTream-Provider.

@Provider
@Produces("*/*")
public class BlobProvider implements MessageBodyWriter<Blob> {

    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return Blob.class.isAssignableFrom(type);
    }

    public long getSize(Blob blob, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return -1;
    }

    public void writeTo(Blob blob, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException {
        SessionFactory sessionFactory = (SessionFactory) Utils.getBean("sessionFactory");
        sessionFactory.getCurrentSession().beginTransaction();
        InputStream inputStream = null;
        try {
            inputStream = blob.getBinaryStream();
            int c = inputStream.read();
            if (c == -1) {
                httpHeaders.putSingle(HttpHeaderNames.CONTENT_LENGTH, Integer.toString(0));
                entityStream.write(new byte[0]); // fix RESTEASY-204
                return;
            } else
                entityStream.write(c);
            ProviderHelper.writeTo(inputStream, entityStream);
        } catch (SQLException e) {
            Utils.logError(e);
        } finally {
            if (inputStream != null)
                inputStream.close();
        }
        sessionFactory.getCurrentSession().getTransaction().commit();
    }
}
person wutzebaer    schedule 11.11.2013