我需要为我的问题设计一个解决方案。所以,请帮助我。
我的问题:
我们有一个网络项目。我们使用四个表,分别称为 A、B、C、D。 对于每个表,我们创建了一个前端页面,并提供了一个按钮用于将记录保存到相应的表中。 现在我们需要使用 Web 服务集成将每个记录数据共享到另一个应用程序。 我了解 JAX-WS Web 服务。
我们确定了必需的字段,并且只为所有四个表创建了一个通用 WSDL。 当用户尝试保存记录时,此时我只需要发起Web服务调用。(事件库) 这里我们正在使用同步网络服务。 IE。对于每个请求系统都会等待另一端的响应。
假设,首先我尝试将记录保存在表 A 中。因此,我填写了表单 A 中的所有必填字段,然后尝试单击“保存”按钮。记录保存在数据库中,并向另一端提出Web服务请求,将记录发送到服务器并等待响应...... 如果此时我再次尝试发送同一表格 A 的另一条记录(或)表格 B 的新记录。
那么如何处理这种情况,因为已经有一个线程正忙于服务器的响应。那么,如何像同步一样同时发出多个请求。
请向我建议我可以应用的可能解决方案。 一个建议将对我很有帮助。
(抱歉我的英语不好)
最佳答案
看看你的场景,我发现你有类似的情况:
数据库 -> Web JAX-WS 服务器 -> 多个 JAX-WS 客户端
当您从客户端调用 WS Server 时,将创建一个新线程来处理每个客户端的请求并处理响应。 Web 服务器是“多线程”的,支持多个客户端同时调用。您的问题可能是在 WS 服务之后。
如果使用 WS,您尝试使用两个客户端读取同一个表,则没有问题,但如果一个客户端在其他读取或两个或更多客户端正在更新表时尝试保存,则事务锁可能就是问题所在。
根据数据库配置,您应该需要配置事务隔离选项,并谨慎处理数据库连接,仅在绝对需要时打开和关闭事务
例如,如果您将 MySQL 与 InnDB ( http://dev.mysql.com/doc/refman/5.0/es/innodb-transaction-isolation.html ) 结合使用,并且在执行查询时事务隔离为“SERIALIZABLE”,则表将被锁定,直到事务结束,并且任何其他客户端都在等待,直到事务被释放或引发超时。
但是,如果您设置了“REPEATABLE READ”,则只有一个事务读取的记录才会被其他事务锁定。这在某些环境中可能是“好的”,但是应用于同一行的两个 SQL 语句可能会导致死锁。 * MySQL InnDB 的默认值
此外,您应该使用 READ COMMITED 或 READ UNCOMMITED 来允许读取所有表并修改不同的记录。此外,始终建议以最少的问题处理相同的记录:“仅在所需的最短时间内打开您的交易”
<小时/>检查您的 WS 客户端是否存在单例模式,该模式会在您创建第二个请求时销毁第一个请求。还要检查您是否使用具有状态的 WS,保留 session 或用户 session 中的其他服务器端对象,这些对象对于不同的请求是相同的。
与州相关:
Is it possible to use @WebService, @Stateless and @Singleton altogether in one EJB 3 bean?
关于java - 使用 JAX-WS 的并发 Web 服务请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18785577/