设置时间戳抛出 PSQLException:不支持的类型值:2,013

Setting a timestamp throws PSQLException: Unsupported Types value: 2,013

我使用的是最新的 Postgres 版本,但如果我调用 registerSQLType(paramName, Types.TIME_WITH_TIMEZONE),它仍然会抛出 Unsupported type 异常。我可以在 postgres 数据源的 Spring 配置中设置 stringtype=unspecified 并通过将参数作为 ISO 格式的字符串传递来解决这个问题。

但是,我正在尝试使用 EmbeddedPostgres(来自 OpenTable Embedded PostgreSQL Component)为我的数据访问层编写功能测试,因为这些测试将在 AWS 中 运行 而无需访问 RDS 实例。不幸的是,解决方法不起作用,因为 EmbeddedPostgres 因设置字符串类型而窒息。

EmbeddedPostgres.builder().setServerConfig("stringtype", "unspecified").start();
// throws FATAL:  unrecognized configuration parameter "stringtype"

有人知道解决这两个障碍的方法吗?要么让 Postgres 显式接受时间戳,要么让 EmbeddedPostgres 接受字符串类型参数(根据 documentation 应该是有效的)。

谢谢!

好吧,经过一番苦思冥想,我找到了解决这两个问题的方法。我将 post 放在这里,以防其他人遇到同样的问题。

第一个问题:

parameters.registerSqlType(EVENT_DATE, Types.TIMESTAMP_WITH_TIMEZONE);
//throws "PSQLException: Unsupported Types value: 2,013," 

我发现即使我直接设置 Timestamp 对象,Postgres 也能正确设置该值,只要我使用纪元时间值创建它即可。所以这有效:

parameters.registerSqlType(EVENT_DATE, Types.TIMESTAMP);
java.sql.Timestamp sqlTS = new Timestamp(evt.getEventDate().toEpochMilli());
parameters.addValue(EVENT_DATE, sqlTS);

关于第二个问题--在EmbeddedPostgres上设置配置参数,我意识到我正在设置服务器配置参数,而我需要的是一个连接参数。

这是无效的代码:

EmbeddedPostgres pg = EmbeddedPostgres.builder().setServerConfig("stringtype", "unspecified").start();
// throws FATAL:  unrecognized configuration parameter "stringtype"
DataSource source = pg.getPostgresDatabase();

但这确实有效:

EmbeddedPostgres pg = EmbeddedPostgres.builder().start();
Properties props = new Properties();
props.setProperty("stringtype","unspecified");
Connection conn = DriverManager.getConnection(pg.getJdbcUrl("postgres", "postgres"), props);
DataSource source = new SingleConnectionDataSource(conn, false);

因此,如果您需要设置任何 postgres 特定的连接参数,您只需要滚动自己的数据源。

希望对某人有所帮助!