当前位置: 首页 > 知识库问答 >
问题:

Spring JDBCTemplate-并发调用

汪泓
2023-03-14

在oracle.jdbc.driver.t4cttioer.ProcessErr(t4cttioer.java:450)在oracle.jdbc.driver.t4cttioer.processErr(t4cttioer.java:399)在oracle.jdbc.driver.t4c8oall.processErr(t4c8oall.java:1017)在oracle.jdbc.driver.t4cttifun.receive(t4cttifun.java:655)在C.driver.OraclePreparedStatementWrapper.ExecuteQuery(OraclePreparedStatementWrapper.java:1502),位于org.springframework.jdbc.core.jdbcTemplate$1。doInPreparedStatement(jdbcTemplate.692),位于org.springframework.jdbc.core.jdbcTemplate.execute(jdbcTemplate.633)...18其他

为了在parellel中执行该方法,我需要对此进行任何更改吗?

    @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;
        }


    }

共有1个答案

岳嘉容
2023-03-14

getTransactionResult(...)没有任何同步。容器可以管理东西,但它是由你来维持秩序。容器没有办法知道什么需要同步。

您可以使方法同步或遵循以下操作

同步方法还是使用spring@Transactional?

 类似资料:
  • [//]: # ( 此处删除了setDefer特性,因为支持setDefer的客户端都推荐用一键协程化了。 ) 使用子协程(go)+通道(channel)实现并发请求。 !>建议先看概览,了解协程基本概念再看此节。 实现原理 在onRequest中需要并发两个http请求,可使用go函数创建2个子协程,并发地请求多个URL 并创建了一个chan,使用use闭包引用语法,传递给子协程 主协程循环调用

  • 我有一个动态的对等网络,节点与grpc进行通信。每个节点都有自己的服务器和客户端。定义了一种用于登录新节点的grpc方法。我使用同步消息将登录信息传达给所有其他服务器,在这里我与其他服务器创建一个新通道,发送一条消息并等待响应。 如果我的网络中有一个节点(节点1),然后两个或多个节点同时进入,例如节点2和节点3,它们将在节点1的服务器上同时调用grpc方法“enter”。对于这种类型的方法,nod

  • 本文向大家介绍java ThreadPoolExecutor 并发调用实例详解,包括了java ThreadPoolExecutor 并发调用实例详解的使用技巧和注意事项,需要的朋友参考一下 java ThreadPoolExecutor 并发调用实例详解 概述 通常为了提供任务的处理速度,会使用一些并发模型,ThreadPoolExecutor中的invokeAll便是一种。 代码 可以把需要执

  • 问题内容: 我有一个单例课程: 并且多个线程正在调用work()函数: 我注意到两个线程正在同时运行,就好像两个工作函数是同时实例化的一样。 我希望最后一个线程代替上一个线程运行,而不是同时运行。在Java中是否可以使第二个调用覆盖第一个调用的内存空间? 问题答案: 您的方法正在尝试延迟初始化 SINGLETON实例,但存在以下问题: 不能访问变量 变量不是 您没有使用双重检查锁定 因此竞争条件A

  • 问题内容: 在html中,我有几个按钮是针对具有特定状态的数据库中的每个对象自动创建的。每个按钮都有其自己的ID。 该按钮调用javascript函数clickedbutton,并为其提供按钮编号和该按钮的序号。 此函数加载按钮的编号,并使其成为button0,button1等。orderid也成功传递。现在,在该函数中,我想调用一个外部php脚本,而且必须将orderid传递给该脚本。 我了解m

  • 本文向大家介绍Go并发调用的超时处理的方法,包括了Go并发调用的超时处理的方法的使用技巧和注意事项,需要的朋友参考一下 之前有聊过 golang 的协程,我发觉似乎还很理论,特别是在并发安全上,所以特结合网上的一些例子,来试验下go routine中 的 channel, select, context 的妙用。 场景-微服务调用 我们用 gin(一个web框架) 作为处理请求的工具,需求是这样的