我正在尝试使用Java的postgresql jdbc4将一系列值插入到sql查询中。
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。
我尝试过大写" BIGINT"小写" bigint"对于typeName,根据this question,无济于事。
当我浏览调试器时,我发现conn
是org.apache.commons.dbcp.PoolableConnection
包裹org.postgresql.jdbc4.Jdbc4Connection
。
如果postgres / JDBC4不支持该功能,我希望调用它来抛出一个SQLException,表明它不受支持。没有例外。
关于为什么它返回null的任何线索?
如何修复它,否则,我如何将数组或值列表传递给PreparedStatement
?
答案 0 :(得分:0)
如果您使用某些Linux打包系统安装了Tomcat6,那么您的/usr/share/tomcat6/lib
目录中可能有旧版本的commons-jdbc和commons-dbcp。这些旧的commons-jdbc和commons-dbcp库在创建SQL数组时显然有一些bug。
由于代码复杂性和各种明显的缺点,Apache团队决定停止维护commons-dbcp并转移到tomcat-dbcp。
我做的是我去了Maven Central,下载了最新的tomcat-jdbc和tomcat-dbcp并将它们放入/usr/share/tomcat6/lib
并将commons-jdbc和commons-dbcp JAR移动到{{1} }。我还必须添加位于/tmp
后面的
/etc/tomcat6/Catalina/localhost/my_app.xml
我认为发生的事情是在一些JDBCConnection包装器中处理异常时存在一个错误,在commons-dbcp中有很多包装。我怀疑有部分代码是the culprit,但我不确定原因和方法。总而言之,一旦我从commons-dbcp迁移,事情就开始重新开始了。