CreateArrayOf AbstractMethodError

Я пытаюсь вставить массив в postgres, используя java-код, но всегда получаю эту ошибку:

SEVERE [http-nio-8080-exec-2]org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service()
 for servlet [] in context with path [/] threw exception 
[Servlet execution threw an exception] with root cause
 java.lang.AbstractMethodError: 
com.mchange.v2.c3p0.impl.NewProxyConnection.createArrayOf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/sql/Array;

Используемый код

pst = getConnection().prepareStatement(INSERT_QUERY,PreparedStatement.RETURN_GENERATED_KEYS);
 pst.setString(1, t.getname());
 pst.setString(2, t.getEmail());
 Array itemIds = conn.createArrayOf("bigint", t.getItemIds());
 pst.setArray(3, itemIds);

Если я запускаю функцию через основной класс, она работает нормально, но после развертывания на сервере tomcat http-вызовы завершаются с ошибкой выше.

  • Используемая БД - Postgres
  • Драйвер JDBC postgres-9.1-901-1.jdbc4
  • c3p0-0.9.5-pre10
  • кот-8.0.24

Согласно исследованию, которое я сделал, createArrayOf() должен работать с jdbc4 и c3p0-0.9.5.

Использование этого прекрасно работает, но я не вижу его как правильный подход

if (conn instanceof C3P0ProxyConnection) {
 C3P0ProxyConnection proxy = (C3P0ProxyConnection) conn;
 try {
 Method m = Connection.class.getMethod("createArrayOf", String.class, Object[].class);
 Object[] args = { "bigint", t.getItemIds() };
 itemIds = (Array) proxy.rawConnectionOperation(m, C3P0ProxyConnection.RAW_CONNECTION, args);
 } catch (IllegalArgumentException e) {
 throw new SQLException(e);
 }
 } else {
 itemIds = conn.createArrayOf("bigint", t.getItemIds());
 }

Нужна помощь. Благодаря

1 ответ

Я сильно подозреваю, что у вас более старая версия c3p0 где-то в вашем приложении эффективна CLASSPATH. Я загрузил и проверил с c3p0-0.9.5-pre10.jar и c3p0-0.9.5.1.jar на Maven Central, что com.mchange.v2.c3p0.impl.NewProxyConnection действительно содержит метод createArrayOf.

% javap -sysinfo -cp ./c3p0-0.9.5.1.jar com.mchange.v2.c3p0.impl.NewProxyConnection
Classfile jar:file:/Users/swaldman/tmp/c3p0jars/c3p0-0.9.5.1.jar!/com/mchange/v2/c3p0/impl/NewProxyConnection.class
 Last modified Jun 16, 2015; size 27098 bytes
 MD5 checksum c1ff36b87219ddc84c92fb6c1445a2d1
 Compiled from "NewProxyConnection.java"
public final class com.mchange.v2.c3p0.impl.NewProxyConnection implements java.sql.Connection,com.mchange.v2.c3p0.C3P0ProxyConnection {
 //...
 public synchronized java.sql.Array createArrayOf(java.lang.String, java.lang.Object[]) throws java.sql.SQLException;
 //...
}

Хотя это вряд ли является причиной вашей проблемы, я рекомендую вам обновить до c3p0-0.9.5.1, а не использовать предварительную версию.

Чтобы узнать, какая версия c3p0 используется вашим приложением, просмотрите INFO в файлах журнала для баннера, напечатанного при инициализации библиотеки c3p0. Он должен выглядеть примерно так:

INFO: Initializing c3p0-0.9.5.1 [built 16-June-2015 00:06:36 -0700; debug? true; trace: 10]

Я подозреваю, что вы увидите более старую версию, которая где-то, возможно, среди транзитивных зависимостей, вы используете версии библиотеки 0.9.1.x или 0.9.2.x.

Удачи!

licensed under cc by-sa 3.0 with attribution.