Java 使用Tomcat DBCP的JDBC需要Tomcat'中的JDBC驱动程序;s own/lib

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

我有一个简单的servlet,它使用TomcatDBCP获取连接

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中

  • 为什么web应用程序自己的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来说,好处大于成本。你是对的。我看错了。我应该睡觉而不是继续睡下去