1

在我的代码中,有一个 websocket 服务器代表连接的客户端将信息保存到数据库中。

我正在使用 Jetty 9、Hibernate 和 Postgres。

本质上,当客户端通过 websocket 发布数据对象时:

  • 服务器反序列化数据
  • 根据内容检查对象是否已存在于数据库中
  • 如果找到匹配项
    • 服务器将更新数据库行,并指示该项目已存在
  • 别的
    • 服务器将创建一个新的数据库行并指示该项目已添加。

在这个系统中:

  • 端点(即 URL)对应于单个用户主体
  • 允许到同一端点的多个连接,这意味着从不同客户端到单个用户的多个连接。
  • 数据库中的数据对象特定于用户

(这意味着服务器只会检查属于用户的行是否存在已存在的项目)

这一切都运作良好,除非 2 个客户同时发布相同的数据。两个服务器实例都不知道另一个,并且数据库最终有 2 行相同,除了服务器生成的 ID。

如何防止服务器同时写入相同的数据?我不能在数据库中使用 UNIQUE 约束,因为我实际上必须支持具有相同数据的多行,但在不同时间发布。

我可以使用“session.getOpenSessions()”将所有其他会话附加到同一端点。

我可以吗:

  • 在端点上同步,不知何故?
  • 同步附加到会话的内容?
  • 用线程配置做点什么?

感谢您的任何建议。

4

1 回答 1

0

当你说:

根据内容检查对象是否已存在于数据库中

您已经定义了一个唯一约束,这意味着有一个列集组合必须是唯一的,因此当您匹配现有行时,您将更新而不是插入。

数据库已经提供了集中式并发控制机制,因此您可能应该在所有上述列上使用索引。

于 2015-04-23T21:18:08.010 回答