奇怪的 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 共享库中。