mule in action翻译19 : 3.7 使用数据库

2024-03-25 05:38

本文主要是介绍mule in action翻译19 : 3.7 使用数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

mule in action翻译19 : 3.7  使用数据库

 

 

     有时数据库是不同应用之间的隐含集成方式。每个主流的开发平台都对数据库交互提供丰富的支持。因此 ,数据库比应用活的更久并不是什么稀罕事。如果你正在使用一个java应用程序,很可能使用了数据库抽象层(实现可能是 Hibernate或 spring jdbc)。这种情况下,在组件中使用这些类库是行得通的。如果你在使用一个遗留数据库或与一个不提供本地java访问方式的应用集成,那么JDBC传输就是访问数据库的有效的方式。

 

    数据库方面最近的发展趋势是NoSQL,它提供另一个非关系型数据解决方案。这些技术往往会使用云计算和分布式计算基础设施以方便横向扩展和处理大数据。

 

    本节,将以学习JDBC传输开始,首先看如何使用JDBC inbound endpoint执行查询。然后学习使用 JDBC outbound endpoint执行插入。我们也将学习下 MongoDB: 一个面向文档的,NoSql数据库。

 

3.7.1 使用 JDBC inbound endpoint 执行查询

    来看如何配置 JDBC传输。表3.7 展示了一些常见配置属性。 dataSource-ref 特别重要,这是你对你配置的数据源的引用,你将使用它访问数据库。



 

  你已经使用过JDBC inbound endpoint 执行数据库查询。它将生成数据,传输给组件和outbound endpoint。来看他们是怎么工作的。 Prancing Donkey 使用 MySQL作为他们网上商城的数据库。网络订单通过一个第三方服务来执行。 Prancing Donkey 周期性的轮询这个服务的API,并更新他们的MySQL数据库中订单的状态。 有时候,订单没有得到及时执行。出现这种情况时,Prancing Donkey员工需要联系订单执行服务, 查出卡住的原因。为了出现这种情况时能给Prancing Donkey提示以进行操作,他们配置了一个mule 流, 来轮询数据库中超过一天没有被执行的订单,然后向一个JMS topic发送一个警告。像下面列表展示的一样。 图示见3.18 

 Listing 3.22 Querying a table every hour and sending the results to a JMS topic 

 

<!--注释1 配置 JDBC 数据源--><spring:bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><spring:property name="driverClassName"  value="${jdbc.driver}"/><spring:property name="url" value="${jdbc.url}"/><spring:property name="username" value="${jdbc.username}"/><spring:property name="password" value="${jdbc.password}"/>
</spring:bean>
<!--注释2 配置jdbc连接器-->
<jdbc:connector name="jdbcConnector" dataSource-ref="dataSource">
<!--注释3 定义查询sql--><jdbc:query key="stuckOrderQuery"value="SELECT id FROM orders WHERE TIMESTAMP(timestamp)< {fn TIMESTAMPADD( SQL_TSI_DAY, -1, CURRENT_TIMESTAMP)}"/>
</jdbc:connector>
<flow name="pollForStuckOrders"><!--每一小时执行一次查询--><jdbc:inbound-endpoint pollingFrequency="3600000"queryKey="stuckOrderQuery"connector-ref="jdbcConnector"/><jms:outbound-endpoint topic="orders.status.stuck"/>
</flow>

 

注释1处 配置了一个Spring 数据源,其中的一些变量会从一个properties文件读入。

注释2处 引用了这个数据源。

注释3处 定义的查询会使用这个的数据源。

 

如果你仔细观察,你会发现你转义了查询中小于号(???),以避免mule启动时XML解析出问题。

这个查询会为每个在上一小时中插入数据库的并在执行中卡住的订单返回一条记录。结果集的每个记录,将作为一条单独的消息发送到JMS话题。消息的payload是  java.util.Map的一个实例。这个Map 使用转换器可以转换为别的对象类型,比如 POJO 或 XML.  map 的key是结果集中的列名,key对应的值是结果集中每行的值。

 

让我们来看看如何使用JDBC outbound endpoint将行插入到数据库。

 

3.7.2 使用 JDBC outbound endpoint 执行插入

 

   JDBC传输允许你使用 outbound endpoint把数据插入到一个表中。回想列表3.12 ,使用FTP

outbound endpoint发送产品数据到零售商。现在修改这个流,增加把商品数据添加到数据库。

 Listing 3.23 Using a JDBC outbound endpoint to insert rows into a table 

 

