首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Tomcat8 ClassNotFoundException BasicDataSourceFactory

Tomcat8 ClassNotFoundException BasicDataSourceFactory
EN

Stack Overflow用户
提问于 2017-07-06 09:56:38
回答 1查看 2.1K关注 0票数 0

好吧,我一直想让这件事起作用太久了。我真的需要为我的案子提供一些投入。我读过很多关于这方面的不同问题,并尝试了多种解决方案,但似乎没有什么对我有用。

我试图在AWS上的环境中设置一个数据库池。环境配置是:64位Amazon 2017.03 v2.6.1运行Tomcat 8 Java 8。

我遇到的问题是,我得到了这个例外:

代码语言:javascript
运行
复制
javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory]

我的设计是这样的:

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

代码语言:javascript
运行
复制
<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>

在这里,我尝试用不同的值提供工厂参数,例如

代码语言:javascript
运行
复制
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

我还尝试添加了两个org.apache.tomcat.dbcp库,也在WEB/lib/下的.war中添加。

我的web.xml在WEB/web.xml下面的.war中。

代码语言:javascript
运行
复制
<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>

那么,在我的代码中,我是这样做的

代码语言:javascript
运行
复制
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 working /lib文件夹中添加了库,并添加了factory="org.apache.tomcat.jdbc.pool.DataSourceFactory",或者添加了一些类似于factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"的库,但它仍然无法工作。即使我将工厂设置为DataSourceFactory,我仍然得到了无法找到BasicDataSourceFactory的相同例外。

我想我需要一些明确的解释,说明哪些文件或库准确地放在哪个文件夹中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-07 12:21:53

好的,我想我已经想出了解决这个问题的办法。我不知道这是不是最好的方法,但它似乎对我很好。

我所做的就是跳过所有关于xml文件的内容,而是用java做所有的事情。

我删除了context.xml和web.xml中有关资源的内容。

然后,我使用我找到的一些默认设置和为我的情况修改的一些默认设置,对数据库类进行了如下更改:

代码语言:javascript
运行
复制
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‘Java一节中

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44945648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档