Tomcat 使用JDBC部署的NetBeans web应用程序提供;java.sql.SQLException:未找到合适的驱动程序;

Tomcat 使用JDBC部署的NetBeans web应用程序提供;java.sql.SQLException:未找到合适的驱动程序;,tomcat,netbeans,jdbc,Tomcat,Netbeans,Jdbc,我在部署到Tomcat的NetBeans中使用JDBC创建了一个Java web应用程序,该应用程序会出现“Java.sql.SQLException:找不到适合的驱动程序…”错误。当我将同一个应用程序作为非web Java应用程序运行时,它可以正常工作。我将使用的JDBC驱动程序的jar添加到web应用程序库中。解决方案是(在SQL Server的情况下)调用DriverManager.registerDriver(新的com.microsoft.sqlserver.JDBC.SQLServe

我在部署到Tomcat的NetBeans中使用JDBC创建了一个Java web应用程序,该应用程序会出现“Java.sql.SQLException:找不到适合的驱动程序…”错误。当我将同一个应用程序作为非web Java应用程序运行时,它可以正常工作。我将使用的JDBC驱动程序的jar添加到web应用程序库中。

解决方案是(在SQL Server的情况下)调用DriverManager.registerDriver(新的com.microsoft.sqlserver.JDBC.SQLServerDriver())。确保在执行任何JDBC操作之前调用此函数。必须使用适当的JDBC驱动程序调用此方法。要不硬编码驱动程序,可以使用Class.forName(“full.driver.name”).newInstance()。这可能不是特定于NetBeans的问题,而是Tomcat/JDBC的问题


请注意,这看起来更像是一种变通方法,而不是真正的解决方案,因为为什么web应用程序中需要这种方法,而非web应用程序中不需要这种方法?

Tomcat可能需要在Tomcat 5.x的/lib服务器或6.x的/lib服务器中找到该JAR。类加载器有一个层次结构:引导、应用服务器、WAR。如果Tomcat应用服务器正在寻找JDBC驱动程序JAR,那么在战争中就找不到它

但是找不到驱动程序类会导致ClassNotFoundException

“java.sql.SQLException:找不到适合的驱动程序…”通常表示连接URL有语法错误。我先检查一下。不要被“它作为一个非web应用程序运行良好”所愚弄。这告诉我你的web应用程序是不同的。如果您已经设置了JNDI连接池(这是推荐的最佳实践),那么您的URL可能不完全相同

java.sql.SQLException:未找到合适的驱动程序

需要明确的是,此异常可能有两个原因:

  • 驱动程序未加载
  • 对于任何加载的驱动程序,
    Driver#acceptsURL()
    ,URL(错误)没有返回
    true
  • 现在回到您的“解决方案”,它实际上是解决方案:

    请注意,这似乎更像是一种变通方法,而不是真正的解决方案,因为为什么在web应用程序中需要这样做,而在非web应用程序中不需要这样做

    JDBC4有一个新特性:
    DriverManager
    将自动加载类路径中的任何驱动程序,并在JAR文件的服务加载程序中定义。这只适用于Java6环境。可能您的问题是Web服务器使用的是Java5JVM

    然而,我并不总是依赖它,而是坚持使用
    Class#forName()
    。在设计良好的DAO层中,只需执行一次。或者,更好的方法是让webcontainer为其管理数据源,这样您就可以从连接池中获益,从而大大提高连接性能

    此外,我要澄清一个误解:

    对于正确设计的JDBC驱动程序,
    newInstance()
    调用实际上不是必需的。一个好的JDBC驱动程序将按如下方式注册自身:

    static {
        DriverManager.registerDriver(new ThisDriver());
    }
    
    但是设计拙劣的JDBC驱动程序(现在应该没有了,如果我没记错的话,这只发生在MySQL JDBC驱动程序的一个最旧版本中)做了以下工作:

    private ThisDriver() {
        DriverManager.registerDriver(this);
    }
    
    因此,它确实需要调用
    newInstance()
    来注册自己。这成了一个神话,因为从那时起每个人都被推荐这样做。这是不必要的。只要不使用它,就可以保存一个不必要的实例化


    希望这能有所帮助。

    虽然我将此标记为答案,但BalusC的答案有很多有用的细节。他的回答更像是对我的回答的回答,我试着把jar放在Tomcat的lib目录中,但是没有用。该问题不是连接URL问题。更多详情请参见BalusC的帖子。
    private ThisDriver() {
        DriverManager.registerDriver(this);
    }