2016-07-08 5 views
0

私はc3p0バージョン0.9.5.1を使用します。このエラーとアンラップ()メソッドのバグ:c3p0-0.9.5.2ステートメントのアンラップ原因abstractmethodror

java.lang.AbstractMethodError: Method com/mchange/v2/c3p0/impl/NewProxyStatement.unwrap(Ljava/lang/Class;)Ljava/lang/Object; is abstract at com.mchange.v2.c3p0.impl.NewProxyStatement.unwrap(NewProxyStatement.java)

これは私のコードです:

com.mysql.jdbc.Statement stm = proxyStatement.unwrap(com.mysql.jdbc.Statement.class) 

私はいくつかの記事を見たが、それは0.9.5以降動作するべきであると述べました。 まだバグですか?

どうすれば元のStatement/Connectionをc3p0 Statement/Connectionから取得できますか? ありがとうございます

+0

[C3P0 ResultSet.unwrapがでAbstractMethodErrorスロー]の可能な重複(HTTP ://stackoverflow.com/questions/1971617/c3p0-resultset-unwrap-throws-an-abstractmethoderror – MWiesner

+0

私はこの質問を見ましたが、私は答えよりも新しいバージョンを使用していますが、まだ同じエラーが発生しました –

答えて

1

ほとんどの場合、あなたのアプリケーションの有効などこかにc3p0の古いバージョンがあります。CLASSPATHこれを確認するには、C3P0のバナーにINFOで

INFO: Initializing c3p0-0.9.5.2 [built 08-December-2015 22:06:04 -0800; debug? true; trace: 10] 

のようなものを自分のログを確認してください、私はちょうどc3p0-0.9.5.2以内に指定されているような作品をアンラップという声明を検証しました。私はこれがJavaではなくScala REPLコードであることをお詫びします。それはちょうど便利なものです。しかし、基本的なアクションはJVMレベルで同じです。

[info] Starting scala interpreter... 
[info] 
Welcome to Scala version 2.11.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_31). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> import com.mchange.v2.c3p0._ 
import com.mchange.v2.c3p0._ 

scala> val cpds = new ComboPooledDataSource() 
Jul 08, 2016 1:44:43 PM com.mchange.v2.log.MLog 
INFO: MLog clients using java 1.4+ standard logging. 
Jul 08, 2016 1:44:43 PM com.mchange.v2.c3p0.C3P0Registry 
INFO: Initializing c3p0-0.9.5.2 [built 08-December-2015 22:06:04 -0800; debug? true; trace: 10] 
cpds: com.mchange.v2.c3p0.ComboPooledDataSource = com.mchange.v2.c3p0.ComboPooledDataSource[ identityToken -> 2u6yea9h1khti8o11c1oj2|2407f8d8, dataSourceName -> 2u6yea9h1khti8o11c1oj2|2407f8d8 ] 

scala> cpds.setUser("root") 

scala> cpds.setJdbcUrl("jdbc:mysql://localhost/test?useSSL=false&serverTimezone=UTC") 

scala> val conn = cpds.getConnection() 
Jul 08, 2016 1:45:03 PM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource 
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> 2u6yea9h1khti8o11c1oj2|2407f8d8, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> null, extensions -> {timezone=HKT}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> 2u6yea9h1khti8o11c1oj2|2407f8d8, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> jdbc:mysql://localhost/test?useSSL=false&serverTimezone=UTC, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 15, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ] 
conn: java.sql.Connection = [email protected] [wrapping: [email protected]] 

scala> val proxyStatement = conn.createStatement() 
proxyStatement: java.sql.Statement = [email protected] [wrapping: [email protected]] 

scala> val nativeStmt = proxyStatement.unwrap(classOf[com.mysql.cj.jdbc.StatementImpl]) 
nativeStmt: com.mysql.cj.jdbc.StatementImpl = [email protected] 

私はMySQLコネクタ/ Jバージョン6.0.3を使用しています。これはおそらくあなたのものよりも新しい(したがってStatementクラス名が異なる)。あなたはより多くの実装クラス中立な方法でステートメントをアンラップすることができます:ScalaのclassOf[java.sql.Statement]リテラルJavaのクラスと同等です

scala> val nativeStmt2 = proxyStatement.unwrap(classOf[java.sql.Statement]) 
nativeStmt2: java.sql.Statement = [email protected] 

。なお、java.sql.Statement.class

+0

とても早く返信してくれてありがとう。私のOSGiバンドルの私のクラスパスでは、私は** hibernate-c3p0-3.6.5.Final.jar **と** ** c3p0-0.9.5.2.jar **しか持っていません。まだ問題は残っています。私は階層フレームワークを使用しているので、ログには表示されませんが、私のサーバーのすべてのバンドルOSGiのMANIFEST.MFで検索しますが、これは唯一のものです。また、** mysql-connector-java-5.1.37 **を使用します。
これは古くなっているhibernate-c3p0 jarでもいいですか? –

+0

Btw私はcom.mchange.v2.c3p0.impl.NewProxyStatementのソースコードを見て、unwrap関数を見つけませんでした。それは正常ですか? –

+0

それがあります。[行1402](https://gist.github.com/swaldman/4f58039f49fe5077cf6e397ec7471a3d)を参照してください。これはコード生成ファイルであることに注意してください。あなたはそれを構築しなければなりません。ソースを直接見つけることはできません。 (ただし、Mavenのsrc jarファイルにバンドルされています) –

関連する問題