2013-12-19 54 views
1

我已成功使用C3P0 0.9.1.2Jetty 8.1.13.v20130916。在我的Jetty服務器實例中,使用Jetty XML配置文件,我將支持C3P0的DataSource綁定到JNDI。然後我的web應用程序按名稱查找這個DataSource。這一直工作。C3P0 0.9.5-pre6與碼頭9.1

我目前正在遷移到C3P0 0.9.5-pre6Jetty 9.1.0.v20131115

由於此遷移,C3P0連接池不再工作。我嘗試過不同的未混合和集中策略。

由於遷移,下面的兩個UNPOOLED綁定策略工作

<Configure id="Server" class="org.eclipse.jetty.server.Server"> 
    .... 
    <!-- raw mysql connection without C3P0 - THIS WORKS! --> 
    <New id="jdbc-myds" class="org.eclipse.jetty.plus.jndi.Resource"> 
    <Arg></Arg> 
    <Arg>jdbc/myds</Arg> 
    <Arg> 
     <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"> 
     <Set name="Url">jdbc:mysql://localhost:3306/myds?useUnicode=true&amp;characterEncoding=UTF-8</Set> 
     <Set name="User">user</Set> 
     <Set name="Password">pass</Set> 
     </New> 
    </Arg> 
    </New> 
</Configure> 

<Configure id="Server" class="org.eclipse.jetty.server.Server"> 
    .... 
    <!-- UNPOOLED c3p0 factory - THIS WORKS! --> 
    <New id="jdbc-myds" class="org.eclipse.jetty.plus.jndi.Resource"> 
    <Arg></Arg> 
    <Arg>jdbc/myds</Arg> 
    <Arg> 
     <Call class="com.mchange.v2.c3p0.DataSources" name="unpooledDataSource"> 
     <Arg>jdbc:mysql://localhost:3306/myds?useUnicode=true&amp;characterEncoding=UTF-8</Arg> 
     <Arg>user</Arg> 
     <Arg>pass</Arg> 
     </Call> 
    </Arg> 
    </New> 
</Configure> 


由於遷移,下面的兩個彙集個綁定策略不起作用

<Configure id="Server" class="org.eclipse.jetty.server.Server"> 
    .... 
    <!-- typical C3P0 pool configuration - THIS DOESN'T WORK FOR ME SINCE MIGRATION --> 
    <New id="jdbc-myds" class="org.eclipse.jetty.plus.jndi.Resource"> 
    <Arg></Arg> 
    <Arg>jdbc/myds</Arg> 
    <Arg> 
     <New class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
     <Set name="DriverClass">com.mysql.jdbc.Driver</Set> 
     <Set name="JdbcUrl">jdbc:mysql://localhost:3306/myds?useUnicode=true&amp;characterEncoding=UTF-8</Set> 
     <Set name="User">user</Set> 
     <Set name="Password">password</Set> 
     </New> 
    </Arg> 
    </New> 
</Configure> 

<Configure id="Server" class="org.eclipse.jetty.server.Server"> 
    .... 
    <!-- wrapping the successfully working C3P0 unpooled DataSource in a pooled DataSource - THIS DOESN'T WORK --> 
    <New id="jdbc-myds" class="org.eclipse.jetty.plus.jndi.Resource"> 
    <Arg></Arg> 
    <Arg>jdbc/myds</Arg> 
    <Arg> 
     <Call class="com.mchange.v2.c3p0.DataSources" name="pooledDataSource"> 
     <Arg> 
      <Call class="com.mchange.v2.c3p0.DataSources" name="unpooledDataSource"> 
      <Arg>jdbc:mysql://localhost:3306/myds?useUnicode=true&amp;characterEncoding=UTF-8</Arg> 
      <Arg>user</Arg> 
      <Arg>pass</Arg> 
      </Call> 
     </Arg> 
     </Call> 
    </Arg> 
    </New> 
</Configure> 


在未果的情況下,訪問服務器時,服務器的HTTP響應是一個碼頭停HTTP錯誤:503,服務不可用
即使服務器啓動日誌中說,JNDI資源已成功註冊,此刻我想通過名稱來訪問我的web應用程序內部的JNDI資源,它不存在了:調用

DataSource myds = new InitialContext().lookup("java:comp/env/jdbc/myds"); 

拋出InvalidClassExceptionNamingException

