2014-12-18 271 views
2

我想使用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

回答

0

如果您使用某些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