oracle Debezium

Debezium是什么

Debezium是一个开源项目,为捕获数据更改(change data capture,CDC)提供了一个低延迟的流式处理平台。你可以安装并且配置Debezium去监控你的数据库,然后你的应用就可以消费对数据库的每一个行级别(row-level)的更改。只有已提交的更改才是可见的,所以你的应用不用担心事务(transaction)或者更改被回滚(roll back)。

Debezium连接oracle方式

Debezium提供了两种监控数据库的方式,对应了oracle的两种连接方式。
1.LogMiner:本质是jdbc thin driver,纯Java开发,与平台无关。
2.XStream API:本质是jdbc oci driver,通过调用oci客户端c动态库实现。

从官网上的描述可以看出来thin和oci的区别
thin 底层是通过tcp/ip协议实现的。oci是通过调用oci客户端c动态库实现的。
oci jdbc使用之前必须要安装oci 的客户端,所以我们通常会选择thin驱动来连接oracle数据库。
理论上oci jdbc驱动要优与thin的驱动。

默认情况下,Debezium 使用 Oracle LogMiner 从 Oracle 摄取更改事件。可以调整连接器配置以使连接器能够使用 Oracle XStreams 适配器。

"database.connection.adapter": "xstream"

Debezium 优缺点

优点:Debezium 是一个分布式系统,可以捕获多个上游数据库中的所有变化;它永远不会错过或丢失事件。当系统正常运行或被仔细管理时,Debezium 提供每个更改事件记录的一次交付。
如果发生故障,Debezium 不会丢失任何事件。在这些异常情况下,Debezium 和 Kafka 一样,至少提供一次变更事件的交付。
由于Debezium用持久化的、有副本备份的日志来记录数据库数据变化的历史,因此,你的应用可以随时停止再重启,而不会错过它停止运行时发生的事件,保证了所有的事件都能被正确地、完全地处理掉。
缺点:当它从故障中恢复时,它可能会重复一些更改事件。

java

POM::
  <dependency>
            <groupId>io.debezium</groupId>
            <artifactId>debezium-embedded</artifactId>
            <version>1.6.2.Final</version>
        </dependency>
  
        </dependency>
        <dependency>
            <groupId>io.debezium</groupId>
            <artifactId>debezium-connector-oracle</artifactId>
            <version>1.6.2.Final</version>
        </dependency>
        <dependency>
            <groupId>io.debezium</groupId>
            <artifactId>debezium-api</artifactId>
            <version>1.6.2.Final</version>
        </dependency>
Code:
 // 配置
            Properties props = new Properties();
            props.setProperty("name", "oracle-engine-0036"); //唯一实例
            props.setProperty("connector.class", OracleConnector.class.getName());
            props.setProperty("offset.storage", FileOffsetBackingStore.class.getName());
            // 指定 offset 存储目录
            props.setProperty("offset.storage.file.filename", "D:/data/oracledebezium/oracle4.txt");
            // 指定 Topic offset 写入磁盘的间隔时间
            props.setProperty("offset.flush.interval.ms", "60000");
            //设置数据库连接信息
            props.setProperty("database.hostname", "10.69.72.112");
            props.setProperty("database.port", "11522");
            props.setProperty("database.user", "source1");
            props.setProperty("database.password", "oracle");
            props.setProperty("database.server.id", "85701");
            //C##DBZUSER.STU可以用正则
            //props.setProperty("table.include.list", "STUDENT1");
            props.setProperty("snapshot.include.collection.list", "C##SOURCE1");
            props.setProperty("database.history",
                    FileDatabaseHistory.class.getCanonicalName());
            props.setProperty("database.history.file.filename",
                    "D:/data/oracledebezium/oracle5.txt");
            //每次运行需要对此参数进行修改,因为此参数唯一
            props.setProperty("database.server.name", "my-oracle-connector-0026");
            //指定 CDB 模式的实例名
            props.setProperty("database.dbname", "zujian4");
            //是否输出 schema 信息
            props.setProperty("key.converter.schemas.enable", "false");
            props.setProperty("value.converter.schemas.enable", "false");
            props.setProperty("database.serverTimezone", "UTC"); // 时区
            props.setProperty("database.connection.adapter", "logminer"); // 模式
			
			
	ExecutorService executor = Executors.newSingleThreadExecutor();
           executor.execute(engine);
	// 2. 构建 DebeziumEngine
	// 使用 Json 格式
	DebeziumEngine<ChangeEvent<String, String>> engine =DebeziumEngine
                        .create(Json.class)
                        .using(props)
                        .notifying(record -> {
                            // record中会有操作的类型(增、删、改)和具体的数据
                            System.out.println(record);
                            System.out.println("record.key() = " + record.key());
                            System.out.println("record.value() = " + record.value());
                        })
                        .using((success, message, error) -> {
                            //查看错误信息
                            if (!success && error != null) {
                                // 报错回调
                                System.out.println("----------error------");
                                System.out.println(message);
                                System.out.println(error);
                                error.printStackTrace();
                            }
                        })
                        .build();

        return engine;
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值