在Spring JPA webapp

时间:2015-12-20 03:46:44

标签: java spring jpa reliability robustness

我正在尝试找到一种在我们的webapp中构建可靠性的解决方案。如果网络连接/数据库连接丢失,计划是将sql与数据一起转储。在当前的实现中,我们有Rest控制器,服务,DAO。 DAO抛出PersistenceExcetpion,然后传播到Controller层。

示例代码:

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文件中。

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

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

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

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

感谢。

更新 根据chrylis的评论。我应该已经将这个问题添加到了这个问题中。它是一个在不同零售店本地运行的webapp。并且应用程序无法停机,因此如果出现任何连接问题,应用程序应该继续工作。该文件稍后将与中央数据库服务器同步。

1 个答案:

答案 0 :(得分:0)

使用spring,您可以使用Hibernate ORM将数据存储到数据库中。如果在任何请求期间发生异常,它将由hibernate回滚。这取决于我们放置@Transnational注释的位置。

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

这个article教你更多关于一般异常处理的知识。

这是我们的异常解析器。

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;
  }

}

以下是服务的外观。我们通常从控制器调用我们的服务。如果从控制器发出异常,建议将处理它。

{{1}}

我希望这会有所帮助。