【问题标题】:Tomcat8 ClassNotFoundException BasicDataSourceFactoryTomcat8 ClassNotFoundException BasicDataSourceFactory
【发布时间】:2017-12-10 06:26:53
【问题描述】:

好的,所以我一直试图让它工作太久了。我真的需要一些关于我的案例的意见。我已经阅读了很多关于此的不同问题并尝试了多种解决方案,但似乎没有任何对我有用。

我正在尝试在 AWS 上的环境中设置数据库池。环境配置为: 运行 Tomcat 8 Java 8 的 64 位 Amazon Linux 2017.03 v2.6.1。

我遇到的问题是我得到了这个异常:

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

我的设置是这样的:

我在 WEB-INF/conf/context.xml 下的 .war 中放入的第一个 context.xml 文件,首先这是正确的位置吗?

<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/ 下

我在 WEB-INF/web.xml 下的 .war 中有 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 的异常。

我想我需要对哪些文件或库确切地放在哪个文件夹中进行一些明确的解释。

【问题讨论】:

    标签: java tomcat amazon-elastic-beanstalk connection-pooling tomcat8


    【解决方案1】:

    好的,我想我已经找到了解决它的方法。我不知道这是否是最好的方法,但它似乎对我来说效果很好。

    我所做的是跳过所有关于 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 的 Code Example Plain Ol' Java 部分下找到了我的答案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-07
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      相关资源
      最近更新 更多