不是每个DB查询都会出现以下错误,而是随机出现的,每个查询的概率约为1%。无论查询是什么,它都可能成功执行,然后在同一个查询上失败。
只有当我将应用程序作为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
如何连接到数据库
我用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驱动程序,驱动程序注册过程将导致类加载器问题。
使用连接池会有很大帮助。您将大大减少创建连接的数量,您可以将其配置为在使用连接之前测试连接,因此,如果您的连接不好,它将被丢弃并替换。它还将更快,因为它将重用现有的连接。
在Tomcat中配置一个dataSource,并将JDBC驱动程序jar放在Tomcat共享库中。