Java 使用Tomcat DBCP的JDBC需要Tomcat'中的JDBC驱动程序;s own/lib
我有一个简单的servlet,它使用TomcatDBCP获取连接Java 使用Tomcat DBCP的JDBC需要Tomcat'中的JDBC驱动程序;s own/lib,java,tomcat,jdbc,Java,Tomcat,Jdbc,我有一个简单的servlet,它使用TomcatDBCP获取连接 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... Connection conn = null; try { conn = createConnection(); .... } public Connection creat
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
...
Connection conn = null;
try {
conn = createConnection();
....
}
public Connection createConnection() throws SQLException {
Connection conn = null;
DataSource datasource = new DataSource();
PoolProperties p = new PoolProperties();
p.setUrl("jdbc:oracle:thin:@localhost:1521:XE");
p.setDriverClassName("oracle.jdbc.OracleDriver");
p.setUsername("SYSTEM");
p.setPassword("password");
datasource.setPoolProperties(p);
try {
conn = datasource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
它需要将ojdbc6.jar放在tomcat的/lib文件夹中,而不是WEB-INF/lib中
第一个问题的答案就是你在第二个问题中提到的链接。这就是为什么您应该将JDBC驱动程序放在
/lib
中。通常人们建议不要使用/lib
,但JDBC驱动程序是一个很大的例外
对于第二个问题,解决方法是将其放在Tomcat的shared/lib文件夹中。就这样。这就是解决方法。看这里:tomcat的/lib不适合你?是的,它适合你。但是为什么web inf/lib不是呢working@Michael-O我没有使用上下文查找。只有在servlet运行时,才会在运行时创建正常的数据源对象。那么类加载器不应该看到它吗?Tomcat默认使用两级类加载器系统。有一个系统范围的类加载器,然后每个战争都有一个类加载器。WAR中的类可以使用系统类加载器找到的类,但情况并非如此。Tomcat DBCP是由系统类加载器加载的,因此它不能使用WAR类加载器加载的JDBC驱动程序。那么你的意思是,虽然在这种情况下使用shared/lib会增加内存泄漏的可能性,但这是唯一的解决方法?你的链接(你提到的另一个问题)说,“当您在不重新启动Tomcat的情况下重新部署web应用程序时,将JDBC驱动程序放入Tomcat的lib文件夹将有助于防止内存泄漏,例如,如果您刚刚将新WAR文件放入Tomcat的webapps文件夹中。“所以这与你所说的几乎相反。使用共享的
/lib
将减少内存泄漏的机会。/lib
的缺点是系统中的所有WAR
都必须使用相同版本的JDBC驱动程序。这是反对使用/lib
的主要原因之一,但对于JDBC来说,好处大于成本。你是对的。我看错了。我应该睡觉而不是继续睡下去