设计:Spring集成JDBC最佳实践(Design: Spring Integration jdb

2019-10-20 08:41发布

在一个项目中使用Spring集成之后,我的观察是仅在流的开始或结束使用JDBC适配器或网关。 如果我们在流动中使用他们,那么就会显得过于冗长和复杂。

例如:

<jdbc:outbound-gateway 
    query="select * from foo where
        c1=:headers[c1] AND
        c2=:headers[c2] AND
        c3=:headers[c3] AND
        c4=:headers[c4]"
    row-mapper="fooMapper" data-source="myDataSource" max-rows-per-poll="100000" />

<int:service-activator ref="serviceActivator" method="processFoo" />

另外,在上述<jdbc:outbound-gateway> ,我们需要通过所有的占位符(C1,C2,C3,C4)中的消息的头部中。 我们需要看来回在Java代码和XML文件中,当有太多的WHERE子句WHERE条件或任何变化。

它也容易出错。 举例来说,如果我们拼写错误:headers[c1]:headers[d1]那么就不会引发任何异常并替换:headers[d1]null

如果查询不返回任何行则默认情况下将引发异常。 所以,我们必须使用requires-reply="false"来改变默认行为。

如果我们想继续当查询不返回任何值,那么我们就必须添加通知网关,如下图所示:

<jdbc:outbound-gateway ... >
    <jdbc:request-handler-advice-chain>
        <bean class="com.service.NullReplyAdvice" />
    </jdbc:request-handler-advice-chain>
</jdbc:outbound-gateway>

请纠正我,如果有在概念的理解缺陷。

Answer 1:

我们需要看来回在Java代码和XML文件中,当有太多的WHERE子句WHERE条件或任何变化。

它甚至对周围的JDBC原始的Java代码正确的:如果你改变你的模型,当然,要改变SELECT ,因为它只是一个字符串。 这就是为什么有很多工作,使其类型安全 - ORM,QueryDSL,弹簧等数据

如果我们拼写错误:头[C1]到:头[D1]那么就不会引发任何异常并替换:标题[D1]与空。

这是因为headers只是一个Map ,它是真理,你得到null ,如果不存在这样的key在地图上。 为了克服这个问题,错字,你可以使用POJO payload的getter,或一些自定义标题,并再次-的getter的POJO。 在这种情况下,你最终得到不同的是不存在这样的对对象的属性。 虽然你会看到这个问题只有在运行时,而不是编译。 并再次同是Hashtable -仅在运行时。

所以,我们必须使用需要回复=“假”来改变默认行为。

你应该在设计时明白:允许或不为组件返回任何结果。

最后的想法是好的。 难道你不介意分享自己NullReplyAdvice ? 其实我实现与同一<filter>的JDBC网关之前:以确定是否有一些通过获取count(*)查询。 从那里,我能带领我的流向不同的逻辑,而不是直接的流量,当SELECT返回行。

UPDATE

当你想使用Model对象,以保持内消息特定业务的价值,它只是足以把这个对象的标题:

public class Foo {

   private String foo1;

   private String foo2;

   public String getFoo1() {
      return foo1;
   }

   public String getFoo2() {
      return foo2;
   }

}

...

MessageBuilder.withPayload(payload).setHeader("foo", foo).build();

...

<jdbc:outbound-gateway 
    query="select * from foo where
        c1=:headers[foo].foo1 AND
        c1=:headers[foo].foo2"/>


文章来源: Design: Spring Integration jdbc best practice