[英]Tomcat8 ClassNotFoundException BasicDataSourceFactory
好吧,我一直在努力使它工作太久了。 我的案子确实需要一些投入。 我已经阅读了很多关于此的不同问题,并尝试了多种解决方案,但似乎没有任何效果对我有用。
我正在尝试在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]
我的设置是这样的:
我已将.war放入WEB-INF / conf / context.xml下的第一个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"
我还尝试过在我的.war中的org.apache.tomcat.dbcp
库中添加WEB-INF / lib /
我在.war中的WEB-INF / web.xml下有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;
}
}
要了解有关此解决方案的更多信息,我在以下代码示例“纯Java语言”下的https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html找到了答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.