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”,但都无济于事。

当我挖掘调试器时,发现connorg.apache.commons.dbcp.PoolableConnection包装org.postgresql.jdbc4.Jdbc4Connection

如果该功能不被postgres/JDBC4支持,我期望调用它来抛出一个SQLException指示它不受支持。没有例外被抛出。

任何线索为什么它返回null?

我该如何解决这个问题,否则,我该如何将一个数组或值列表传递给PreparedStatement

+0

您是否正在使用最近的PostgreSQL的JDBC 4(!)驱动程序?它看起来像它已经实现:https://github.com/pgjdbc/pgjdbc/blob/master/org/postgresql/jdbc4/AbstractJdbc4Connection.java#L88(并且已经有几年了) – 2014-12-19 07:33:31

+0

你可以用' “INT8”'? ''bigint''只是'“int8”的别名(但在这种情况下都应该使用它们)。 – pozs 2014-12-19 12:47:06

+0

@MarkRotteveel我们使用的是只包含最新PostgreSQL JDBC背后的2个版本的版本。也就是说,我们使用的是版本1002,而版本1004是截至12/19/14的最新版本。我有类似的想法,也许这是一个非常古老的想法,但它是最近的。 – 2014-12-22 18:01:09

如果您使用某些Linux打包系统安装了Tomcat6,那么您可能在其/usr/share/tomcat6/lib目录中具有旧版本的commons-jdbc和commons-dbcp。这些旧的commons-jdbc和commons-dbcp库在创建SQL数组时显然有一些bug。

由于代码复杂性和各种感知缺陷,Apache团队决定停止维护commons-dbcp并转移到tomcat-dbcp。

我做什么我就到Maven的*,下载最新tomcat-jdbctomcat-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移出,事情就会重新开始。

+0

这个答案与这个问题有什么关系? – 2015-06-29 18:01:48

+0

让我引用自己的话:“一旦我从commons-dbcp转移,事情就会重新开始”我已经向你描述了对我有用的东西。你有没有安装Tomcat 6? – RockyMM 2015-06-30 16:30:00

+0

我有Tomcat 7.0.25。 – 2015-06-30 18:20:06