java - Tomcat8 ClassNotFoundException 基本数据源工厂

标签 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 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 库,也在我的 WEB-INF/lib/下的 .war 中

我在 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

我想我需要一些关于哪些文件或库究竟在哪个文件夹中的明确解释。

最佳答案

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

我所做的是跳过所有关于 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 部分下

关于java - Tomcat8 ClassNotFoundException 基本数据源工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44945648/

相关文章:

java - 另一个 rJava 库安装错误 : rJava. rdb' is corrupt

java - ArrayList<HashMap<String,String>> 键迭代/输出到数组

node.js - AWS beanstalk Nodejs 多核

nginx - 静态文件显示为未压缩,即使 Web 服务器已配置为 gzip 压缩

Java - can-do 接口(interface)的命名约定,而不是 can-be-done-to

java - 无法在 JMC 中为 Java 应用程序和 Eclipse IDE 打开飞行记录器

tomcat - 在浏览器崩溃时处理 session 的默认方式是什么

java - 使用 Glassfish3/4 或 Tomcat 8 和自签名证书的双向(相互)SSL

amazon-web-services - .config 文件被弹性 beantalk AWS 忽略

java - Hibernate 动态每行结果数