【问题标题】:createArrayOf AbstractMethodErrorcreateArrayOf AbstractMethodError
【发布时间】:2015-09-24 20:41:46
【问题描述】:

我正在尝试使用 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());
         }

需要帮助。 谢谢

【问题讨论】:

    标签: jdbc c3p0


    【解决方案1】:

    我强烈怀疑您的应用程序的有效 CLASSPATH 中某处有旧版本的 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 版本,请查看日志文件中的 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 版本的库。

    祝你好运!

    【讨论】:

    • 感谢@steve 问题是这个 [quartz - scheduler] (mvnrepository.com/artifact/org.quartz-scheduler/quartz/2.2.1) 它使用了导致冲突的 c3p0-0.9.1,添加了以下解决问题 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> <exclusions> <exclusion> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> </exclusion> </exclusions> </dependency>
    • 我今天也遇到了这个问题。经过研究,我确认我使用的是 0.9.1.2 版本的 c3p0 库。此功能是在 c3p0-0.9.5 版本中添加的。您可以在此 [sourceforge.net 链接] 上找到更多详细信息:sourceforge.net/p/c3p0/bugs/120
    【解决方案2】:

    我可以看到您使用的是旧版本的 c3p0 库。

    如果您使用的是 maven,请从

    将您的 pom 文件中的库更新为更高版本
    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>
    

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

    希望对大家有所帮助。

    【讨论】:

      【解决方案3】:

      将依赖更新为以下解决了我的问题。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        相关资源
        最近更新 更多