0

私はresteasyを使用しており、休止状態でブロブを保存しています

ビューで開いているセッションを構成しました

私のrest-handlerは非トランザクションであり、java.sql.blobを取得する私のサービスはトランザクションです。

問題: サービスで blob を取得した後、jdbc 接続が HibernateTransactionManager:doCleanupAfterCompletion によって閉じられます (休止状態セッションは閉じられません)。

同じjdbc接続がまだ開いている場合にのみ機能するため、残りは後でブロブストリームを読み取ることができません

トランザクション サービス関数の後に jdbc 接続を閉じないように教えて休止状態にするにはどうすればよいですか?

セッションが閉じられると、それを閉じる必要があります

4

1 に答える 1

0

InputSTream-Provider から採用された Blob のプロバイダーを作成することで解決しました

@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();
    }
}
于 2013-11-11T13:37:41.220 に答える