我正在尝试将已启用数据库的JSP添加到现有的Tomcat 5.5应用程序(GeoServer 2.0.0,如果有帮助的话)。
应用程序本身与Postgres交谈很好,所以我知道数据库已启动,用户可以访问它,所有这些好东西。我想要做的是在我添加的JSP中的数据库查询。我已经开始使用 Tomcat datasource example中的配置示例了。必要的taglibs位于正确的位置 - 如果我只有taglib refs就不会发生错误,因此它会找到那些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>
来自<Host>
内{$ 1}}内的$ CATALINA_HOME / conf / server.xml的相关部分:<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]
答案 0 :(得分:88)
臭名昭着的java.sql.SQLException:找不到合适的驱动程序
此异常基本上可以有两个原因:
您需要确保将JDBC驱动程序放在服务器自己的/lib
文件夹中。
或者,当您实际上没有使用服务器管理的连接池数据源,但是在WAR中手动摆弄DriverManager#getConnection()
时,则需要将JDBC驱动程序放在WAR /WEB-INF/lib
中并执行..
Class.forName("com.example.jdbc.Driver");
..在您的代码之前第一次DriverManager#getConnection()
来电,确保您不吞下/忽略任何ClassNotFoundException
被它抛出并继续代码流,就好像没有异常发生一样。另请参阅Where do I have to place the JDBC driver for Tomcat's connection pool?
您需要确保JDBC URL符合JDBC驱动程序文档,并记住它通常区分大小写。对于任何已加载的驱动程序,如果JDBC URL没有为Driver#acceptsURL()
返回true
,那么您也将获得此异常。
如果是 PostgreSQL ,则会记录here。
使用JDBC,数据库由URL(统一资源定位符)表示。使用PostgreSQL™,它采用以下形式之一:
jdbc:postgresql:database
jdbc:postgresql://host/database
jdbc:postgresql://host:port/database
如果是 MySQL ,则会记录here。
用于连接MySQL服务器的JDBC URL的一般格式如下,方括号(
[ ]
)中的项是可选的:
jdbc:mysql://[host1][:port1][,[host2][:port2]]...[/[database]] » [?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]
如果是 Oracle ,则会记录here。
有2种URL语法,旧语法只适用于SID,新语法适用于Oracle服务名称。
旧语法
jdbc:oracle:thin:@[HOST][:PORT]:SID
新语法
jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE
答案 1 :(得分:15)
url="jdbc:postgresql//localhost:5432/mmas"
该网址错误,您需要以下内容吗?
url="jdbc:postgresql://localhost:5432/mmas"
答案 2 :(得分:7)
我遇到了类似的问题。 上下文中的项目是Dynamic Web Project(Java 8 + Tomcat 8),错误是针对PostgreSQL驱动程序异常:找不到合适的驱动程序
通过在调用Class.forName("org.postgresql.Driver")
方法
getConnection()
来解决问题
这是我的示例代码:
try {
Connection conn = null;
Class.forName("org.postgresql.Driver");
conn = DriverManager.getConnection("jdbc:postgresql://" + host + ":" + port + "/?preferQueryMode="
+ sql_auth,sql_user , sql_password);
} catch (Exception e) {
System.out.println("Failed to create JDBC db connection " + e.toString() + e.getMessage());
}
答案 3 :(得分:5)
我忘记了将PostgreSQL JDBC驱动程序添加到项目Mvnrepository中。
成绩:
// http://mvnrepository.com/artifact/postgresql/postgresql
compile group: 'postgresql', name: 'postgresql', version: '9.0-801.jdbc4'
Maven :
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.0-801.jdbc4</version>
</dependency>
您还可以download JAR 并手动导入到项目中。
答案 4 :(得分:3)
我发现以下提示很有用,可以在Tomcat中消除这个问题 -
请务必先加载驱动程序,然后再执行Class.forName(“ org.postgresql.Driver“);在您的代码中。
这是来自帖子 - https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com
jdbc代码作为独立程序运行良好,但是在TOMCAT中它给出了错误 - “找不到合适的驱动程序”
答案 5 :(得分:1)
值得注意的是,当Windows阻止它认为不安全的下载时,也会发生这种情况。右键单击jar文件(例如ojdbc7.jar),然后选中底部的“Unblock”框即可解决此问题。
Windows JAR文件属性对话框:
答案 6 :(得分:0)
除了添加MySQL JDBC连接器之外,还要确保Tomcats conf目录中包含您的数据库连接定义的context.xml(如果未在Tomcat webapps文件夹中解压缩)。
答案 7 :(得分:0)
在STS中开发Spring Boot应用程序时,我遇到了这个问题,但最终将打包的war部署到WebSphere(v.9)。根据以前的答案,我的情况很独特。 ojdbc8.jar在我的WEB-INF / lib文件夹中有Parent Last类加载集,但总是说它找不到合适的驱动程序。
我的最终问题是我使用的是不正确的DataSource类,因为我只是跟随在线教程/示例。感谢David Dai对他自己的问题发表评论:Spring JDBC Could not load JDBC driver class [oracle.jdbc.driver.OracleDriver]
后来发现了Spring特例驱动程序的Spring guru示例: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
修正后的问题:
@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;
}
}
答案 8 :(得分:0)
我正在使用jruby,在我的情况下,我是在config / 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'
或者你的司机在哪里,就是这样!
答案 9 :(得分:0)
我遇到了此问题,方法是将XML文件错误地放入src/main/resources
,然后将其删除,然后全部恢复正常。
答案 10 :(得分:0)
一个很愚蠢的错误,可能是在JDBC URL连接开始时增加了空间。
我的意思是:-
假设您给错了jdbc网址,例如
String jdbcUrl=" jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";
(请注意,URL的开头有空格,这将导致错误)
正确的方法应该是:
String jdbcUrl="jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";
(请注意,凝视中没有空格,您可以在url的末尾留出空格,但可以避免这样做)
答案 11 :(得分:0)
我在使用Spring数据的mysql数据源上遇到了同样的问题,该数据可以在外部工作,但是当部署在tomcat上时出现了这个错误。
当我将驱动程序jar mysql-connector-java-8.0.16.jar添加到jres lib / ext文件夹时,错误消失了
但是由于担心干扰其他应用程序,我不想在生产中执行此操作。明确定义驱动程序类为我解决了这个问题
spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
答案 12 :(得分:0)
使用java
环境变量运行CLASSPATH
,该环境变量指向驱动程序的JAR文件,例如
CLASSPATH='.:drivers/mssql-jdbc-6.2.1.jre8.jar' java ConnectURL
drivers/mssql-jdbc-6.2.1.jre8.jar
是驱动程序文件的路径(例如JDBC for for SQL Server)。
ConnectURL
是来自该驱动程序(samples/connections/ConnectURL.java
)的示例应用程序,通过javac ConnectURL.java
进行了编译。
答案 13 :(得分:0)
在我的情况下,我正在使用Maven处理Java项目,但遇到此错误。 在您的pom.xml文件中,确保您具有此依赖项
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
</dependencies>
与您建立连接的地方类似这样
public Connection createConnection() {
try {
String url = "jdbc:mysql://localhost:3306/yourDatabaseName";
String username = "root"; //your my sql username here
String password = "1234"; //your mysql password here
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection(url, username, password);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
答案 14 :(得分:0)
如果没有为您的应用提供某个资源定义,则您将收到相同的错误-很可能在中央context.xml中,或者在conf / Catalina / localhost中的单个上下文文件中。而且,如果使用单个上下文文件,请注意,Tomcat会在您删除/取消部署相应的.war文件时免费删除它们。
答案 15 :(得分:0)
无论这个线程有多老,人们都会继续面对这个问题。
我的案例:我拥有最新的(在发布时)OpenJDK和maven设置。我已经尝试了上面给出的所有方法,有/没有maven,甚至在StackOverflow的姊妹帖子上都找到了解决方案。我没有使用任何IDE或其他任何东西,而是从裸露的CLI运行,仅演示核心逻辑。
这才是最后的工作。
Class.forName(....)
所做的事情有关。我们想要的文件是com/mysql/jdbc/Driver.class
javac App.java
java --module-path com/mysql/jdbc -cp ./ App
这将手动加载(提取的)程序包,并且您的Java程序将找到所需的Driver类。
mysql
驱动程序进行,其他驱动程序可能需要进行细微更改。.deb
图片,则可以从/usr/share/java/your-vendor-file-here.jar
获取罐子。答案 16 :(得分:0)
对我来说,在从表创建数据帧时连接到 postgres 时发生了同样的错误。这是由于缺少依赖关系造成的。未设置 jdbc 依赖项。我使用 maven 进行构建,因此将所需的依赖项从 maven dependency
添加到 pom 文件中