RESTful Web服务中可以使用JDBC保存点吗?

时间:2019-06-13 11:44:09

标签: rest jdbc web-applications savepoints

我的Web应用程序中有一个网格,使用jQuery API可直接从Web服务获取数据。要求是

  1. 允许用户对其数据进行一些更改
  2. 撤消是否要
  3. 最终提交更改

要实现此目的,我使用了JDBC保存点并将其保存在堆栈中,该堆栈允许撤消操作。我要在更新语句之前设置一个保存点,在撤消上,我希望它回滚到最后一个保存点,提交很简单。

我首先在桌面应用程序上对其进行了测试,并且效果很好,但是在基于Web的应用程序中,它无法正常工作。

数据库连接类

private static Map<String, Connection> userConnections;

public static Connection getConnection(configsJson) {
  ... //getdata from json
  if (userConnections == null) {
    userConnections = new HashMap<>();
  } else {
    userConnection = userConnections.get(userKey);
  }

  if (userConnection == null) {
    userConnection = DriverManager.getConnection("jdbc:oracle:thin:@" + sourceIP + ":" + sourcePort + ":" + sourceInstance, sourceUser, sourcePass);
    userConnection.setAutoCommit(false);
    userConnections.put(userKey, userConnection);
  }
  return userConnection;
}

我的更新功能

private static Map<String, Stack<Savepoint>> userSavePoints = new HashMap<>();

@ResponseBody
@RequestMapping(value = "/webservice/updateRecord", method = RequestMethod.POST)
public int updateRecord(HttpServletRequest request, @RequestParam String configs) throws SQLException, JSONException, ParseException {
    Connection con = DBService.getConnection(configJson);
    ...
    userSavePoints.get(userKey).push(con.setSavepoint());
    return statement.executeUpdate(sql);

}

如果这里没有savepoint语句,那么更新后我可以在我的网页上看到更改的记录,因为自动提交设置为false,所以这些记录尚未保存在数据库中。问题在于此保存点语句,网格不显示更改的记录。在我看来,似乎记录没有更新,或者它们自动回滚到该保存点。

我的逻辑有问题吗?还是这些保存点不适用于宁静的api?

1 个答案:

答案 0 :(得分:0)

我什至没有发现一个愚蠢的错误,该行返回null并且没有继续进行。控制台也没有显示任何异常。

  

userSavePoints.get(userKey)

我只需要初始化它即可解决我的问题。