Столбцы даты в SQL-сервере (MSSQL-JDBC 3.0), работающем под управлением Java 1.7.0, получены как 2 дня назад

У меня наблюдаются странные эффекты при извлечении столбцов типа 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 вот и ... мы вчера поменяли производительный сервер (я исправил два места, где приложение полагалось на особенности драйвера), и пока никаких проблем не возникло.

16
задан Durandal 8 November 2011 в 14:43
поделиться