2015-02-24 77 views
2

我得到以下错误不是每个数据库查询,但随机与任何查询约1%的概率。无论查询是什么,它都可以成功执行,然后在相同的查询中失败。奇怪的SQLException:找不到合适的驱动程序jdbc:postgresql

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

如何我连接到DB

我用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> 

没有更多的其他DB连接配置。

回答

2

很难说这里发生了什么。你的应用程序和数据库之间的网络可能会有些薄弱。另外,Tomcat并不打算使用WEB-INF/lib以外的JDBC驱动程序,驱动程序注册过程将导致类加载器问题。

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

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

相关问题