1

「ヨーロッパ/ロンドン」タイムゾーンにデータベースサーバーがあり、「ヨーロッパ/ブリュッセル」にWebサーバーがあります。今は夏時間なので、私のアプリケーションサーバーには2時間の違いがあります。

問題を再現するためのテストを作成しました。

Query q = JPA.em().createNativeQuery("SELECT UNIX_TIMESTAMP(startDateTime) FROM  `Event`  WHERE  `id` =574");
BigInteger unix = (BigInteger) q.getSingleResult();
System.out.println(unix + "000 UNIX_TIMESTAMP to BigInteger");

Query q2 = JPA.em().createNativeQuery("SELECT startDateTime FROM  `Event`  WHERE  `id` =574");
Timestamp o = (Timestamp) q2.getSingleResult();
System.out.println(o.getTime() + " Timestamp");

startDateTime列は「datetime」として定義されています(ただし、「timestamp」と同じ問題です)。取得する出力は次のとおりです。

1340291591000 UNIX_TIMESTAMP to BigInteger
1340284391000 Timestamp

Javaの日付オブジェクトを読み取るとタイムゾーンがシフトします。これを修正するにはどうすればよいですか?jdbcドライバーは、サーバーから取得する「unixtime」値をDateオブジェクトに設定するだけでよいと思います。

(適切なソリューションは、GMTのdbだけでなく、任意のタイムゾーンの組み合わせで機能するはずです)

4

3 に答える 3

1

JDBCドライバーは、実行しているJVMのタイムゾーン設定を使用しています。ヨーロッパ/ブリュッセルでアプリケーションを実行している場合は、そのタイムゾーンを想定しています。データベースサーバーが別のタイムゾーンで実行されている場合、Javaで行われた計算の結果は、SQLで行われた計算の結果と異なる場合があります。

于 2012-06-22T18:12:43.197 に答える
1

MySQLタイムスタンプの列タイプを設定できます。

<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.pass}"/>
    <property name="idleConnectionTestPeriodInMinutes" value="60"/>
    <property name="idleMaxAgeInMinutes" value="240"/>
    <property name="maxConnectionsPerPartition" value="30"/>
    <property name="minConnectionsPerPartition" value="10"/>
    <property name="partitionCount" value="3"/>
    <property name="acquireIncrement" value="5"/>
    <property name="statementsCacheSize" value="100"/>
    <property name="initSQL" value="SET time_zone='${database.timezone}'"/>

これは私のbonecpdataSourceです->このクエリがすべてのmysql接続のinitで実行されるinitSQLを参照してください。Webサーバーがヨーロッパ/ブリュッセルにある場合は、このタイムゾーンを${database.timezone}に設定してください。mysqlに空のタイムゾーンテーブルがある場合は、次のようなLinuxロケールからインポートする必要があります。

mysql_tzinfo_to_sql / usr / share / zoneinfo | mysql -u root -p mysql

于 2013-10-31T14:08:47.393 に答える
0

接続文字列パラメータでこの問題を修正することができました

useJDBCCompliantTimezoneShift=true&useSSPSCompatibleTimezoneShift=true

ただし、データベースがUTC / GMTタイムゾーンにない場合はさらに問題が発生するため、これには100%満足していません。

于 2012-06-26T14:09:47.170 に答える