Jdbc createArrayOf AbstractMethodError

Jdbc createArrayOf AbstractMethodError,jdbc,c3p0,Jdbc,C3p0,我试图使用java代码向postgres插入一个数组,但总是出现以下错误: 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代码向postgres插入一个数组,但总是出现以下错误:

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
  • tomcat-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());
         }
我需要帮助。
谢谢

我强烈怀疑您的应用程序的有效类路径中有一个较旧版本的c3p0。我已经从Maven Central上的c3p0-0.9.5-pre10.jar和c3p0-0.9.5.1.jar下载并验证了
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版本,请查看日志文件中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版本


祝你好运

我可以看到您正在使用c3p0库的旧版本

如果您使用的是maven,请将pom文件中的库更新为更高版本

<dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.2</version>
</dependency>

c3p0
c3p0
0.9.1.2


com.mchange
c3p0
0.9.5.2

我希望它能帮助别人。

将依赖项更新为以下内容解决了我的问题

<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>

com.mchange
c3p0
0.9.5.2

Thank@steve问题是这个[quartz-scheduler]()它使用c3p0-0.9.1导致冲突,添加了以下内容来处理问题
org.quartz-scheduler quartz 2.2.1 c3p0 c3p0
我今天也遇到了这个问题。经过研究,我确认我正在使用c3p0库的0.9.1.2版本。此功能已添加到c3p0-0.9.5版中。您可以在此[sourceforge.net链接]上找到更多详细信息:
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>