2

我正在尝试找到一种解决方案来为我们的 web 应用程序建立可靠性。如果网络连接/数据库连接丢失,计划是转储 sql 和数据。在当前的实现中,我们有 Rest 控制器、Service、DAO。DAO 抛出PersistenceExcetpion,并传播到控制器层。

示例代码:

public MyDAOClass {
    public void save(Object object) {
        try {
            entityManager.persist(object);
        } catch (PersistenceException e) {
            throw new DBException("Error occurred in save", e);
        }
    }
}

DBException是一个运行时异常。

现在是真正的问题。其中一位队友建议有自定义例外,例如。InsertException, UpdateException等等,如果我们遇到这些异常中的任何一个,我们就会知道对该实体执行了哪些操作,以便可以将其作为适当的 sql.xml 保存到文件中。

例如。假设代码无法保存Employee实体。这将抛出InsertException,并将在文件中创建一个条目作为该实体的插入 sql 语句。insert into employeee values ('firstname','lastname');

对我来说,在连接丢失时实现创建 sql 文件的想法似乎并不像实现上述那样简单。

我提出的问题是 1) 在服务方法中执行多个操作(如插入、更新、删除的任意组合)时,您如何处理?2)不同的例外呢?我的意思是,原因PerisistenceException可能是约束失败、找不到实体等,而不仅仅是连接问题。

有没有办法实现上述场景,它也考虑了所有不同的条件。

谢谢。

更新: 基于 chrylis 的评论。我应该已经将此添加到问题中。这是一个在不同零售店本地运行的网络应用程序。并且应用程序不能停机,所以如果有任何连接问题,应用程序应该继续工作。该文件稍后将与中央数据库服务器同步。

4

1 回答 1

0

使用 spring,您可以使用 Hibernate ORM 将数据存储到数据库中。如果在任何请求期间发生异常,它将被休眠回滚。这取决于您将@Transnational 注释放在哪里。

我们使用处理事务的服务层。因此,如果服务层中的数据库操作或任何其他操作失败并引发异常,则事务将由休眠自动回滚。然后,我们使用 spring 异常解析器来处理任何异常并将自定义错误写入日志和用户。我想您也可以将异常存储在另一个数据库中,如果这很有趣的话,我认为记录它们就足够了。

这篇文章教你更多关于一般异常处理的知识。

这是我们的异常解析器。

import ...

@ControllerAdvice
public class SpringExceptionResolver {

    Logger logger = LoggerFactory.getLogger("com.realitylabs.event.controller.RecoverController"); 


    @ExceptionHandler({CorruptedSessionUserException.class})
    @ResponseBody
    @ResponseStatus(value=HttpStatus.FORBIDDEN)
    public ErrorObject userNotFoundExceptionHandler() {
      // Handle exception
      // log using the logger.
      // We usually return an error object in JSON so that we can show custom    // error messages.
    }


}

这是服务的外观。我们通常从控制器调用我们的服务。如果来自控制器时抛出异常,建议将处理它。

import ...

@Service(value="ObjectService")
@Transactional
public class ObjectServiceImpl implements ObjectService {

  @Autowired
  private ObjectDAO objectDAO;

  @Override
  public Object get(int id) {
    Object o = objectDAO.get(id);
    Hibernate.initialize(o.getVoters());
    return o;
  }

}

我希望这有帮助。

于 2015-12-20T10:23:33.633 回答