java.sql.Connection createArrayOf() 总是返回 null

Posted

技术标签:

【中文标题】java.sql.Connection createArrayOf() 总是返回 null【英文标题】:java.sql.Connection createArrayOf() always returns null 【发布时间】:2014-12-18 23:18:47 【问题描述】:

我正在尝试使用 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 是通过 dataSource.getConnection() 工作的 javax.sql.DataSource 检索的。 conn 适用于我们所有其他数据库用途,但其 createArrayOf() 方法始终返回 null。

按照this question,我已经尝试过 typeName 的大写“BIGINT”和小写“bigint”,但均无济于事。

当我深入调试器时,我发现 conn 是一个 org.apache.commons.dbcp.PoolableConnection 包装了一个 org.postgresql.jdbc4.Jdbc4Connection

如果 postgres/JDBC4 不支持该功能,我希望调用它会引发 SQLException,表明它不受支持。不抛出异常。

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

我该如何修复它,否则,我如何将数组或值列表传递给PreparedStatement

【问题讨论】:

您使用的是 PostgreSQL 最新的 JDBC 4(!) 驱动程序吗?看起来已经实现了:github.com/pgjdbc/pgjdbc/blob/master/org/postgresql/jdbc4/…(现在已经有几年了) 你能用"int8"试试吗? "bigint" 只是 "int8" 的别名(但两者都应在此上下文中使用)。 @MarkRotteveel 我们使用的构建仅比最新的 PostgreSQL JDBC 落后 2 个构建。也就是说,我们使用的是 build 1002,而 build 1004 是截至 2014 年 12 月 19 日的最新版本。我也有类似的想法,也许它是一个非常古老的东西,但它是最近的。 好的,但是您使用的是 jdbc 4 版本吗? Afaik,jdbc 3 构建没有它。 @MarkRotteveel 是的,JDBC 4 标准,内部版本 1002。 【参考方案1】:

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

Apache 团队决定停止维护 commons-dbcp,转而使用 tomcat-dbcp,原因是代码复杂性和各种可察觉的缺陷。

我所做的是我去了 Maven Central,下载了最新的 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 包装器中的异常时存在一个错误,在 commons-dbcp 中有很多。我怀疑有一部分代码是the culprit,但我不确定为什么以及如何。总而言之,当我从 commons-dbcp 移出后,一切又开始运转了。

【讨论】:

这个答案与这个问题到底有什么关系? 让我引用我自己的话:“当我从 commons-dbcp 移出后,一切又开始运转了” 我已经向您描述了对我有用的方法。你有安装 Tomcat 6 吗? 我有 Tomcat 7.0.25。 请尝试使用最新的 tomcat-dbcp。这是另一个存在问题的建议:postgresql.nabble.com/… @MartinCarney 更改连接池运气好吗?

以上是关于java.sql.Connection createArrayOf() 总是返回 null的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.Connection的close方法

空对象引用上的 Android Studio jTDS java.lang.NullPointerException java.sql.Statement java.sql.Connection.cr

是否可以从 java.sql.Connection 获取 url 或服务器信息 [重复]

在多线程系统中使用静态 java.sql.Connection 实例是不是安全?

java.sql.Connection解决插入数据库中文乱码问题

ThreadLocal + java.sql.Connection + servlet 过滤器 = 2009?