我正在尝试使用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调用将失败,并显示上述错误。
  • DB使用-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());
             }
    

    需要帮忙 。
    谢谢

    最佳答案

    我强烈怀疑您的应用程序有效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版本的库。

    祝你好运!

    关于jdbc - createArrayOf AbstractMethodError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32770550/

    10-11 01:33