17:08:33.907 [main] WARN jndi - 
java.io.InvalidClassException: com.mchange.v2.c3p0.WrapperConnectionPoolDataSource; local class incompatible: stream classdesc serialVersionUID = -7086951306718003710, local class serialVersionUID = 7806429541739165290 
     at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:617) ~[na:1.7.0_45] 
     at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1622) ~[na:1.7.0_45] 
     at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517) ~[na:1.7.0_45] 
     at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) ~[na:1.7.0_45] 
     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) ~[na:1.7.0_45] 
     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) ~[na:1.7.0_45] 
     at com.mchange.v2.ser.SerializableUtils.deserializeFromByteArray(SerializableUtils.java:132) ~[mchange-commons-java-0.2.6.3.jar:0.2.6.3] 
     at com.mchange.v2.ser.SerializableUtils.fromByteArray(SerializableUtils.java:111) ~[mchange-commons-java-0.2.6.3.jar:0.2.6.3] 
     at com.mchange.v2.naming.JavaBeanObjectFactory.createPropertyMap(JavaBeanObjectFactory.java:98) ~[mchange-commons-java-0.2.6.3.jar:0.2.6.3] 
     at com.mchange.v2.naming.JavaBeanObjectFactory.getObjectInstance(JavaBeanObjectFactory.java:59) ~[mchange-commons-java-0.2.6.3.jar:0.2.6.3] 
     at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321) ~[na:1.7.0_45] 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:476) [jetty-jndi-9.1.0.v20131115.jar:9.1.0.v20131115] 
     at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:518) [jetty-jndi-9.1.0.v20131115.jar:9.1.0.v20131115] 
     at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:533) [jetty-jndi-9.1.0.v20131115.jar:9.1.0.v20131115] 
     at javax.naming.InitialContext.lookup(InitialContext.java:411) [na:1.7.0_45] 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:468) [jetty-jndi-9.1.0.v20131115.jar:9.1.0.v20131115] 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536) [jetty-jndi-9.1.0.v20131115.jar:9.1.0.v20131115] 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536) [jetty-jndi-9.1.0.v20131115.jar:9.1.0.v20131115] 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536) [jetty-jndi-9.1.0.v20131115.jar:9.1.0.v20131115] 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:551) [jetty-jndi-9.1.0.v20131115.jar:9.1.0.v20131115] 
     at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:117) [jetty-jndi-9.1.0.v20131115.jar:9.1.0.v20131115] 
     at javax.naming.InitialContext.lookup(InitialContext.java:411) [na:1.7.0_45] 
     at com.example.spring.config.MainConfig.dataSource(MainConfig.java:65) [classes/:na] 
     at com.example.spring.config.MainConfig$$EnhancerByCGLIB$$8673699d.CGLIB$dataSource$0(<generated>) [cglib-nodep-2.2.2.jar:na] 
     at com.example.spring.config.MainConfig$$EnhancerByCGLIB$$8673699d$$FastClassByCGLIB$$554d588d.invoke(<generated>) [cglib-nodep-2.2.2.jar:na] 
     at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) [cglib-nodep-2.2.2.jar:na] 
     at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:280) [spring-context-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
     at com.example.spring.config.MainConfig$$EnhancerByCGLIB$$8673699d.dataSource(<generated>) [cglib-nodep-2.2.2.jar:na] 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_45] 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_45] 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_45] 
     at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_45] 
     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:149) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
     at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:570) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1015) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:911) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
     at .............(shortened for brevity) 
17:08:33.908 [main] ERROR c.example.spring.config.MainConfig - Couldn't either create InitialContext or couldn't lookup jdbc/myds 
javax.naming.NamingException: com.mchange.v2.c3p0.WrapperConnectionPoolDataSource; local class incompatible: stream classdesc serialVersionUID = -7086951306718003710, local class serialVersionUID = 7806429541739165290 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:485) 
     at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:518) 
     at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:533) 
     at javax.naming.InitialContext.lookup(InitialContext.java:411) 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:468) 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536) 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536) 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536) 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:551) 
     at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:117) 
     at javax.naming.InitialContext.lookup(InitialContext.java:411) 
     at com.example.spring.config.MainConfig.dataSource(MainConfig.java:65) 
     at com.example.spring.config.MainConfig$$EnhancerByCGLIB$$8673699d.CGLIB$dataSource$0(<generated>) 
     at com.example.spring.config.MainConfig$$EnhancerByCGLIB$$8673699d$$FastClassByCGLIB$$554d588d.invoke(<generated>) 
     at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 
     at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:280) 
     at com.example.spring.config.MainConfig$$EnhancerByCGLIB$$8673699d.dataSource(<generated>) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at .............(shortened for brevity) 

任何人都可以看到我身邊的任何錯誤配置?

+1

您的WebAppClassloader和您的服務器類加載器中是否有'com.mchange.v2.c3p0.WrapperConnectionPoolDataSource'來發生該不兼容的classchange錯誤? –

+0

謝謝,這指出我正確的方向......! – Abdull

回答

1

@ Joakim的建議幫助我找到問題的根源並找到解決方案。這個問題的根源並沒有任何與碼頭9.1,而是從Maven的依賴庫梗具有的是較舊C3P0版本0.9.1.1傳遞依賴:

我的Web應用程序使用Quartz調度,所以我的應用程序的pom.xml包括

<dependency> 
    <groupId>org.quartz-scheduler</groupId> 
    <artifactId>quartz</artifactId> 
    <version>2.2.0</version> 
</dependency> 

org.quartz-scheduler:quartz:2.2.0c3p0:c3p0:0.9.1.1的依賴。

C3P0的舊版本與我在Jetty服務器實例的lib/etc/目錄中的新版本com.mchange:c3p0:0.9.5-pre6發生衝突。


解決我的問題是要明確排除對老C3P0神器石英」的依賴:

<dependency> 
    <groupId>org.quartz-scheduler</groupId> 
    <artifactId>quartz</artifactId> 
    <version>2.2.0</version> 
     <exclusions> 
      <exclusion> 
       <groupId>c3p0</groupId> 
       <artifactId>c3p0</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

至少對於我的具體使用石英,石英依然很不錯。