Hikaricp - Errore di collegamento con HikaridaTasource
Domanda
Ho un errore di collegamento quando avvio JBoss come 6.1 con un HikariDataSource
.Come risolvere questo?
Io uso hikaricp 1.3.3:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>1.3.3</version>
</dependency>
.
Spring 3.2, JBoss come 6.1, Ibernazione 3.6.6 (in bundle con JBoss).Ho rimosso persistenze.xml e Confgiure il mio DataSource utilizzando programmaticamente utilizzando l'approccio LocalContainerEntityManagerFactoryBean
da: http://www.baeldung.com/2011/12/13/the-persistence-layer-with-spring-3-1-and-jpa/ .
La mia DS ho configurato semplicemente:
@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;
}
.
e la fine dello stacktrace è:
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
. Soluzione 2
su JBoss AS 6.1 La soluzione a questo problema è stata per me mettendo Hikaricp-1.3.5.jar \ Server \ app \ lib e in Pom.xml lo impostare come provided
.Quando ho migrato l'applicazione su Wildfly 8 Hikari funziona come compile
.
Altri suggerimenti
Suggerirei due cose.Innanzitutto, suggerisco di aggiornare Hikaricp all'ultima versione, 1.3.5.
In secondo luogo, l'errore viene visualizzato relativo a ClassLoader, l'eccezione java.lang.ExceptionInInitializerError
indica che l'inizializzazione della classe statica per HikariConfig
viene eseguita due volte in qualche modo.Questo dovrebbe essere possibile solo se ci sono due cardallatrici che fanno riferimento allo stesso barattolo Hikaricp.Assicurarsi che il barattolo Hikaricp non sia situato nella directory della biblioteca globale per JBoss, ma si trova invece nella directory della biblioteca container dell'applicazione.Se ci sono più contenitori di applicazione, il barattolo Hikaricp dovrebbe essere posizionato in ciascuno di essi individualmente.