使用ORMLite在RESTful Web服务中进行事务

时间:2015-09-17 09:31:42

标签: java rest transactions ormlite

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

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

onActivityCreated

我有几个问题:

  1. 我是否使用错误的工具来完成这项工作?我希望我的整个方法都是一个事务,但我觉得来自ORMLite的TransactionManager不是为此做的。

  2. 事务中发生的每个异常都包含在SQLException中(通过TransactionManager)。我无法区分和/或处理不同类型的异常。它们都被异常块所捕获。我应该怎么做?

  3. 修改: 我找到了可能的解决方法。

    我可以使用单个连接实例(在整个REST方法的生命周期中从@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; } 获得。 我可以在所述连接上将auto-commit设置为false,并在抛出异常时进行手动回滚。

    问题是我的ConnectionSource.getReadWriteConnection())个对象正在使用DAO进行初始化。

    我遇到的唯一问题是在服务器上安全可行,每秒可获得约10-20个请求 - 必须有JdbcPooledConnectionSource接受整个池的原因吗?

    亲切的问候。

1 个答案:

答案 0 :(得分:0)

  

我是否使用错误的工具来完成这项工作?我希望我的整个方法都是一个事务,但我觉得来自ORMLite的TransactionManager不是为此做的。

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

  • 获得一个连接。
  • 停止自动提交。
  • 开始交易。
  • 数据库是否正常工作。
  • 停止并提交交易。
  • 恢复自动提交。
  

事务中发生的每个异常都包含在SQLException中(由TransactionManager)。

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

您可以捕获SQLException,然后手动检查e.getCause()输出。如果你想看看例外情况,有点苛刻但是必要。

  

在服务器上这样做是否安全,每秒可以获得~10-20个请求 - DAO是否有理由接受整个池?

我不是100%肯定你的意思是安全的。我假设Android可以同时处理10-20个打开的数据库连接。对于Android / Sqlite而言,这更像是一个问题,然后是ORMLite。当然,这假设您的db作业完成所需的时间不到一秒。