2

私が取り組んでいるマルチプレイヤー ゲームでは、ゲームの更新スレッドをブロックせずに mysql データベースにイベントを記録して、データベースがビジー状態またはテーブルがロックされている場合に、ゲームが待機中に実行を停止しないようにしたいと考えています。書きます。

これを達成するための最良の方法は何ですか?

データベース接続プールを管理するために c3p0 を使用しています。これまでの私の最善のアイデアは、クエリ更新文字列を同期リストに追加し、独立したスレッドが 100 ミリ秒ごとにリストをチェックし、そこで見つかったクエリを実行することです。

4

3 に答える 3

2

に更新を配置しますBlockingQueue。別のスレッドをキューで待機させtake()、その後、drainTo()保留中のすべての更新を消費して、一度にサーバーにプッシュします。効率を最大化するには、単一の複数行のINSERTを使用します。

このアプローチにより、ポーリングの頻度による不必要な遅延なしに更新がサーバーに到達すると同時に、ボリュームが増加するにつれて、よりチャンクな、したがってより効率的なリクエストが作成されます。

于 2010-05-15T12:21:36.027 に答える
2

これまでの私の最善のアイデアは、100ミリ秒ごとにリストをチェックし、そこで見つかったクエリを実行する独立したスレッドを使用して、同期リストにクエリ更新文字列を追加することです。

これは、同期リストと100ミリ秒のポーリングを使用せず、代わりにBlockingQueue実装を使用することを除いて、メインスレッドをブロックしたくない場合に適しています。LinkedBlockingQueueがその役割を果たします。無制限にすると、メインスレッドがブロックされることはありません。

于 2010-05-15T12:23:08.187 に答える
0

INSERT はすぐに戻り、MySQL がすべてのスレッドの問題を処理するため、「INSERT DELAYED」が探しているものかもしれません。ただし、同等の UPDATE ステートメントはないため、INSERT または REPLACE のみを使用するようにコードを書き直す必要があります。

于 2010-07-04T01:21:24.333 に答える