【发布时间】:2015-08-08 15:51:26
【问题描述】:
在使用最新的 JDBC 驱动程序 (9.4-1201-jdbc41) 分析从 Postgres 9.3.5 加载大型数据集时,我注意到在 AbstractJdbc2ResultSet.getDouble() 方法中花费了大量时间,其中驱动程序正在转换字符串值使用 Double.toDouble() 加倍。
查看源代码,似乎有一种方法可以以二进制格式传输双精度值,但我找不到任何方法来强制服务器发回二进制编码的双精度值(尝试在连接字符串中将 binaryTransfer 设置为 true正如https://wiki.postgresql.org/wiki/JDBC-BinaryTransfer 中所建议的那样,没有改变任何东西)。
是否有人在从 Postgres 加载数据时遇到过类似的行为,或者对为什么以这种方式实现有任何见解?我在http://www.postgresql.org/message-id/flat/36333.1430411802@sss.pgh.pa.us#36333.1430411802@sss.pgh.pa.us) 发现了最近对类似问题的讨论,但那里没有提供结论性的答案。
【问题讨论】:
-
该 wiki 页面似乎指的是股票 JDBC 驱动程序的补丁。 documentation 提到了一个
binaryTransferEnable选项,它采用数据类型列表。 -
另外,查看simple query protocol,我看不到客户指定格式的机会。这可能只有在扩展协议下才有可能(JDBC 中的
protocolVersion=3,但这应该是默认值)。 -
出于健壮性和兼容性的原因,二进制传输并不是默认设置,但它实际上也更慢,并且在小整数类型等常见情况下使用更多带宽。
-
通过AbstractJdbc2Connection调试显示构造函数中默认添加了FLOAT8 (OID: 701),所以我认为不需要在binaryTransferEnable选项中指定。
-
不是这方面的专家,我认为至少对于 x86 平台应该有一些二进制标准,应该能够在 Postgres 服务器端启用以提高性能(我知道它是 Java/ JDBC,但驱动程序已经有代码支持它)。
标签: java postgresql jdbc