java.sql.Connection createArrayOf()总是返回null
我想使用Java的postgresql jdbc4将一系列值插入到sql查询中。java.sql.Connection createArrayOf()总是返回null
java.sql.Connection
指定要转换成Object[]
一个java.sql.Array
方法:conn.createArrayOf(String typeName, Object[] elements)
唯一的问题是,不管我怎么努力,它总是返回null。
public Array makeQueryBigintArray(Object[] values) throws SQLException {
Array result = conn.createArrayOf("bigint", values);
// "result" is null at this point, but shouldn't be
return result;
}
conn
通过工作javax.sql.DataSource
经由dataSource.getConnection()
检索。 conn
适用于我们所有其他数据库使用,但其createArrayOf()
方法始终返回null。
我根据this question尝试了typeName的大写“BIGINT”和小写“bigint”,但都无济于事。
当我挖掘调试器时,发现conn
是org.apache.commons.dbcp.PoolableConnection
包装org.postgresql.jdbc4.Jdbc4Connection
。
如果该功能不被postgres/JDBC4支持,我期望调用它来抛出一个SQLException指示它不受支持。没有例外被抛出。
任何线索为什么它返回null?
我该如何解决这个问题,否则,我该如何将一个数组或值列表传递给PreparedStatement
?
如果您使用某些Linux打包系统安装了Tomcat6,那么您可能在其/usr/share/tomcat6/lib
目录中具有旧版本的commons-jdbc和commons-dbcp。这些旧的commons-jdbc和commons-dbcp库在创建SQL数组时显然有一些bug。
由于代码复杂性和各种感知缺陷,Apache团队决定停止维护commons-dbcp并转移到tomcat-dbcp。
我做什么我就到Maven的*,下载最新tomcat-jdbc和tomcat-dbcp,把那些到/usr/share/tomcat6/lib
和移动的commons-JDBC和commons-DBCP JAR文件到/tmp
。我也不得不加入到位于/etc/tomcat6/Catalina/localhost/my_app.xml
背景文件下列
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
我认为正在发生的事情是,有在一些JDBCConnection包装,其中有在公共-DBCP很多很多的异常处理的错误。有一部分代码我怀疑是the culprit,但我不确定为什么以及如何。总而言之,只要我从commons-dbcp移出,事情就会重新开始。
这个答案与这个问题有什么关系? – 2015-06-29 18:01:48
让我引用自己的话:“一旦我从commons-dbcp转移,事情就会重新开始”我已经向你描述了对我有用的东西。你有没有安装Tomcat 6? – RockyMM 2015-06-30 16:30:00
我有Tomcat 7.0.25。 – 2015-06-30 18:20:06
您是否正在使用最近的PostgreSQL的JDBC 4(!)驱动程序?它看起来像它已经实现:https://github.com/pgjdbc/pgjdbc/blob/master/org/postgresql/jdbc4/AbstractJdbc4Connection.java#L88(并且已经有几年了) – 2014-12-19 07:33:31
你可以用' “INT8”'? ''bigint''只是'“int8”的别名(但在这种情况下都应该使用它们)。 – pozs 2014-12-19 12:47:06
@MarkRotteveel我们使用的是只包含最新PostgreSQL JDBC背后的2个版本的版本。也就是说,我们使用的是版本1002,而版本1004是截至12/19/14的最新版本。我有类似的想法,也许这是一个非常古老的想法,但它是最近的。 – 2014-12-22 18:01:09