如何在Spring Boot应用程序中解决RecoverableDataAccessException

时间:2019-01-30 16:43:52

标签: java spring spring-boot tomcat7

我正在使用JNDI配置和JDBCtemplate,它们在Spring Boot应用程序中是自动连接的。

连接创建成功。但是当我们执行保存或搜索操作时,它失败并显示以下错误:

org.springframwwork.dao.RecoverableDataAccessException: CallableStatementCallback; SQL [] Closed Connection ; nested exception is java.sql.SQLRecoverableException: Closed Connection

我也尝试了以下stackoverflow解决方案,但是它没有用。

What is the cause of "RecoverableDataAccessException" received when checking health of database?

请找到以下用于连接的context.xml配置:

<Resource name="jdbc/xyz" 
auth="Container" 
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
url=""
username="" 
password=""
minActive="30" 
maxActive="100" 
minIdle="10" 
maxIdle="10" 
initialSize="10"
jmxEnabled="true" 
timeBetweenEvictionRunsMillis="30000"
minEvictableIdleTimeMillis="30000" 
maxWait="10000" 
logAbandoned="true"
testOnBorrow="true" 
testOnConnect="false" 
suspectTimeout="120"
validationQuery="select 1 from dual" 
validationInterval="30000"
initSQL="select 1 from dual" 
removeAbandoned="true"
removeAbandonedTimeout="60" 
maxAge="180000"
accessToUnderlyingConnectionAllowed="true">
</Resource>

也尝试在context.xml中将maxWait更改为-1。

JdbcTemplate成功地自动接线。大多数情况下,搜索操作都可以正常工作,但是当我们执行保存操作时,如上所述,它会由于SQLRecoverableException而失败。

我正在使用jdbcTemplate对象创建SimpleJdbcCall对象,然后执行它以将详细信息保存在oracle数据库中。

SimpleJdbcCall save = new SimpleJdbcCall(jdbcTemplate).withProcedureName("xxpqr_abc")
.withCatalogName("xxpqr__xx_abc").withoutProcedureColumnMetaDataAccess()
.declareParameters(new SqlParameter("abc", OracleTypes.ARRAY, "abc1"),
new SqlParameter("xyz", OracleTypes.ARRAY, "xyz1"),
new SqlOutParameter("error_msg", Types.VARCHAR));

Map<String, Object> saveResult = save.execute(
new MapSqlParameterSource().addValue("pqr", new SqlArrayValue(empDetailsArray))
.addValue("pqr", saveObj.getSubmitFlag())); 

在执行过程中出现了java.lang.NullPointerException。

如果使用单独的类使用spring @configuration注释创建的连接,则相同的操作可以正常工作。但这不提供连接池。

0 个答案:

没有答案