2011-01-25 147 views
5

我試圖用新的Tomcat 7.0 JDBC連接池和MySQL。它說here,您可以將最新的tomcat-jdbc.jar放到Tomcat 6.0環境中的tomcat/lib目錄中,這就是我所做的。的SQLException瓦特/ Tomcat的7.0 JDBC連接池和MySQL

我使用Spring來初始化和實例每個實例的數據源的網絡上:

<bean id="myDataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close" 
p:driverClassName="${driver_class}" 
p:url="${url}" 
p:username="${username?root}" 
p:password="${password}" 
p:initialSize="10" 
p:initSQL="SELECT DTS FROM DT_TM_TS FOR READ ONLY WITH UR" 
p:minIdle="10" 
p:maxIdle="100" 
p:maxActive="100" 
p:maxWait="6000" 
p:jmxEnabled="true" 
p:jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer" 
p:removeAbandoned="true" 
p:removeAbandonedTimeout="60" 
p:logAbandoned="true" 
p:testOnBorrow="true" 
p:testOnReturn="false" 
p:testWhileIdle="false" 
p:useEquals="false" 
p:fairQueue="false" 
p:timeBetweenEvictionRunsMillis="30000" 
p:minEvictableIdleTimeMillis="30000" 
p:validationInterval="1800000" 
p:validationQuery="SELECT DTS FROM DT_TM_TS FOR READ ONLY WITH UR" 
/> 

然而,當我嘗試連接到數據庫,它拋出這個異常:

java.sql.SQLException: "com.mysql.jdbc.Driver" 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:243) 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:176) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:647) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:589) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:452) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:130) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:99) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:110) 
    at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:46) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:111) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2101) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1325) 
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669) 
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:132) 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:225) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:308) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findDefaultEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:529) 
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:495) 
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:656) 
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:629) 
    at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:147) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) 
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:338) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135) 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630) 
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785) 
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) 
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445) 
    at org.apache.catalina.core.StandardService.start(StandardService.java:519) 
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) 
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) 
Caused by: java.lang.ClassNotFoundException: "com.mysql.jdbc.Driver" 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:247) 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:236) 
    ... 59 more 

我在webapp WEB-INF/lib和tomcat/lib中都有mysql-connector-java-5.1.13-bin.jar。我可以在persistence.xml(無數據源/連接池)中正確連接驅動程序詳細信息。

+0

你怎麼也更新``在標籤resource`(數據源定義)factory`屬性。此外,這個堆棧跟蹤看起來並不完整(是嗎?)。 – 2011-01-25 06:40:41

+0

不,數據源不是由Spring創建的Tomcat的DataSourceFactory創建的。順便說一句,我現在在Tomcat 6 web容器中運行,問題依然存在。 – 2011-01-26 05:42:48

回答

0

在Tomcat的6.0,我需要把我的JDBC驅動程序到common/lib目錄/

但是對於搜索路徑catalina.properties配置中出現退房的財產common.loader。確保common/lib在那裏列出。

2

我使用Spring 3.1,Hibernate的4.0中,VMware的vFabric在Tomcat 7.0.20.B和Maven 3 TC Server開發版2.6.1具有Maven的管理連接器我遇到了同樣的問題。

逸岸閱讀manual我發現

driverClassName

(string)的 JDBC驅動程序的完全限定的Java類名使用。 司機必須來自同一 類加載器的tomcat-了jdbc.jar訪問

所以我通過在加入了MySQL連接器(使用mysql-connector-java的5.1.18-bin.jar)解決Tomcat的(的vFabric-TC-服務器顯影劑2.6.1.RELEASE/Tomcat的7.0.20.B.RELEASE/LIB)的lib目錄和在Maven的連接器包的範圍設定爲提供。

6

其實有一個很簡單的解決方法在於春。而不是讓Tomcat連接池創建數據庫連接,並且由於類加載器shenanigans而失敗,所以讓Spring創建它並將引用傳遞給連接池。

<!-- Data source template for use in the connection pool. --> 
<bean id="dataSourceTemplate" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${jdbc.driver}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
</bean> 

<!-- Connection pool as data source. --> 
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"> 
    <!-- Refer to a separately created bean as a data source template to work around a quirk of Tomcat's class loader. --> 
    <property name="dataSource" ref="dataSourceTemplate" /> 
    ... 
</bean> 

然後,連接池實際上將使用數據庫連接作爲模板來創建儘可能多的其他連接。

最好的部分是,你不必使用Tomcat/lib中,你甚至可以不進入混亂。