複数時間帯でのデータ照会

分散シナリオでは、実際に照会がサーバー上で実行されます。 カレンダー、java.util.Date、およびタイム・スタンプの述部タイプを使用してデータを照会しているとき、照会で指定される日時値は、サーバーのローカル時間帯に基づいています。

すべてのクライアントおよびサーバーが同じ時間帯で実行されている単一時間帯のシステムでは、カレンダー、java.util.Date、およびタイム・スタンプの述部タイプに関する問題を考慮する必要はありません。しかし、クライアントとサーバーが異なる時間帯にある場合、照会で指定される日時値はサーバーの時間帯に基づき、要求しないデータがクライアントに戻される場合があります。 サーバーの時間帯を知らなければ、指定される日時値は無意味なものになってしまいます。そのため、指定される日時値は、ターゲットの時間帯とサーバーの時間帯の時間帯オフセットの差を考慮しなければなりません。

時間帯オフセット

例えば、クライアントが [GMT-0] の時間帯にあり、サーバーが [GMT-6] の時間帯にあるとします。 サーバーの時間帯は、クライアントよりも 6 時間遅れています。 クライアントは、以下の照会を実行しようとします。

SELECT e FROM Employee e WHERE e.birthDate='1999-12-31 06:00:00'

エンティティー Employee にタイプ java.util.Date の birthDate 属性があると想定した場合、クライアントは [GMT-0] 時間帯にあり、自分の時間帯に基づいて「1999-12-31 06:00:00 [GMT-0]」の birthDate 値を持つ Employee を取得しようとします。

照会はサーバーで実行され、その照会エンジンで使用される birthDate 値は「1999-12-31 06:00:00 [GMT-6]」で、「1999-12-31 12:00:00 [GMT-0]」に相当します。 「1999-12-31 12:00:00 [GMT-0]」と等しい birthDate 値を持つ Employee がクライアントに戻されます。 したがって、クライアントは要求した birthDate 値「1999-12-31 06:00:00 [GMT-0]」を持つ Employee を取得しません。

今説明した問題は、クライアントとサーバー間の時間帯の差のために発生します。この問題を解決する 1 つの方法は、クライアントとサーバー間の時間帯オフセットを計算し、照会のターゲット日時値にその時間帯オフセットを適用することです。 前述の照会の例で、時間帯オフセットは -6 時間なので、クライアントが birthDate 値「12-31 06:00:00 [GMT-0]」を持つ Employee の取得しようとする場合、調整された birthDate の述部は「birthDate='1999-12-31 00:00:00'」にしなければなりません。 調整された birthDate 値を使用すると、サーバーは、ターゲット値「12-31 06:00:00 [GMT-0]」に相当する「1999-12-31 00:00:00 [GMT-6]」を使用し、要求された Employee がクライアントに戻されます。

複数時間帯での分散デプロイメント

分散 eXtreme Scale グリッドがさまざまな時間帯にある複数の ObjectGrid サーバーにデプロイされている場合、時間帯オフセットを調整する方法は機能しません。クライアントは、どのサーバーがその照会を実行するのかを知らないため、使用する時間帯オフセットを決められないからです。 唯一の解決策は、GMT 時間帯に基づく日時値の使用を表す、JDBC 日時エスケープ形式のサフィックス「Z」(大/小文字の区別なし) を使用することです。 サフィックス「Z」(大/小文字の区別なし) は、GMT 時間帯に基づく日時値を使用することを指し示します。 サフィックス「Z」を使用しないと、ローカル時間帯に基づく日時値が、照会を実行するプロセスで使用されます。

以下の照会は前述の例と同じですが、代わりにサフィックス「Z」を使用しています。

SELECT e FROM Employee e WHERE e.birthDate='1999-12-31 06:00:00Z'

照会は、birthDate 値「1999-12-31 06:00:00」を持つ Employee を検索するはずです。 サフィックス「Z」は、指定された birthDate 値が GMT 時間帯に基づくということを示すため、照会エンジンは、基準値の突き合わせに GMT 時間帯に基づいた birthDate 値「1999-12-31 06:00:00 [GMT-0]」を使用します。 この GMT に基づいた birthDate 値「1999-12-31 06:00:00 [GMT-0]」に等しい birthDate 属性値を持つ Employee が、照会結果に含まれます。 どのような照会でも、JDBC 日時エスケープ形式のサフィックス「Z」を使用することは、アプリケーションの時間帯の問題をなくすために重要です。 この方法を使用しなければ、日時値はサーバーの時間帯に基づき、クライアントとサーバーが異なる時間帯にある場合は、クライアントの観点からは無意味なものになります。

詳しくは、異なる時間帯のデータを参照してください。