Java Tomcat8 ClassNotFoundException BasicDataSourceFactory

Java Tomcat8 ClassNotFoundException BasicDataSourceFactory,java,tomcat,amazon-elastic-beanstalk,connection-pooling,tomcat8,Java,Tomcat,Amazon Elastic Beanstalk,Connection Pooling,Tomcat8,好吧,我已经试着让它工作太久了。我真的需要为我的案子提供一些信息。我读过很多关于这方面的不同问题,并尝试了多种解决方案,但似乎没有什么对我有效 我正在尝试在AWS上的环境中设置数据库池。环境配置为: 运行Tomcat 8 Java 8的64位Amazon Linux 2017.03 v2.6.1 我遇到的问题是我遇到了以下异常: javax.naming.NamingException: Could not create resource factory instance [Root excep

好吧,我已经试着让它工作太久了。我真的需要为我的案子提供一些信息。我读过很多关于这方面的不同问题,并尝试了多种解决方案,但似乎没有什么对我有效

我正在尝试在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>
我还尝试将
org.apache.tomcat.dbcp
库添加到WEB-INF/lib下的my.war中/

我在web-INF/web.xml下的my.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>
问题可能归结为库不在正确的位置,我读到您需要将其添加到CATALINA_HOME/lib,这不是我添加库的位置吗?如何在AWS环境中将库添加到此文件夹

是否需要进行其他更改或添加其他库

我注意到,即使我在.war WEB-INF/lib文件夹中添加了库,并添加了
factory=“org.apache.tomcat.jdbc.pool.DataSourceFactory”
或类似
factory=“org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory”
的内容,它仍然不起作用。即使我将工厂设置为
DataSourceFactory
,我仍然得到同样的异常,即找不到
BasicDataSourceFactory


我想我需要一些关于哪些文件或库确切地放在哪个文件夹中的清晰解释。

好的,所以我想我已经找到了解决方法。虽然我不知道这是否是最好的方法,但它似乎对我很有效

我所做的是跳过所有关于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;
}
}
为了了解更多关于这个解决方案的信息,我在这里的代码示例Plain Ol'Java一节中找到了我的答案

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;
}
}
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;
}
}