HikariCP - خطأ في الارتباط باستخدام HikariDataSource
سؤال
لدي خطأ في الارتباط عندما أبدأ تشغيل JBOSS AS 6.1 مع ملف HikariDataSource
.كيفية حل هذا؟
أستخدم hikariCP 1.3.3:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>1.3.3</version>
</dependency>
Spring 3.2، JBOSS AS 6.1، Hibernate 3.6.6 (مجمعة مع JBOSS).لقد قمت بإزالة Perstance.xml وقمت بتكوين DataSource الخاص بي برمجيًا باستخدام LocalContainerEntityManagerFactoryBean
النهج من: http://www.baeldung.com/2011/12/13/the-persistence-layer-with-spring-3-1-and-jpa/
لقد قمت بتكوين DS الخاص بي ببساطة:
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource(); //here i get the linkageError
ds.setMaximumPoolSize(15);
ds.setDataSourceClassName("com.microsoft.sqlserver.jdbc.SQLServerDataSource");
ds.addDataSourceProperty("serverName", "localhost");
ds.addDataSourceProperty("databaseName", "dbtest");
ds.addDataSourceProperty("user", "dbtest");
ds.addDataSourceProperty("password", "dbtest");
ds.setPoolName("springHikariCp");
return ds;
}
ونهاية تتبع المكدس هي:
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource com.company.test.PersistenceJPAConfig.dataSource()] threw exception; nested exception is java.lang.ExceptionInInitializerError
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:181) [:3.2.0.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:570) [:3.2.0.RELEASE]
... 135 more
Caused by: java.lang.ExceptionInInitializerError
at com.zaxxer.hikari.HikariConfig.<clinit>(HikariConfig.java:77) [:]
at com.company.test.PersistenceJPAConfig.dataSource(PersistenceJPAConfig.java:115) [:]
at com.company.test.PersistenceJPAConfig$$EnhancerByCGLIB$$2cad8762.CGLIB$dataSource$3(<generated>) [:]
at com.company.test.PersistenceJPAConfig$$EnhancerByCGLIB$$2cad8762$$FastClassByCGLIB$$7a8bcfa3.invoke(<generated>) [:]
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) [:3.2.0.RELEASE]
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:285) [:3.2.0.RELEASE]
at com.company.test.PersistenceJPAConfig$$EnhancerByCGLIB$$2cad8762.dataSource(<generated>) [:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.7.0_11]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [:1.7.0_11]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [:1.7.0_11]
at java.lang.reflect.Method.invoke(Method.java:601) [:1.7.0_11]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:160) [:3.2.0.RELEASE]
... 136 more
Caused by: java.lang.RuntimeException: javassist.CannotCompileException: by java.lang.LinkageError: loader (instance of org/jboss/classloader/spi/base/BaseClassLoader): attempted duplicate class definition for name: "com/zaxxer/hikari/proxy/ProxyFactory"
at com.zaxxer.hikari.proxy.JavassistProxyFactory.<clinit>(JavassistProxyFactory.java:58) [:]
... 148 more
Caused by: javassist.CannotCompileException: by java.lang.LinkageError: loader (instance of org/jboss/classloader/spi/base/BaseClassLoader): attempted duplicate class definition for name: "com/zaxxer/hikari/proxy/ProxyFactory"
at javassist.ClassPool.toClass(ClassPool.java:1099) [:6.1.0.Final]
at javassist.CtClass.toClass(CtClass.java:1265) [:6.1.0.Final]
at com.zaxxer.hikari.proxy.JavassistProxyFactory.modifyProxyFactory(JavassistProxyFactory.java:131) [:]
at com.zaxxer.hikari.proxy.JavassistProxyFactory.<clinit>(JavassistProxyFactory.java:54) [:]
... 148 more
Caused by: java.lang.LinkageError: loader (instance of org/jboss/classloader/spi/base/BaseClassLoader): attempted duplicate class definition for name: "com/zaxxer/hikari/proxy/ProxyFactory"
at java.lang.ClassLoader.defineClass1(Native Method) [:1.7.0_11]
at java.lang.ClassLoader.defineClass(ClassLoader.java:791) [:1.7.0_11]
at java.lang.ClassLoader.defineClass(ClassLoader.java:634) [:1.7.0_11]
at sun.reflect.GeneratedMethodAccessor131.invoke(Unknown Source) [:1.7.0_11]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [:1.7.0_11]
at java.lang.reflect.Method.invoke(Method.java:601) [:1.7.0_11]
at javassist.ClassPool.toClass2(ClassPool.java:1112) [:6.1.0.Final]
at javassist.ClassPool.toClass(ClassPool.java:1093) [:6.1.0.Final]
... 151 more
المحلول 2
في JBOSS AS 6.1 كان الحل لهذه المشكلة بالنسبة لي هو وضع HikariCP-1.3.5.jar \server\app\lib وفي pom.xml قم بتعيينه كـ provided
.عندما قمت بترحيل التطبيق إلى WildFly 8 Hikari يعمل كذلك compile
.
نصائح أخرى
أود أن أقترح شيئين.أولاً، أقترح ترقية HikariCP إلى الإصدار الأحدث، 1.3.5.
ثانيًا، يبدو أن الخطأ متعلق بمحمل الفئة، وهو الاستثناء java.lang.ExceptionInInitializerError
يشير إلى أن تهيئة الفئة الثابتة لـ HikariConfig
يتم تنفيذه مرتين بطريقة أو بأخرى.يجب أن يكون هذا ممكنًا فقط إذا كان هناك محملان للفصل الدراسي يشيران إلى نفس جرة HikariCP.تأكد من أن HikariCP jar غير موجود في دليل المكتبة العامة لـ JBoss، ولكنه موجود بدلاً من ذلك في دليل مكتبة الحاوية الخاص بالتطبيق.إذا كانت هناك حاويات تطبيقات متعددة، فيجب وضع جرة HikariCP في كل واحدة منها على حدة.