Spring Integration存储过程入站通道适配器

时间:2018-07-25 19:50:16

标签: spring performance spring-data spring-integration database-performance

我有以下要求。

1。一个基于Spring的应用程序在一个Unix框上运行,该框在一个表上创建条目。1列称为created_on,该列在创建时会保留时间。

2。另一个基于弹簧集成的应用程序具有30个实例,它们在3个不同的Unix框上运行,每个框上有10个实例(10个不同的PID)。所有这些应用程序都配置了stored-proc-inbound-channel-adapter,该适配器从上表中拉出数据的时间间隔为1秒。

该表具有一个状态列,一旦存储过程选择了记录,该状态列就会标记为Y。

存储过程根据创建于且未标记为Y的记录进行选择。

我不希望使用外部队列在这两个应用程序之间进行通信。

疑问:- 1.是否有可能获得多个节点选择的相同记录?

  1. 当30个节点尝试访问相同的表记录并引发相同的存储过程时,是否会出现性能问题?

1 个答案:

答案 0 :(得分:1)

  

1。是否有可能获得多个节点选择的相同记录?

我不知道如何从这里为您提供帮助,但是如果所有逻辑都封装在该存储的proc中,那么您应该不会有任何问题:只要更新,其他任何人都不会选择相同的记录并选择正确的逻辑。

  

2。是否可以根据特定编号返回结果?

完全不清楚您的问题中的function getS3Data() { return new Promise((resolve, reject) => { if (err) { reject(err) } else { const promises = [] for (const i = 0; i < data.Contents.length; i++) { const currentValue = data.Contents[i]; if (currentValue.Key.endsWith(params.Prefix) == false) { const goParams = { Bucket: params.Bucket, Key: currentValue.Key }; promises.push(new Promise((res, rej) => { s3.getObject(goParams, function (err, data) { if (err) { rej(err); //error } else { res(data.Body.toString()); } }); })); } } Promise.all(promises).then(resolve); } }); } getS3Data() .then(result => { // this will actually be `content` from your code example console.log(result); }).catch(error => { console.error(error); }) 是什么,但是存储过程确实可以返回结果-原始集或普通no参数。这已经完全超出了该线程和Spring Integration职责的范围。

  

3。如何将节点名称传递给spring上下文(stored-proc-inbound-channel-adapter)?

请研究什么是Spring Framework中的OUT及其相关的Environment和属性占位符:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-environment。因此,您确实可以将有关此事件的某些属性传播到存储的proc参数中。

  
      
  1. 当30个节点尝试访问相同的表记录并引发相同的存储过程时,是否会出现性能问题?
  2.   

不,不是。据您的RDBMS供应商支持并发访问数据库。

  

5。当存储过程未返回任何数据时,如何处理stored-proc-inbound-channel-adapter?

您可以在@Value的{​​{1}}中应用类似AbstractMessageSourceAdvice的内容,并在以下实现中检查poller

stored-proc-inbound-channel-adapter