私のコードには、接続されたクライアントに代わってデータベースに情報を永続化する websocket サーバーがあります。
Jetty 9、Hibernate、および Postgres を使用しています。
基本的に、クライアントが websocket を介してデータ オブジェクトを投稿すると、次のようになります。
- サーバーはデータを逆シリアル化します
- コンテンツに基づいて、オブジェクトがデータベースに既に存在するかどうかを確認します
- 一致が見つかった場合
- サーバーはデータベースの行を更新し、アイテムが既に存在することを示します
- そうしないと
- サーバーは新しいデータベース行を作成し、アイテムが追加されたことを示します。
このシステムでは:
- エンドポイント (つまり、URL) は、単一のユーザー プリンシパルに対応します。
- 同じエンドポイントへの複数の接続が許可されます。つまり、異なるクライアントから 1 人のユーザーへの複数の接続を意味します。
- データベース内のデータ オブジェクトはユーザーに固有です
(これは、サーバーが既存の項目についてユーザーに属する行のみをチェックすることを意味します)
2 つのクライアントがまったく同時に同じデータを投稿する場合を除いて、これはすべてうまく機能しています。どちらのサーバー インスタンスも他方のインスタンスを認識していないため、データベースにはサーバー生成 ID を除いて同じ 2 つの行が作成されます。
サーバーが同じデータを同時に書き込むのを防ぐにはどうすればよいですか? データベースで UNIQUE 制約を使用することはできません。実際には、同じデータを持つ複数の行をサポートする必要がありますが、異なる時間に投稿されるからです。
「session.getOpenSessions()」を使用して、同じエンドポイントに接続されている他のすべてのセッションを取得できます。
できること:
- どういうわけか、エンドポイントで同期しますか?
- セッションに接続された何かを同期しますか?
- スレッド構成で何かをしますか?
提案をありがとう。