2017-07-06 56 views
0

好吧,我一直試圖讓它工作太久。我真的需要一些我的情況的輸入。我已經閱讀了很多關於此問題的不同問題,並嘗試了多種解決方案,但似乎沒有任何工作適合我。Tomcat8 ClassNotFoundException BasicDataSourceFactory

我想在我的AWS環境上設置數據庫池。環境配置爲: 64位Linux的亞馬遜2017.03 V2.6.1運行Tomcat Java的8 8

的問題我運行到是我得到這個異常:

javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory] 

我的設立是這樣的:

我把第一個context.xml文件放在WEB-INF/conf/context.xml下的.war文件中,首先這是正確的位置?

<Context> 
<Resource name="jdbc/TestDB" 
      auth="Container" 
      type="javax.sql.DataSource" 
      maxTotal="20" 
      maxIdle="10" 
      maxWaitMillis="10000" 
      username="username" 
      password="password" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://database-url.example"/> 
</Context> 

在這裏,我試圖既提供出廠參數不同的值,如

factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 

我自己也嘗試下添加兩個org.apache.tomcat.dbcp庫,也是我的.war WEB-INF/lib目錄/

的我在我的.war web.xml中在WEB-INF/web.xml中

<web-app> 
. . . 
    <resource-ref> 
    <description>DB Connection</description> 
    <res-ref-name>jdbc/TestDB</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    </resource-ref> 
</web-app> 

然後在我的代碼我這樣做

public class Database { 

private static DataSource dataSource; 

static { 
    try { 
     Context initCtx = new InitialContext(); 
     Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
     dataSource = (DataSource) envCtx.lookup("jdbc/TestDB"); 
    } catch(NamingException e) { 
     e.printStackTrace(); 
    } 
} 

public static Connection getPoolConnection() { 
    try { 
     return dataSource.getConnection(); 
    } catch(SQLException e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 
} 

問題可能歸結爲不存在在正確的地方圖書館,我看了一下,你需要將它添加到CATALINA_HOME/lib中,這是不是與我添加庫相同的位置?我如何在我的AWS環境中將庫添加到此文件夾?

是否有任何其他更改需要製作或添加其他庫?

我注意到,即使我在.war WEB-INF/lib文件夾中添加了庫,並添加了factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"或像factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"這樣的一些東西,它仍然無法正常工作。即使我將工廠設置爲DataSourceFactory,但我仍然會得到與BasicDataSourceFactory無法找到的相同的例外情況。

我想我需要一些清楚的解釋,哪些文件或庫完全放在哪個文件夾中。

回答

0

好吧,我想我已經想出了一個解決方法。我不知道這是否是最好的方式,但它似乎對我來說很好。

我所做的就是跳過所有關於xml文件,並用java代替所有內容。

我刪除了有關資源的context.xml和web.xml中的內容。

然後,我改變了我的數據庫類這樣的,用我發現了一些默認設置和一些我修改了我的情況:

public class Database { 

private static DataSource dataSource; 

static { 
    // Getting environment variables I have set in server 
    String dbName = System.getProperty("DB_NAME"); 
    String userName = System.getProperty("DB_USERNAME"); 
    String password = System.getProperty("DB_PASSWORD"); 
    String hostname = System.getProperty("DB_HOSTNAME"); 
    String port = "3306"; //System.getProperty("RDS_PORT"); 

    PoolProperties p = new PoolProperties(); 
    p.setUrl("jdbc:mysql://" + hostname + ":" + port + "/" + dbName); 
    p.setDriverClassName("com.mysql.jdbc.Driver"); 
    p.setUsername(userName); 
    p.setPassword(password); 
    p.setJmxEnabled(true); 
    p.setTestWhileIdle(false); 
    p.setTestOnBorrow(true); 
    p.setValidationQuery("SELECT 1"); 
    p.setTestOnReturn(false); 
    p.setValidationInterval(30000); 
    p.setTimeBetweenEvictionRunsMillis(30000); 
    p.setMaxActive(20); 
    p.setInitialSize(5); 
    p.setMaxWait(15000); 
    p.setRemoveAbandonedTimeout(60); 
    p.setMinEvictableIdleTimeMillis(30000); 
    p.setMaxIdle(10); 
    p.setLogAbandoned(true); 
    p.setRemoveAbandoned(true); 
    p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" + 
      "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); 
    dataSource = new DataSource(); 
    dataSource.setPoolProperties(p); 
} 

public static Connection getPoolConnection() { 
    try { 
     return dataSource.getConnection(); 
    } catch(SQLException e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 
} 

想了解更多關於該解決方案,我發現我的答案在這裏https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html下部分代碼示例Plain Ol'Java