gpt4 book ai didi

java - 使用 JDBC 模板无法访问数据库时出现 SQLNonTransientConnectionException

转载 作者:行者123 更新时间:2023-12-01 18:09:49 24 4
gpt4 key购买 nike

假设如下:

  private static NamedParameterJdbcTemplate jdbcTemplate;

public static SqlRowSet foo(String value) {

MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("paramName", value);
String query = "SELECT * from myTable WHERE paramName = :value";

try {
SqlRowSet rs = jdbcTemplate.queryForRowSet(query, params);
return rs;
} catch (CannotGetJdbcConnectionException | DataAccessException e) {
// do something
}
}

这使用 Spring 库 JdbcTemplate 与数据库交互。当与数据库的连接建立时它效果很好,但创建一个 SQLNonTransientConnectionException如果关闭则异常(位于 SqlRowSet rs = jdbcTemplate.queryForRowSet(query, params); 行)

    java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=localhost)(port=63306)(type=master) : Connection refused
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:234)
at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.connException(ExceptionMapper.java:95)
at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1203)
at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:560)
at org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:174)
at org.mariadb.jdbc.Driver.connect(Driver.java:92)
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:136)
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:369)
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:198)
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:467)
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:541)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:157)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:115)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:78)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:611)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:668)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:693)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForRowSet(NamedParameterJdbcTemplate.java:307)

我不想打印堆栈跟踪,而是想捕获异常。但是,添加 catch (SQLNonTransientConnectionException)给我一个错误,说明永远不会抛出此异常。如果我理解正确的话,这意味着有一个 printStackTrace Spring 库中的某个位置,并且异常永远不会抛出到我的方法中,因此除了修改 Spring 库之外,我无法做任何事情来捕获它?

预先感谢您的帮助。

最佳答案

问题来自于第 390 行的 HikariPool.java 类。

private void throwPoolInitializationException(Throwable t) {
this.LOGGER.error("{} - Exception during pool initialization.", this.poolName, t);
this.destroyHouseKeepingExecutorService();
throw new HikariPool.PoolInitializationException(t);
}

这会记录堆栈跟踪并将其显示到控制台。禁用该类的 application.properties 登录可以解决问题。

logging.level.com.zaxxer.hikari.pool=OFF

关于java - 使用 JDBC 模板无法访问数据库时出现 SQLNonTransientConnectionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60487306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com