HikariCP: часовой пояс столбца timestamptz Postgres исчезает в наборе результатов PreparedStatement после 5 запросов

мое гладкое сопоставление в play2.4 не работало, и я свел проблему к следующему: если я делаю простой выбор из таблицы со столбцом timestamp with time zone, часовой пояс через некоторое время исчезает из результатов. Пример в конце этого сообщения выводит следующий результат: 2015-10-27 20:45:13.459+01 2015-10-27 20:45:13.459+01 2015-10-27 20:45:13.459+01 2015-10-27 20:45:13.459+01 2015-10-27 20:45:13.459+01 // from now on, the timezone is never returned (even after 1000 queries) 2015-10-27 20:45:13.459 2015-10-27 20:45:13.459 2015-10-27 20:45:13.459 2015-10-27 20:45:13.459 ...

  • Если я создаю соединение напрямую без использования HikariCP, оно работает.
  • Если я не закрою соединение в конце каждого запроса в цикле (т. е. не упущу соединение), оно сработает
  • Если я использую одно и то же соединение, не создавая/закрывая новое (т.е. получая одно из пула и освобождая его) каждый раз, оно работает
  • Если я каждый раз создаю и закрываю новое соединение, используя стандартный DriverManager.getConnection с одним и тем же URL-адресом, оно работает.
  • Если я не подготовлю заявление, оно сработает
  • Если я подготовлю выражение дважды (даже без использования второго), оно сработает
  • Если я подготовлю второе утверждение, отличное от первого, оно не сработает.

Я пробовал как обычную, так и java6 версию Hikaricp. Я использую постгрес 9.4. Я работаю в scala, но я создал пример в java, чтобы расширить аудиторию;)

Я открыл вопрос, но я немного спешу, поэтому, если кто-нибудь знает, что делать ... Если кто-нибудь может указать мне, как использоватьbonecp или что-то еще в игре 2.4, я также был бы признателен.

Вы можете воспроизвести проблему с проектом только с зависимостями HikariCP и postgres:

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class TestHikari {
    public static void main(String[] args) throws Exception {
        HikariConfig conf = new HikariConfig();
        conf.setJdbcUrl("jdbc:postgresql://localhost/postgres");
        conf.setDriverClassName("org.postgresql.Driver");

        HikariDataSource ds = new HikariDataSource(conf);
        Connection ddlconn = ds.getConnection();
        try { ddlconn.createStatement().execute("DROP TABLE TEST"); } catch(Exception ignored) {}
        ddlconn.createStatement().execute("CREATE TABLE TEST (ts TIMESTAMP with time zone)");
        ddlconn.createStatement().execute("insert into test(ts) values('2015-10-27 20:45:13.459+01')");
        ddlconn.close();

        for (int i = 0; i< 10; i++) {
            Connection conn = ds.getConnection();
            PreparedStatement stmt = conn.prepareStatement("select ts from TEST");
            //if I uncomment the next line, it works!
            //conn.prepareStatement("select ts from TEST");
            ResultSet rs = stmt.executeQuery();
            rs.next();

            System.out.println(rs.getString(1));

            conn.close();
        }
    }
}

person Giovanni Caporaletti    schedule 27.10.2015    source источник
comment
Вы сами написали сопоставление или сгенерировали его?   -  person Mon Calamari    schedule 27.10.2015
comment
Поняв, в чем проблема на самом деле, я, наконец, нашел ошибку. github.com/pgjdbc/pgjdbc/issues/130 — до сих пор не решена. Я должен переключиться на метку времени без tz. временная метка tz в любом случае довольно бесполезна   -  person Giovanni Caporaletti    schedule 28.10.2015


Ответы (1)


Ответ на этот вопрос был дан здесь: https://github.com/brettwooldridge/HikariCP/issues/473< /а>

Были некоторые проблемы с датами/часовыми поясами, когда драйвер JDBC переключался на подготовленные операторы на стороне сервера. По умолчанию это происходит после выполнения 5 подготовленных инструкций (см. параметр prepareThreshold в postgresql JDBC).

Так что это ошибка в драйвере postgres jdbc. Кажется, единственным обходным путем на данный момент является установка prepareThreshold=0 или переключение на метку времени без часового пояса.

person Giovanni Caporaletti    schedule 29.10.2015
comment
Пожалуйста, не публикуйте только ссылки на ответы на другие вопросы о переполнении стека. Вместо этого проголосуйте/отметьте, чтобы закрыть как дубликат, или, если вопрос не является дубликатом, адаптируйте ответ к этому конкретному вопросу. - person Mifeet; 11.11.2015