Java 使用JDBC模板无法访问数据库时的SQLNonTransientConnectionException
假设:Java 使用JDBC模板无法访问数据库时的SQLNonTransientConnectionException,java,spring,Java,Spring,假设: private static NamedParameterJdbcTemplate jdbcTemplate; public static SqlRowSet foo(String value) { MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("paramName", value); String query = "SELECT * from m
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:无法连接到地址=(主机=本地主机)(端口=63306)(类型=主机):连接被拒绝
位于org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:234)
位于org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.connException(ExceptionMapper.java:95)
位于org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1203)
位于org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:560)
位于org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:174)
位于org.mariadb.jdbc.Driver.connect(Driver.java:92)
在com.zaxxer.hikari.util.DriverDataSource.getConnection上(DriverDataSource.java:136)
位于com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:369)
在com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:198)上
在com.zaxxer.hikari.pool.HikariPool.createPoolEntry上(HikariPool.java:467)
在com.zaxxer.hikari.pool.HikariPool.checkFailFast上(HikariPool.java:541)
在com.zaxxer.hikari.pool.HikariPool上。(HikariPool.java:115)
位于com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
位于org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:157)
位于org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:115)
位于org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:78)
位于org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:611)
位于org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:668)
位于org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:693)
位于org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForRowSet(NamedParameterJdbcTemplate.java:307)
我希望捕获异常,而不是打印堆栈跟踪。但是,添加一个catch(SQLNonTransientConnectionException)
会给我一个错误,告诉我永远不会抛出此异常。如果我理解正确,这意味着Spring库中的某个地方有一个printStackTrace
,并且我的方法从未抛出异常,因此除了修改Spring库之外,我不能做任何事情来捕获它
提前感谢您的帮助。问题来自第390行的类
hikaripol.java
private void throwPoolInitializationException(Throwable t) {
this.LOGGER.error("{} - Exception during pool initialization.", this.poolName, t);
this.destroyHouseKeepingExecutorService();
throw new HikariPool.PoolInitializationException(t);
}
这将记录堆栈跟踪并将其显示到控制台。禁用此类的登录应用程序。属性
可解决此问题
logging.level.com.zaxxer.hikari.pool=OFF
在catch块中添加一个通用异常怎么样。它将捕获所有异常。在catch块之后,创建另一个catch块
catch(Exception e)
@Silverfang,这不起作用,因为没有抛出异常。Spring将所有异常包装在DataAccessException
中,因此显然尝试捕获它是不起作用的。另外,这不是从spring记录,而是从您的连接池记录。
logging.level.com.zaxxer.hikari.pool=OFF