在我的代码中,有一个 websocket 服务器代表连接的客户端将信息保存到数据库。
我正在使用 Jetty 9、Hibernate 和 Postgres。
本质上,当客户端通过 websocket 发布数据对象时:
- 服务器反序列化数据
- 根据内容检查对象是否已存在于数据库中
- 如果找到匹配项
- 服务器将更新数据库行,并表明该项目已经存在
- 其他
- 服务器将创建一个新的数据库行并指示该项目已添加。
在这个系统中:
- 端点(即 URL)对应于单个用户主体
- 允许到同一端点的多个连接,这意味着从不同客户端到单个用户的多个连接。
- 数据库中的数据对象是特定于用户的
(这意味着服务器将只检查属于用户的行以查找已存在的项目)
这一切都运行良好,除非 2 个客户端恰好在同一时间发布相同的数据。两个服务器实例都不知道对方,数据库最终有 2 行相同,除了服务器生成的 ID。
如何防止服务器同时写入相同的数据? 我不能在数据库中使用 UNIQUE 约束,因为我实际上必须支持具有相同数据但在不同时间发布的多行。
我可以使用“session.getOpenSessions()”将所有其他 session 附加到同一端点。
我可以:
- 以某种方式在端点上同步?
- 同步 session 附加的内容?
- 对线程配置做些什么?
感谢您的任何建议。
请您参考如下方法:
当你说:
Checks to see if the object already exists in the database, based on content
您已经定义了一个唯一约束,这意味着有一个列集组合必须是唯一的,这样当您匹配现有行时,您将更新而不是插入。
数据库已经提供了集中式并发控制机制,因此您可能应该在上述所有列上使用索引。