奇怪的 SQLException:找不到适合 jdbc:postgresql 的驱动程序
Strange SQLException: No suitable driver found for jdbc:postgresql
我不是每个数据库查询都会收到以下错误,而是随机出现每个查询大约 1% 的概率。不管是什么查询,它都可能执行成功,然后在同一个查询上失败。
仅当我 运行 我的应用程序作为 tomcat 网络应用程序时才会发生错误。单元测试或独立应用程序模式 (SpringApplication.run()
) 不会失败。
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost
:5432/db_name
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:630)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:909)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:970)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:980)
at package.MyDBService.insert(MyDBService.java:32)
Caused by: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/db_name?tcpKeepAlive=true
at java.sql.DriverManager.getConnection(DriverManager.java:689)
at java.sql.DriverManager.getConnection(DriverManager.java:208)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:153)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:144)
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:155)
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:120)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
... 15 more
我如何连接到数据库
我使用 tomcat8 和 Spring。
@Configuration
public class JdbcFactory {
@Bean
public JdbcTemplate jdbcTemplate() {
Class.forName("org.postgresql.Driver");
return new JdbcTemplate(new DriverManagerDataSource("jdbc:postgresql://localhost:5432/db_name?tcpKeepAlive=true", "user", "pass"));
}
}
这就是我的典型 DAO 的样子
@Service
public class CommonDAO {
@Autowired JdbcTemplate jdbc;
public String getSome() {
return jdbc.query("...");
}
}
JDBC-驱动程序作为 Maven 依赖项提供。
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
</dependency>
没有其他数据库连接配置。
很难说这里到底发生了什么。您的应用程序和数据库之间的网络可能有些不稳定。另外 Tomcat 并不意味着要使用 WEB-INF/lib 之外的 JDBC 驱动程序,驱动程序注册过程会导致类加载器问题。
使用连接池会有很大帮助。您将大大减少创建连接的数量,您可以将其配置为在使用连接之前测试连接,因此如果连接出现问题,它将被丢弃并替换。它也会快很多,因为它将重用现有连接。
Configure a dataSource in Tomcat,并将 JDBC 驱动程序 jar 放入 Tomcat 共享库中。
我不是每个数据库查询都会收到以下错误,而是随机出现每个查询大约 1% 的概率。不管是什么查询,它都可能执行成功,然后在同一个查询上失败。
仅当我 运行 我的应用程序作为 tomcat 网络应用程序时才会发生错误。单元测试或独立应用程序模式 (SpringApplication.run()
) 不会失败。
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost
:5432/db_name
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:630)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:909)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:970)
at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:980)
at package.MyDBService.insert(MyDBService.java:32)
Caused by: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/db_name?tcpKeepAlive=true
at java.sql.DriverManager.getConnection(DriverManager.java:689)
at java.sql.DriverManager.getConnection(DriverManager.java:208)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:153)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:144)
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:155)
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:120)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
... 15 more
我如何连接到数据库
我使用 tomcat8 和 Spring。
@Configuration
public class JdbcFactory {
@Bean
public JdbcTemplate jdbcTemplate() {
Class.forName("org.postgresql.Driver");
return new JdbcTemplate(new DriverManagerDataSource("jdbc:postgresql://localhost:5432/db_name?tcpKeepAlive=true", "user", "pass"));
}
}
这就是我的典型 DAO 的样子
@Service
public class CommonDAO {
@Autowired JdbcTemplate jdbc;
public String getSome() {
return jdbc.query("...");
}
}
JDBC-驱动程序作为 Maven 依赖项提供。
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
</dependency>
没有其他数据库连接配置。
很难说这里到底发生了什么。您的应用程序和数据库之间的网络可能有些不稳定。另外 Tomcat 并不意味着要使用 WEB-INF/lib 之外的 JDBC 驱动程序,驱动程序注册过程会导致类加载器问题。
使用连接池会有很大帮助。您将大大减少创建连接的数量,您可以将其配置为在使用连接之前测试连接,因此如果连接出现问题,它将被丢弃并替换。它也会快很多,因为它将重用现有连接。
Configure a dataSource in Tomcat,并将 JDBC 驱动程序 jar 放入 Tomcat 共享库中。