Tomcat 使用JDBC部署的NetBeans web应用程序提供;java.sql.SQLException:未找到合适的驱动程序;
我在部署到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的问题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
请注意,这看起来更像是一种变通方法,而不是真正的解决方案,因为为什么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
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);
}