Java 使用ORMLite的RESTful web服务中的事务

Java 使用ORMLite的RESTful web服务中的事务,java,rest,transactions,ormlite,Java,Rest,Transactions,Ormlite,我正在使用ORMLite框架作为ORM创建RESTful web服务。 我的一些服务是一个事务,这一点很重要——如果发生任何异常,数据库应该回滚 以下是我创建的方法之一: @POST @CONSUMES(MediaType.APPLICATION_JSON) @PRODUCES(MediaType.APPLICATION_JSON) public JSONResponeseLogin getJson(LoginRequest request) { /* Extract data fro

我正在使用ORMLite框架作为ORM创建RESTful web服务。 我的一些服务是一个事务,这一点很重要——如果发生任何异常,数据库应该回滚

以下是我创建的方法之一:

@POST
@CONSUMES(MediaType.APPLICATION_JSON)
@PRODUCES(MediaType.APPLICATION_JSON)
public JSONResponeseLogin getJson(LoginRequest request) {

    /* Extract data from request */

    openDBConnection();
    try {
        TransactionManager.callInTransaction(conn, () -> {
            /* Validate user input and store data to database */
        });
    } catch (InvalidDataInRequestException ex) {
        meta.addError(new ServiceError(errorCode));
        logger.info("Error code: "+ errorCode + " " + ServiceErrorCode.textFromErrorCode(errorCode));
        logger.info("Request: " + request.toString());
        logger.catching(ex);
    } catch (Exception e) {
        meta.addError(new ServiceError(errorCode));
        logger.info("Error code: "+ errorCode + " " + ServiceErrorCode.textFromErrorCode(errorCode));
        logger.info("Request: " + request.toString());
        logger.catching(ex);
    } finally {
        closeDBConnection();
    }

    response.setMetaData(meta);
    return response;
}
我有几个问题:

  • 我用错工具做这项工作了吗?我希望我的整个方法是一个事务,但我觉得ORMLite的TransactionManager并不是为这个而设计的

  • 事务中发生的每个异常都被包装到SQLException中(由TransactionManager)。我无法区分和/或处理不同类型的异常。它们都会陷入异常块。我应该怎么做

  • 编辑: 我找到了一个可能的解决办法

    在整个REST方法的生命周期中,我可以使用单个连接实例(从ConnectionSource.getReadWriteConnection()获取)。 我可以将所述连接上的自动提交设置为false,并在抛出异常时手动回滚

    问题是我的
    DAO
    对象正在使用
    JdbcPooledConnectionSource
    进行初始化

    我唯一想到的问题是,在每秒将收到10-20个请求的服务器上执行此操作是安全的-必须有一个原因
    DAO
    是否接受整个池

    亲切的问候

    我用错工具做这项工作了吗?我希望我的整个方法是一个事务,但我有一种感觉,ORMLite的
    TransactionManager
    并不是为此而设计的

    不,是的。在“可能的解决方法”部分,这正是
    TransactionManager
    正在做的:

    • 获得单一连接
    • 停止自动提交
    • 开始一项交易
    • 做数据库工作
    • 停止并提交事务
    • 恢复自动提交
    事务中发生的每个异常都被包装到SQLException中(通过
    TransactionManager

    对。
    TransactionManager
    需要捕获异常,以便回滚事务,但我不想从方法中抛出
    Exception

    您可以捕获
    SQLException
    ,然后手动检查
    e.getCause()
    输出。有点粗糙,但如果您想查看异常,这是必要的

    在每秒将收到10-20个请求的服务器上这样做安全吗?DAO接受整个池肯定是有原因的

    我不是100%确定你说的安全是什么意思。我假设Android可以同时处理10-20个开放数据库连接。对于Android/Sqlite来说,这是一个比ORMLite更重要的问题。当然,这是假设数据库作业完成所需时间不到一秒钟

    我用错工具做这项工作了吗?我希望我的整个方法是一个事务,但我有一种感觉,ORMLite的
    TransactionManager
    并不是为此而设计的

    不,是的。在“可能的解决方法”部分,这正是
    TransactionManager
    正在做的:

    • 获得单一连接
    • 停止自动提交
    • 开始一项交易
    • 做数据库工作
    • 停止并提交事务
    • 恢复自动提交
    事务中发生的每个异常都被包装到SQLException中(通过
    TransactionManager

    对。
    TransactionManager
    需要捕获异常,以便回滚事务,但我不想从方法中抛出
    Exception

    您可以捕获
    SQLException
    ,然后手动检查
    e.getCause()
    输出。有点粗糙,但如果您想查看异常,这是必要的

    在每秒将收到10-20个请求的服务器上这样做安全吗?DAO接受整个池肯定是有原因的

    我不是100%确定你说的安全是什么意思。我假设Android可以同时处理10-20个开放数据库连接。对于Android/Sqlite来说,这是一个比ORMLite更重要的问题。当然,这是假设数据库作业完成所需时间不到一秒钟