createArrayOf 抽象方法错误
createArrayOf AbstractMethodError
我正在尝试使用 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);
如果我 运行 通过 main class 函数它工作正常,但在部署到 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());
}
需要帮助。
谢谢
我强烈怀疑您的应用程序的有效 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 版本的库。
祝你好运!
我可以看到您使用的是旧版本的 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>
希望对大家有所帮助。
更新依赖关系解决了我的问题。
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
我正在尝试使用 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);
如果我 运行 通过 main class 函数它工作正常,但在部署到 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());
}
需要帮助。 谢谢
我强烈怀疑您的应用程序的有效 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 版本的库。
祝你好运!
我可以看到您使用的是旧版本的 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>
希望对大家有所帮助。
更新依赖关系解决了我的问题。
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>