奇怪的SQLException:没有为jdbc:postgresql找到合适的驱动程序

时间:2015-02-24 00:50:12

标签: java spring postgresql tomcat jdbc

我不是每个数据库查询都会得到以下错误,但每个查询的随机概率约为1%。无论查询是什么,它可以成功执行,然后在同一查询上失败。

只有当我将我的应用程序作为tomcat web app运行时才会出现错误。单元测试或独立应用程序模式(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>

没有其他数据库连接配置。

1 个答案:

答案 0 :(得分:2)

很难说这到底发生了什么。您可能在应用程序和数据库之间存在关于网络的问题。此外,Tomcat不打算使用WEB-INF / lib中的JDBC驱动程序,驱动程序注册过程将导致类加载器问题。

使用连接池会有很大帮助。您将大幅减少创建连接的数量,您可以将其配置为在使用之前测试连接,因此如果您确实得到了错误的连接,它将被丢弃并替换。它也将更快,因为它将重用现有的连接。

Configure a dataSource in Tomcat,并将JDBC驱动程序jar放在Tomcat共享库中。