Java Spring JDBCTemplate-并发调用
我已经创建了一个executorservice来调用下面列出的具有不同日期范围的查询。当我同步运行它时,我没有看到任何错误。但是,当我并行启动多个线程来调用getTransactionResult时,我看到 java.util.concurrent.ExecutionException: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback;SQL[Query];ORA-01841:(完整)年份必须为 介于-4713和+9999之间,且不为0;嵌套异常是 java.sql.SQLDataException:ORA-01841:(完整)年份必须介于 -4713和+9999,且不是0 位于java.util.concurrent.FutureTask.report(FutureTask.java:122) java.util.concurrent.FutureTask.get(FutureTask.java:192)位于 com.cloud.cloudreport.CloudReportApplication.lambda$1(CloudReportApplication.java:94) forEach(ArrayList.java:1249)位于 com.cloud.cloudreport.CloudReportApplication.run(CloudReportApplication.java:92) 在 org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:776) 在 org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:760) 在 org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:747) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:315) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) 在 com.cloud.cloudreport.CloudReportApplication.main(CloudReportApplication.java:43) 原因:org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback;SQL[];ORA-01841:(全年)必须 介于-4713和+9999之间,且不为0;嵌套异常是 java.sql.SQLDataException:ORA-01841:(完整)年份必须介于 -4713和+9999,且不是0 在 org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:82) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在 org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:649) 在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:684) 在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:711) 在 org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:761) 在 org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:211) 在 com.cloud.cloudreport.dao.TransactionRespository.getTransactionResult(TransactionRespository.java:68) 在 com.cloud.cloudreport.dao.TransactionRespository$$FastClassBySpringCGLIB$$60dee75d.invoke() 在 org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 在 org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:157) 在 org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.procement(ReflectiveMethodInvocation.java:179) 在 org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:656) 在 com.cloud.cloudreport.dao.TransactionRespository$$EnhancerBySpringCGLIB$$ca18ee4e.getTransactionResult() 在 com.cloud.cloudreport.CloudReportApplication.lambda$0(CloudReportApplication.java:76) 在java.util.concurrent.FutureTask.run(FutureTask.java:266)处 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在java.lang.Thread.run(Thread.java:745)处,由以下原因引起: java.sql.SQLDataException:ORA-01841:(完整)年份必须介于 -4713和+9999,且不是0 位于的oracle.jdbc.driver.t4cttiore.processError(t4cttiore.java:450) 位于的oracle.jdbc.driver.t4cttiore.processError(t4cttiore.java:399) 位于的oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017) 位于的oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655) oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249)位于 位于的oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566) oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:215) 在 oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:58) 在 oracle.jdbc.driver.T4CPreparedStatement.executeforderdescripe(T4CPreparedStatement.java:776) 在 oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:897) 在 oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1034) 在 oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820) 在 oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3867) 在 OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1502) 在 org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:692) 在 org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:633) ... 还有18个 为了在Parelle中执行该方法,我需要对此进行任何更改吗Java Spring JDBCTemplate-并发调用,java,spring,jdbctemplate,Java,Spring,Jdbctemplate,我已经创建了一个executorservice来调用下面列出的具有不同日期范围的查询。当我同步运行它时,我没有看到任何错误。但是,当我并行启动多个线程来调用getTransactionResult时,我看到 java.util.concurrent.ExecutionException: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback;SQL[Query];ORA-01841:(
@Repository
public class TransactionRespository {
private static Logger LOG = LoggerFactory.getLogger(TransactionRespository.class);
@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;
private String transactionQuery = " query goes here";
public TransactionDetails getTransactionResult(String serviceName, String operationName, Date startDate,
Date endDate) {
SqlParameterSource namedParameters = new MapSqlParameterSource("serviceName", serviceName)
.addValue("operationName", operationName)
.addValue("startDate", new DateTime(startDate).toString("yyyy-MM-dd HH:mm:ss"))
.addValue("endDate", new DateTime(endDate).toString("yyyy-MM-dd HH:mm:ss"));
try{
return (TransactionDetails) this.jdbcTemplate.queryForObject(transactionQuery, namedParameters,(rs,rowNum)->{
TransactionDetails transactionDetails = new TransactionDetails();
TransactionResult result = new TransactionResult();
transactionDetails.setStartDate(new DateTime(startDate).toString("yyyy-MM-dd HH:mm:ss"));
transactionDetails.setEndDate(new DateTime(endDate).toString("yyyy-MM-dd HH:mm:ss"));
result.setSuccessfulTransactions(rs.getInt(2));
result.setFailedTransactions(rs.getInt(3));
Map<String,TransactionResult> operationResult = new TreeMap<>();
operationResult.put(operationName, result);
transactionDetails.setOperationResult(operationResult);
return transactionDetails;
});
} catch (EmptyResultDataAccessException e) {
LOG.debug("start date :: {} , end date :: {} " , new DateTime(startDate).toString("yyyy-MM-dd HH:mm:ss"), new DateTime(endDate).toString("yyyy-MM-dd HH:mm:ss"));
return null;
}
}
@存储库
公共类事务处理{
私有静态记录器LOG=LoggerFactory.getLogger(TransactionRespository.class);
@自动连线
私有名称参数jdbcTemplate jdbcTemplate;
P