Daten in mehreren Zeitzonen abfragen

In einem verteilten Szenario werden Abfragen auf Servern ausgeführt. Wenn Daten mit Prädikaten des Typs "calendar", "java.util.Date" und "timestamp" abgefragt werden, basiert der in einer Abfrage angegebene Datums-/Zeitwert auf der lokalen Zeitzone des Servers.

In einem System mit einer einzigen Zeitzone, in dem alle Clients und Server in derselben Zeitzone ausgeführt werden, müssen Sie Probleme, die mit Prädikattypen mit "calendar", "java.util.Date" und "timestamp" in Zusammenhang stehen, nicht berücksichtigen. Wenn sich Clients und Server jedoch in unterschiedlichen Zeitzonen befinden, basiert der in Abfragen angegebene Datums-/Zeitwert jedoch auf der Zeitzone des Servers und unerwünschte Daten an den Client zurückgeben. Ohne die Zeitzone des Servers zu kennen, ist der angegebene Datums-/Zeitwert bedeutungslos. Deshalb muss im angegebenen Datums-/Zeitwert die Zeitzonendifferenz zwischen der Zielzeitzone und der Serverzeitzone berücksichtigt werden.

Zeitzonendifferenz

Angenommen, ein Client befindet sich in der Zeitzone [GMT-0] und der Server in der Zeitzone [GMT-6]. Die Serverzeitzone liegt 6 Stunden hinter dem Client zurück. Der Client möchte die folgende Abfrage ausführen:

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

Angenommen, die Entität "Employee" (Mitarbeiter) hat ein Attribut "birthDate" (Geburtstag) evom Typ java.util.Date. Der Client befindet sich in der Zeitzone [GMT-0] und möchte Mitarbeiter mit dem Geburtstag '1999-12-31 06:00:00 [GMT-0]' basierend auf seiner Zeitzone abrufen.

Die Abfrage wird auf dem Server ausgeführt und der von der Abfrage-Engine verwendete birthDate-Wert ist '1999-12-31 06:00:00 [GMT-6]', der '1999-12-31 12:00:00 [GMT-0]' entspricht. Es werden Mitarbeiter mit dem Geburtstag '1999-12-31 12:00:00 [GMT-0]' an den Client zurückgegeben. Damit erhält der Client nicht die gewünschten Mitarbeiter mit dem Geburtstag '1999-12-31 06:00:00 [GMT-0]'.

Das beschriebene Problem ist auf die Zeitzonendifferenz zwischen Client und Server zurückzuführen. Eine Möglichkeit zur Behebung dieses Problems ist die Berechnung der Zeitzonendifferenz zwischen Client und Server und das Anwenden der Zeitzonendifferenz auf den Zielwert (Datum/Uhrzeit) in der Abfrage. Im vorherigen Beispiel beträgt die Zeitzonendifferenz -6 Stunden, und das angepasste birthDate-Prädikat muss "birthDate='1999-12-31 00:00:00'" sein, wenn der Client Mitarbeiter mit dem Geburtstag '12-31 06:00:00 [GMT-0]' abrufen möchte. Mit dem angepassten birthDate-Wert verwendet der Server '1999-12-31 00:00:00 [GMT-6]', was dem Zielwert '12-31 06:00:00 [GMT-0]' entspricht, und die erforderlichen Mitarbeiter werden an den Client zurückgegeben.

Verteilte Implementierung in mehreren Zeitzonen

Wenn das verteilte eXtreme-Scale-Grid in mehreren ObjectGrid-Servern in verschiedenen Zeitzonen implementiert wird, funktioniert die Methode mit der Anpassung der Zeitzonendifferenz nicht, weil der Client nicht weiß, welcher Server die Abfrage ausführt, und somit die zu verwendende Zeitzonendifferenz nicht bestimmen kann. Die einzige Lösung ist die Verwendung des Suffix "Z" (Groß-/Kleinschreibung muss nicht beachtet werden) im JDBC-Escape-Format für Datum/Uhrzeit, mit dem angezeigt wird, dass der auf der Zeitzone GMT basierende Datums-/Zeitwert verwendet werden soll. Wenn das Suffix "Z" nicht verwendet wird, wird der auf der lokalen Zeitzone basierende Datums-/Zeitwert in dem Prozess verwendet, der die Abfrage ausführt.

Die folgende Abfrage entspricht dem vorherigen Beispiel, verwendet aber stattdessen das Suffix "Z":

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

Die Abfrage sollte Mitarbeiter mit dem birthDate-Wert "1999-12-31 06:00:00" finden. Das Suffix "Z" zeigt an, dass der angegebene birthDate-Wert auf der Zeitzone GMT basiert, und deshalb wird der auf der Zeitzone GMT basierende birthDate-Wert "1999-12-31 06:00:00 [GMT-0]" von der Abfrage-Engine als Abgleichungskriterium verwendet. Mitarbeiter mit einem birthDate-Attribut, das diesem GMT-basierten birthDate-Wert "1999-12-31 06:00:00 [GMT-0]" entsprechen, werden in das Abfrageergebnis eingeschlossen. Die Verwendung des Suffix "Z" im JDBC-Escape-Format für Datum/Uhrzeit in einer Abfrage ist ein entscheidender Faktor für die Zeitzonensicherheit von Anwendungen. Wenn diese Methode nicht angewendet wird, basiert der Datums-/Zeitwert auf der Zeitzone des Servers und ist damit aus Clientsicht bedeutungslos, wenn sich Clients und Server in unterschiedlichen Zeitzonen befinden.

Weitere Informationen finden Sie im Abschnitt Daten für verschiedene Zeitzonen.