在我的代码中,有一个 websocket 服务器代表连接的客户端将信息保存到数据库中。
我正在使用 Jetty 9、Hibernate 和 Postgres。
本质上,当客户端通过 websocket 发布数据对象时:
- 服务器反序列化数据
- 根据内容检查对象是否已存在于数据库中
- 如果找到匹配项
- 服务器将更新数据库行,并指示该项目已存在
- 别的
- 服务器将创建一个新的数据库行并指示该项目已添加。
在这个系统中:
- 端点(即 URL)对应于单个用户主体
- 允许到同一端点的多个连接,这意味着从不同客户端到单个用户的多个连接。
- 数据库中的数据对象特定于用户
(这意味着服务器只会检查属于用户的行是否存在已存在的项目)
这一切都运作良好,除非 2 个客户同时发布相同的数据。两个服务器实例都不知道另一个,并且数据库最终有 2 行相同,除了服务器生成的 ID。
如何防止服务器同时写入相同的数据?我不能在数据库中使用 UNIQUE 约束,因为我实际上必须支持具有相同数据的多行,但在不同时间发布。
我可以使用“session.getOpenSessions()”将所有其他会话附加到同一端点。
我可以吗:
- 在端点上同步,不知何故?
- 同步附加到会话的内容?
- 用线程配置做点什么?
感谢您的任何建议。