臭名昭着的java.sql.SQLException:找不到合适的驱动程序

我试图添加一个数据库启用的JSP到现有的Tomcat 5.5应用程序(GeoServer 2.0.0,如果有帮助的话)。

该应用程序本身与Postgres会谈很好,所以我知道数据库已经启动,用户可以访问它,所有这些好东西。 我想要做的是在我添加的JSP中的数据库查询。 我已经很好的使用了Tomcat数据源示例中的configuration示例。 必需的标签库位于正确的位置 – 如果我只有标签库引用,就不会出现错误,因此它正在查找这些JAR。 postgres jdbc驱动程序postgresql-8.4.701.jdbc3.jar位于$ CATALINA_HOME / common / lib中。

这是JSP的顶部:

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <sql:query var="rs" dataSource="jdbc/mmas"> select current_validstart as ValidTime from runoff_forecast_valid_time </sql:query> 

$ CATALINA_HOME / conf / server.xml中的相关部分,在<Host>中又是在<Engine>

 <Context path="/gs2" allowLinking="true"> <Resource name="jdbc/mmas" type="javax.sql.Datasource" auth="Container" driverClassName="org.postgresql.Driver" maxActive="100" maxIdle="30" maxWait="10000" username="mmas" password="very_secure_yess_precious!" url="jdbc:postgresql//localhost:5432/mmas" /> </Context> 

这些行是webapps / gs2 / WEB-INF / web.xml中标记的最后一行:

 <resource-ref> <description> The database resource for the MMAS PostGIS database </description> <res-ref-name> jdbc/mmas </res-ref-name> <res-type> javax.sql.DataSource </res-type> <res-auth> Container </res-auth> </resource-ref> 

最后,例外:

  exception org.apache.jasper.JasperException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver" [...wads of ensuing goo elided] 

臭名昭着的java.sql.SQLException:找不到合适的驱动程序

这个例外可以有两个原因:

1. JDBC驱动程序未加载

您需要确保JDBC驱动程序放置在服务器自己的/lib文件夹中。

或者,如果您实际上不使用服务器pipe理的连接池数据源,而是手动摆弄WAR中的DriverManager#getConnection() ,则需要将JDBC驱动程序放在WAR的/WEB-INF/lib然后执行..

 Class.forName("com.example.jdbc.Driver"); 

..在第一个DriverManager#getConnection()调用之前的代码中确保您不会吞下/忽略任何可由其抛出的ClassNotFoundException ,并继续执行代码stream,就好像没有任何exception情况发生一样。 另请参见我必须在哪里放置用于Tomcat连接池的JDBC驱动程序?

2.或者,JDBC URL的语法错误

您需要确保JDBC URL符合JDBC驱动程序文档,并记住它通常区分大小写。 当JDBC URL没有为任何加载的驱动程序的Driver#acceptsURL()返回true ,那么你也会得到这个exception。

PostgreSQL的情况下, 这里logging 。

在JDBC中,数据库由URL(统一资源定位符)表示。 使用PostgreSQL™,它采用以下forms之一:

  • jdbc:postgresql:database
  • jdbc:postgresql://host/database
  • jdbc:postgresql://host:port/database

MySQL的情况下, 这里logging 。

用于连接到MySQL服务器的JDBC URL的一般格式如下,方括号( [ ] )中的项是可选的:

jdbc:mysql://[host1][:port1][,[host2][:port2]]...[/[database]] » [?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]

Oracle的情况下, 这里logging 。

有2个URL语法,旧的语法只能用于SID和新的Oracle服务名称。

旧的语法jdbc:oracle:thin:@[HOST][:PORT]:SID

新语法jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE


也可以看看:

  • 我要在哪里放置用于Tomcat连接池的JDBC驱动程序?
  • 如何在Eclipse Web项目中安装JDBC驱动程序而不面临java.lang.ClassNotFoundexception
  • 我应该如何在基于servlet的应用程序中连接到JDBC数据库/数据源?
  • “Class.forName()”和“Class.forName()。newInstance()”有什么区别?
  • 将Java连接到MySQL数据库
 url="jdbc:postgresql//localhost:5432/mmas" 

该url看起来不正确,你需要以下吗?

 url="jdbc:postgresql://localhost:5432/mmas" 

我正在使用jruby,在我的情况下我创buildconfig / initializers下

postgres_driver.rb

 $CLASSPATH << '~/.rbenv/versions/jruby-1.7.17/lib/ruby/gems/shared/gems/jdbc-postgres-9.4.1200/lib/postgresql-9.4-1200.jdbc4.jar' 

或者你的司机在哪里,就是这样!

值得注意的是,当Windows阻止它认为不安全的下载时,也可能发生这种情况。 这可以通过右键单击jar文件(如ojdbc7.jar)并选中底部的“Unblock”框来解决。

Windows JAR文件属性对话框
Windows JAR文件属性对话框

除了添加MySQL JDBC连接器外,还要确保Tomcats conf目录中包含与您的数据库连接定义相关的context.xml(如果未解包到Tomcat webapps文件夹中)。

在STS中开发Spring Boot应用程序时,我有这个确切的问题,但最终将打包的war部署到WebSphere(v.9)。 根据以前的答案,我的情况是独特的。 ojdbc8.jar是在我的WEB-INF / lib文件夹中,父类最后一个加载集合,但总是说它找不到合适的驱动程序。

我最终的问题是我使用了不正确的DataSource类,因为我只是跟随在线教程/示例。 发现这个提示感谢David Dai对自己的问题发表评论: Spring JDBC无法加载JDBC驱动程序类[oracle.jdbc.driver.OracleDriver]

后来还发现了Spring专家的例子: https : //springframework.guru/configuring-spring-boot-for-oracle/

基于一般示例,使用org.springframework.jdbc.datasource.DriverManagerDataSource引发错误的示例。

 @Config @EnableTransactionManagement public class appDataConfig { \* Other Bean Defs *\ @Bean public DataSource dataSource() { // configure and return the necessary JDBC DataSource DriverManagerDataSource dataSource = new DriverManagerDataSource("jdbc:oracle:thin:@//HOST:PORT/SID", "user", "password"); dataSource.setSchema("MY_SCHEMA"); return dataSource; } } 

并使用oracle.jdbc.pool.OracleDataSource更正exapmle:

 @Config @EnableTransactionManagement public class appDataConfig { /* Other Bean Defs */ @Bean public DataSource dataSource() { // configure and return the necessary JDBC DataSource OracleDataSource datasource = null; try { datasource = new OracleDataSource(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } datasource.setURL("jdbc:oracle:thin:@//HOST:PORT/SID"); datasource.setUser("user"); datasource.setPassword("password"); return datasource; } } 
Interesting Posts