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的主要内容,如果未能解决你的问题,请参考以下文章
空对象引用上的 Android Studio jTDS java.lang.NullPointerException java.sql.Statement java.sql.Connection.cr
是否可以从 java.sql.Connection 获取 url 或服务器信息 [重复]
在多线程系统中使用静态 java.sql.Connection 实例是不是安全?