2014-03-03 52 views
7

我試圖在tomcat上運行項目7.0.52並通過context.xml文件初始化爲DB。SEVERE:無法創建池的初始連接 - tomcat 7與context.xml文件

但它引發了一堆例外,我無法弄清楚那裏有什麼問題。

這裏是控制檯輸出:

java.sql.SQLException: com.mysql.jdbc.Driver 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:254) 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:701) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:635) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:486) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:144) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:116) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:103) 
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:554) 
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:242) 
    at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:141) 
    at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321) 

這裏充滿stack trace

這裏是輸出給tomcat catalina log片斷的的web.xml

<resource-ref> 
    <description>Travel Agency Datasource</description> 
    <res-ref-name>jdbc/onlinedb</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 

的context.xml

<Context> 
    <Resource name="jdbc/onlinedb" 
       type="javax.sql.DataSource" 
       factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
       maxActive="20" maxIdle="10" 
       maxWait="-1" 
       username="root" 
       password="secret" 
       driverClassName="com.mysql.jdbc.Driver" 
       url="jdbc:mysql://localhost:3306/travelagency?characterEncoding=utf8"/> 
</Context> 

的ConnectionManager類:

public class ConnectionManager { 
    private static Logger log = Logger.getLogger(ConnectionManager.class); 

    public static Connection getConnection() throws SQLException { 
     Connection con = null; 
     try { 
      Context initContext = new InitialContext(); 
      Context envContext = (Context) initContext.lookup("java:/comp/env"); 
      DataSource datasource = (DataSource) envContext.lookup("jdbc/onlinedb"); 
      con = datasource.getConnection(); 
     } catch (NamingException e) { 
      log.error(e); 
     } 
     return con; 
    } 
} 

mysql-connector-java-5.1.27-bin.jar被添加到CP:

travel

我試圖改變context.xml文件的內容:

<resource-env-ref> 
     <description>Travel Agency Datasource</description> 
     <resource-env-ref-name>jdbc/onlinedb</resource-env-ref-name> 
     <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> 
</resource-env-ref> 

但持續出現故障。

如何解決這個問題?

回答

11

您必須將一個MySQL jdbc驅動程序添加到類路徑中。

要麼把一個MySQL二進制罐子Tomcat的lib文件夾或將其添加到我們的應用程序WEB-INF/lib目錄文件夾。

你可以找到二進制罐子(更改版本相應):https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.1.27

+0

所有訣竅是,它的加入。我更新了問題。 –

+3

嘗試將它添加到tomcat庫文件夾 – WeMakeSoftware

+0

它確實有效,謝謝 –

4

當你遇到這樣的例外,最有用的信息通常是在堆棧跟蹤的底部:

Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    ... 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:246) 

的問題在於Tomcat無法找到com.mysql.jdbc.Driver。這通常是由包含MySQL驅動程序的JAR不是Tomcat希望找到它的地方引起的(即在webapps/<yourwebapp>/WEB-INF/lib目錄中)。

2

在調整完整工作的context.xml設置後,我也處理了這個異常。我不希望context.xml中的環境細節,所以我把它們拿出來,看到這個錯誤。我意識到我必須在基於System Property JVM -D args的代碼中完全創建此數據源資源。

剛刪除用戶/ pwd /主機的原始錯誤: org.apache.tomcat.jdbc.pool.ConnectionPool init SEVERE:無法創建池的初始連接。

刪除context.xml的全部內容並嘗試此操作: 在使用第一個連接之前,在啓動應用程序服務器時初始化數據源對象。如果使用Spring,那麼在@Bean數據源構造函數中的@Configuration bean中很好。

包使用方法:org.apache.tomcat.jdbc.pool *

PoolProperties p = new PoolProperties(); 
p.setUrl(jdbcUrl); 
      p.setDriverClassName(driverClass); 
      p.setUsername(user); 
      p.setPassword(pwd); 
      p.setJmxEnabled(true); 
      p.setTestWhileIdle(false); 
      p.setTestOnBorrow(true); 
      p.setValidationQuery("SELECT 1"); 
      p.setTestOnReturn(false); 
      p.setValidationInterval(30000); 
      p.setValidationQueryTimeout(100); 
      p.setTimeBetweenEvictionRunsMillis(30000); 
      p.setMaxActive(100); 
      p.setInitialSize(5); 
      p.setMaxWait(10000); 
      p.setRemoveAbandonedTimeout(60); 
      p.setMinEvictableIdleTimeMillis(30000); 
      p.setMinIdle(5); 
      p.setLogAbandoned(true); 
      p.setRemoveAbandoned(true); 
      p.setJdbcInterceptors(
       "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+ 
       "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); 
      org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource(); 
      ds.setPoolProperties(p); 
      return ds; 
+0

如果您有一個新問題,請通過單擊[問問題](http://stackoverflow.com/questions/ask)按鈕來提問。如果有助於提供上下文,請包含此問題的鏈接。 – computerfreaker

+1

對不起,在提交第一部分之前,我正在編輯,因爲我找到了解決方案。如果您認爲這現在有幫助,您可以請複製嗎? – bjm88

+0

我其實並不是那個低估了你的答案的人。然而,它仍然有點令人困惑,因爲你似乎要問一個單獨的問題,然後回答原來的問題?如果你重新編輯刪除你的問題(這將作爲一個單獨的問題,我會更好地問),我會upvote移除你的downvoter所造成的損害。 – computerfreaker