使用JDBC的已部署NetBeans Web应用程序提供“java.sql.SQLException:找不到合适的驱动程序”

时间:2009-11-14 01:54:53

标签: tomcat netbeans jdbc

我有一个Java Web应用程序,它使用在NetBeans中创建的JDBC部署到Tomcat,它提供了“java.sql.SQLException:找不到合适的驱动程序...”错误。当我将其作为非Web Java应用程序运行时,相同的应用程序工作正常。我将我正在使用的JDBC驱动程序的jar添加到Web应用程序的库中。

3 个答案:

答案 0 :(得分:2)

  

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

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

  1. 未加载驱动程序。
  2. 对于任何已加载的驱动程序,(错误的)网址未为true返回Driver#acceptsURL()
  3. 现在回到你的“解决方法”,这实际上是解决方案:

      

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

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

    但我并不总是依赖它,只是坚持使用Class#forName()。在设计良好的DAO层中,您只需要执行一次。或者,更好的是,让webcontainer为其管理数据源,以便您可以从连接池中受益,从而在连接性能方面取得重大改进。

    此外,我会清除一个误解:

    Class.forName("full.driver.name").newInstance()
    

    正确设计的JDBC驱动程序newInstance()调用实际上。一个不错的JDBC驱动程序将按如下方式注册:

    static {
        DriverManager.registerDriver(new ThisDriver());
    }
    

    但设计不佳的JDBC驱动程序(现在实际上应该没有,这只发生在MySQL JDBC驱动程序的最旧版本之一,如果我是正确的)执行了以下操作:

    private ThisDriver() {
        DriverManager.registerDriver(this);
    }
    

    因此真正需要newInstance()调用以使自己注册。这成了一个神话,因为从那以后每个人都被推荐这样做。这不是必需的。只要离开它就可以节省不必要的实例化。

    希望这有帮助。

答案 1 :(得分:0)

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

请注意,这似乎更像是一种解决方法,而不是一个真正的解决方案,因为为什么在Web应用中而不是在非Web应用中需要它?

答案 2 :(得分:0)

Tomcat可能需要在服务器/ lib中找到Tomcat 5.x或/ lib for 6.x的JAR。有一个类加载器的层次结构:bootstrap,app server,WAR。如果Tomcat应用服务器正在寻找JDBC驱动程序JAR,它将无法在WAR中找到它。

但是找不到驱动程序类会得到ClassNotFoundException。

“java.sql.SQLException:找不到合适的驱动程序...”通常表示连接URL有语法错误。我先检查一下。不要被“它作为非网络应用程序正常工作”所迷惑。这告诉我你的网络应用程序是不同的。如果您已经建立了JNDI连接池,这是推荐的最佳做法,那么您的URL可能并不完全相同。