0

我们的 Web 应用程序的结构是 3 层。(Presentation layer, Business layer, DB layer)
所有的业务逻辑都在业务层。
表示层向业务层请求 CRUD 并获取结果以处理用户的请求。
顺便说一句,我们在表示层上配置了读取超时。(3 秒)
在这种情况下,如果一些结果来自业务层的缓慢,用户会收到错误消息,并且正确完成了 CRUD 处理。所以用户再次尝试操作。结果,数据被复制。
如何解决这个问题呢?只是增加读取时间?

4

3 回答 3

0

实现回滚并在达到超时时执行此操作,或者如果您在超时之前完成,则只需提交数据库事务。增加超时并不能解决任何问题。

于 2012-09-12T01:09:07.637 回答
0

对于业务层中长时间运行的事务,您应该在表示层上实现类似 COMET 的机制:

  1. 用户提交交易,业务层立即返回
  2. 事务在业务层的后台执行
  3. 表示层定期轮询业务层以检查事务的状态

不幸的是,这种机制通常需要在表示层和业务层中进行一些重大的实现更改。在客户端,javascript 框架提供了这些开箱即用的功能。在服务器端,servlet 3.0 中的异步 Servlet 可能会有所帮助。

单独增加读取超时很简单,但在大多数情况下不会让您摆脱这种情况:如果客户端请求通过代理/防火墙等......,后者可能会在您的表示层之前超时并关闭连接。

于 2012-09-12T05:08:47.957 回答
0

最好的选择实际上是让客户端收到请求的确认,然后(稍后)确认完成或失败。这涵盖了典型的场景,除了失去联系或工作非常缓慢。

增加超时时间是明智的,对于大多数严肃的工作来说,3 秒的超时时间是不切实际的(如果服务器暂时繁忙或网络延迟怎么办?)。

于 2012-09-12T03:18:51.740 回答