2015-09-17 152 views
1

我使用ORMLite使用ORMLite框架来创建REST风格的Web服务。 重要的是我的一些服务是一个事务 - 如果发生任何异常,数据库应该回滚。使用ORMLite在REST风格的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; 
} 

我有几个问题:

  1. 我使用错误的工具这份工作?我希望我的整个方法是一个事务,但我有一种感觉,ORMLite的TransactionManager不是为此而做的。

  2. 在事务中发生的每个异常都被包装到SQLException中(通过TransactionManager)。我无法区分和/或处理不同类型的例外情况。他们都被抓到了Exception块。我应该如何处理?

编辑: 我发现了一个可能的解决方法。

我整个REST方法的生命周期中使用单个连接实例(从ConnectionSource.getReadWriteConnection())获得。 我可以设置自动提交到虚假所述连接和做手工回滚如果异常被抛出。

问题是,我DAO对象是使用JdbcPooledConnectionSource其初始化

这发生在我唯一的问题是这个安全上做服务器将获得〜每秒10-20的要求 - 必须有一个原因DAO正在接受全池?

亲切的问候。

回答

0

我是否在这项工作中使用了错误的工具?我想我的整个方法是一个交易,但我有一种感觉,来自ORMLite的TransactionManager不是为了这个。

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

  • 获取单个连接。
  • 停止自动提交。
  • 开始交易。
  • 做数据库工作。
  • 停止并提交事务。
  • 恢复自动提交。

发生在事务每个异常,包裹成的SQLException(由TransactionManager)。

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

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

这是安全的服务器上会做〜每秒10-20个请求 - 必须有一个原因DAO接受整个池?

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