2014-12-18 3 views
2

Я пытаюсь вставить серию значений в sql-запрос с использованием Java postgresql jdbc4.java.sql.Connection createArrayOf() всегда возвращает null

java.sql.Connection определяет способ преобразования Object[] в java.sql.Array: conn.createArrayOf(String typeName, Object[] elements)

Единственная проблема, независимо от того, что я стараюсь, она всегда возвращает нуль.

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

Вы используете новый драйвер JDBC 4 (!) PostgreSQL? Похоже, что он реализован: https://github.com/pgjdbc/pgjdbc/blob/master/org/postgresql/jdbc4/AbstractJdbc4Connection.java#L88 (и существует уже несколько лет) –

+0

Не могли бы вы попробовать с ' "int8" '? '" bigint "' является просто псевдонимом '' int8 "' (но оба должны использоваться в этом контексте). – pozs

+0

@MarkRotteveel Мы используем сборку, которая только 2 строит за самым последним PostgreSQL JDBC. То есть мы используем сборку 1002, а сборка 1004 является самой актуальной по состоянию на 12/19/14. У меня были подобные мысли, что, может быть, это был действительно старый, но это последнее. –

ответ

0

Если у вас установлен Tomcat6 с использованием какой-либо системы Linux-упаковки, у вас, вероятно, есть старые версии commons-jdbc и commons-dbcp в каталоге /usr/share/tomcat6/lib. Эти старые библиотеки commons-jdbc и commons-dbcp, по-видимому, имеют некоторую ошибку при создании массивов SQL.

Команда Apache решила прекратить поддерживать commons-dbcp и перейти к tomcat-dbcp из-за сложности кода и различных воспринимаемых недостатков.

То, что я сделал, я пошел в Maven Central, скачал последние tomcat-jdbc и tomcat-dbcp и поставить тех, кто в /usr/share/tomcat6/lib и переехал Викисклад и JDBC Викисклада ГСБДА JARs в /tmp. Я также должен был добавить в контекстный файл, расположенном в /etc/tomcat6/Catalina/localhost/my_app.xml следующем

factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 

То, что я думаю, что происходит, что есть ошибка в обработке исключений в некоторых из оберток JDBCConnection, что есть много много в Викискладе ДБХПЕ. Есть часть кода, который, как я подозреваю, the culprit, но я не уверен, почему и как. В общем, как только я перешел из commons-dbcp, все снова начало работать.

+0

На чем этот ответ связан с вопросом? –

+0

Позвольте мне процитировать меня: «Как только я перешел из commons-dbcp, все снова начало работать». Я рассказал вам, что сработало для меня. У вас установлен Tomcat 6? – RockyMM

+0

У меня Tomcat 7.0.25. –

Смежные вопросы