<!--注释1 定义JDBC连接器 和 sql语句--><jdbc:connector name="jdbcConnector" dataSource-ref="dataSource"><jdbc:query key="productInsert"value="INSERT INTO products VALUES(0,#[payload.name],#[payload.acv],#[payload.cost],#[payload.description])"/>
</jdbc:connector>
<flow name="ftpProductsFromDatabase"><file:inbound-endpoint path="./data"/><byte-array-to-string-transformer/><!--注释2  分发到JDBC 和 FTP --><all><processor-chain><!--注释3 转换CSV数据为map组成的list --><custom-transformer name="csvToMapTransformer"class="com.prancingdonkey.transformer.CSVToListOfMapsTransformer"/><!--注释4 遍历list的元素--><foreach><!--注释5 插入到数据库--><jdbc:outbound-endpoint queryKey="productInsert"connector-ref="jdbcConnector"/></foreach></processor-chain><ftp:outbound-endpoint  user="admin"password="123456"host="${ftp.host}"port="${ftp.port}"path="/data/prancingdonkey/catalog"/></all>
</flow>

 

注释1处 定义插入语句。这里需要一个map类型的payload,使用了MEL从payload中取值。

注释2处 开始使用一个 all 路由器,分发产品数据到JDBC outbound endpoint和 FTP endpoint。

注释3处 产品数据是CSV格式的,需要使用一个转换器转为为一个元素为map的list。

注释4处 使用 foreach消息处理器遍历list的每个元素,并调用JDBC outbound endpoint把每个

map insert到数据库。

 

   批量插入  mule的企业版允许执行批量数据库操作。如果你使用的是企业版的JDBC传输,你可以

   容易的把由map组成的list传送给JDBC endpoint。整个list将一次性批量插入数据库,并会避免

   使用foreach处理器 。这也允许你在一个事务中执行插入。

   

 3.7.3 NoSQL的 MongoDB

 

     MongoDB是一个领先的NoSQL数据库。它把数据暴露成JSON文档的集合形式,并使用JSON进行查询。

 MongoDB 在大数据和云计算基础架构之上可以很容易地实现横向扩展。除了其作为一个文件存储设备,

 MongoDB通过GridFS提供用于分布式文件存储方案。本节 学习mule的MongoDB连接器。你将看到如何

 插入文档到集合,以及如何通过HTTP执行查询。

 

 来实现另一个对 cooling.alerts topic 的订阅者。下面的列表展示了 Prancing Donkey如何把制冷

 系统警告存储到MongonDB的集合。(图示见3.19)

Listing 3.24 Save cooling alerts to a MongoDB collection 

<!--配置MongoDB传输 连接MongoDB-->
<mongo:config name="mongoDB"database="prancingdonkey"username="${mongo.user}"password="${mongo.password}"host="${mongo.host}"/>
<jms:activemq-connector name="jmsConnector"specification="1.1"brokerURL="${jms.url}"/>
<flow name="saveCoolingAlerts"><jms:inbound-endpoint topic="cooling.alerts" connector-ref="jmsConnector" /><!--转换警告--><mongo:json-to-dbobject/><!--把警告保存到 cooling_alerts 集合--><mongo:insert-object collection="cooling_alerts" config-ref="mongoDB" />
</flow>

 

 

你可能注意到了MongoDB和本章之前见到的 inbound/outbound endpoint 配置有很大的不同。

 这是因为在mule中对MongoDB的支持被实现为云连接器。它们暴露API的单独的方法而不是暴露消息渠道

 来向流获取和发送数据。

 

     因为MongoDB 云连接器暴露了MongoDB java驱动的方法,你需要保证你的消息的payload是API需要的格式。 本例中,你需要在调用 insert-object消息处理器之前使用json-to-dbobject转换器把JSON格式的payload 转为com.mongodb.DBObject的实例的格式。现在来看如何在MongoDB集合中查询文档。(见图3.20)

 

 

 下面的列表定义了一个流,这个流允许用户在一个URL中提供一个JSON查询,以从配置的MongoDB集合中

 获取匹配的文档。(见图3.20)

 Listing 3.25 Query a MongoDB collection over HTTP

 

<flow name="queryCoolingAlerts" ><!--注释1 定义http:inbound endpoint 接受查询--><http:inbound-endpoint host="${http.host}"port="${http.port}"path="alerts/cooling"/><byte-array-to-string-transformer/><!--对这个集合执行查询--><mongo:find-objects config-ref="mongoDB"collection="cooling_alerts" /><!--转换集合为JSON --><mongo:mongo-collection-to-json/>
</flow>

 

 

注释1处 HTTP inbound endpoint允许一个客户端提交查询以从cooling_alerts 集合返回一个JSON格式的文档set。mule的 MongoDB模块还有其他的多种操作。完整的列表可以查看 www.mulesoft.org/muleforge/mongodb-connector.

 

本节你看到了在mule中如何使用关系型的和NoSQL的数据库。我们演示了如何将JDBC传输作为消息源使用,以从数据库查询反复的生成mule消息。你也看到如何使用JDBC outbound endpoint 向表中插入数据。最后,我们看了如何从MongoDB查询和插入文档。

 

这篇关于mule in action翻译19 : 3.7 使用数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843992

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的