サーバーが一度に 1 つのクライアントに対して、サービス impl コードの特定の部分をスレッドセーフに実行するようにしたい。そして順次。これを行うサーバー側サービス実装の一部を次に示します。
public BorcData getBorcData(String userId) throws GeneralException, EyeksGwtException
{
StoredProcedure sp = DALDB.storedProcedure("BORCBILDIRIM_GETMUKDATA_SP");
DALResult spResult;
Row spRow;
String vergiNo;
String asamaOid;
synchronized (ServerUtility.lock_GeriArama_GetBorcData_GetMukDataSP)
{
String curOptime =CSDateUtility.getCurrentDateTimeToSave();
sp.addParam(curOptime);
spResult = sp.execute();
if (!spResult.hasNext())
{
throw new GeneralException("53", "");
}
}
同期ブロックが表示されます。ロックに使用するオブジェクトは次のように定義されています。
public static Object lock_GeriArama_GetBorcData_GetMukDataSP = new Object();
私の問題は、クライアントがその同期ブロックの実行を長時間待っている間に、他のクライアントがこのサービスを呼び出して、列に並ばずにそのブロックを実行して続行したことを見たと思います。最初のクライアントはまだ待っていました。
サーバー側で純粋な Java が実行されていることは知っています。サーバー側がクライアントに対して不公平であり、最も長く待機しているクライアントの要求を最初に実行していない可能性はありますか?
編集:実際には; 公平性は本当の問題でさえありません。時々、クライアントはその同期部分にぶら下がっているように見えます。サービスが終了するのを永遠に待っています。