臭名昭着的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文件属性对话框 :
除了添加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; } }