【发布时间】: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