мое гладкое сопоставление в 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();
}
}
}