У меня наблюдаются странные эффекты при извлечении столбцов типа DATE из SQLServer2008 с использованием Microsoft JDBC-Driver версии 3.0 при работе под официальным Oracle JDK 1.7.0. ОС хоста - Windows Server 2003.
Все столбцы Date извлекаются как два дня назад по отношению к значению, фактически сохраненному в столбце.
Я придумал минимальный пример кода, чтобы проверить это (Тестовая таблица и данные):
CREATE TABLE Java7DateTest (
dateColumn DATE
);
INSERT INTO Java7DateTest VALUES('2011-10-10');
Код:
public class Java7SQLDateTest {
public static void main(final String[] argv) {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection connection = DriverManager.getConnection(
"jdbc:sqlserver://192.168.0.1:1433;databaseName=dbNameHere",
"user", "password");
PreparedStatement statement = connection.prepareStatement("SELECT * FROM Java7DateTest");
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
final java.sql.Date date = resultSet.getDate("dateColumn");
final String str = resultSet.getString("dateColumn");
System.out.println(date + " (raw: " + str + ")");
}
resultSet.close();
statement.close();
connection.close();
} catch (final Throwable t) {
throw new RuntimeException(t.getMessage(), t);
}
}
}
Запуск этого кода в конфигурации выше выводит: «2011-10-08 (raw: 2011-10- 08) ". В JRE 1.6.0_27 выводится:" 2011-10-10 (raw: 2011-10-10) "
Я не смог найти ничего, что могло бы иметь отношение к моей проблеме с Google. , поэтому я предполагаю, что это либо что-то глупое, что я упустил из виду, либо никто еще не использует Java7.
Кто-нибудь может подтвердить эту проблему? Какие у меня есть альтернативы, если я все еще хочу использовать Java7?
Изменить: Проблема возникает даже при работе с -Xint, поэтому она не вызвана ошибками Hotspot.
Edit2: Старые драйверы (Microsoft 1.28) правильно работают с JDK1.7.0 (я думаю, мы использовали этот драйвер примерно два года назад). jTDS также отлично работает с этим примером. Я подумываю о переходе на jTDS, но не хочу этого делать, потому что не имею ни малейшего представления о том, как это может повлиять на нашу производственную среду.В идеале она должна просто работать, но в это я тоже поверил, когда переключил свой блок разработчика на Java7. В производственной среде есть одна довольно толстая база данных, которая слишком велика для создания копии, для тестирования (вернее, у нашего сервера осталось так мало диска). Так что настроить тестовую среду для этого одного приложения непросто, мне пришлось бы сшить для этого сжатую базу данных.
Edit3: jTDS имеет свой собственный прикрепленный набор уловок. Я обнаружил разницу в поведении, которая ломает одно из наших приложений. ResultSet.getObject () возвращает разные типы объектов для столбцов SmallInt в зависимости от драйвера (Short или Integer). Также jTDS не реализует интерфейс JDBC4 Connection, Connect.isValid () не поддерживается.
Edit4: на прошлой неделе я заметил, что MSSQL-JDBC 3.0 отказывается подключаться к любой БД после того, как я обновился до JDK1.6.0_29. jTDS вот и ... мы вчера поменяли производительный сервер (я исправил два места, где приложение полагалось на особенности драйвера), и пока никаких проблем не возникло.