在我的代码中,有一个websocket服务器代表连接的客户机将信息持久化到数据库。
我使用的是9号码头,冬眠和邮递。
实际上,当客户端通过websocket发布数据对象时:
服务器反序列化数据
检查内容是否已经存在于数据库中,基于内容
如果找到匹配项
服务器将更新数据库行,并指示该项已经存在。
其他
服务器将创建一个新的数据库行,并指示该项已添加。
在这个系统中:
端点(即URL)对应于单个用户主体
允许到同一端点的多个连接,这意味着从不同客户端到单个用户的多个连接。
数据库中的数据对象是特定于用户的
(这意味着服务器只检查属于已经存在的项目的用户的行)
这一切都很好,除了两个客户端同时发布相同的数据。两个服务器实例都不知道另一个实例,数据库最后有两行相同,除了服务器生成的ID。
如何防止服务器同时写入相同的数据?
我不能在数据库中使用唯一的约束,因为我实际上必须支持具有相同数据但在不同时间发布的多行。
我可以使用“session.getOpenSessions()”将所有其他会话附加到同一个端点。
我可以吗:
以某种方式在端点上同步?
同步附加到会话的内容?
对线程配置做些什么?
谢谢你的建议。
最佳答案
当你说:
基于数据库检查是否已存在数据库中的对象
内容
您已经定义了一个唯一的约束,这意味着必须具有唯一的列集合组合,这样当您匹配现有行时,将更新而不是插入。
数据库已经提供了一个集中的并发控制机制,因此您可能应该在前面提到的所有列上使用索引。