Flink1.14connector

动画大全时间:2024-04-28 05:41:35点击:914

基于jdbc方言()里不同何时、如何被调用的思考。

前言:在修改--jdbc源码时,观察到jdbc有方言的实现,在.里存在/和两种更新语义,所以研究下何种情况执行/,何种情况执行。如有任何错误,欢迎大家指正。

jdbc插入模式次要分为两类:

1、-Only

仅追加流,简单来讲,不管数据重不重复,只是往里添加。

2、

更新插入流,即更新或者插入,一般要求sink端数据库需要唯一的键值。例如的INTO...ONKEY...语法。

一、jdbc方言

既然sql可以适配多种数据库,所以在jdbc方言方面确定会有不同的适配,适配的就是.

.

/**theSQLofjdbc.*/@{/***Getthenameofjdbc.**@thename.*/();/***ifthiscanajdbcurl.**@urlthejdbcurl.*@Trueifthecanbeonthejdbcurl.*/(url);/***Getthatjdbcandeach.**@therowtype*@arowforthe*/();/***Gettotheofrowfromthejdbc.**@ofrowtoemit.Theofthebenon-.*@the.*/(long);/***ifthisadatatypein.**@the.*@incaseofthetype.*/void(){}/***@thename,ifusernotthename,thenwill*usethisone.*/(){.();}/***the.Thisisusedtoputtheincasethe*nameisa,orincaseitthat(e.g.*).{@code"}to.*/(){"""++""";}/***Get,thehasitsown,suchas*KEY,andON...DOSET..**@Noneifdoesnot,thewilltotheuse*of+/,thisispoor.*/(,[],[]){.();}/**Getrowby.use.*/(,[]){=.().map(f-("%s=:%s",(f),f)).(.("AND"));"1FROM"+()+""+;}/**Getinto.*/(,[]){=.().map(this:).(.(","));=.().map(f-":"+f).(.(","));"INTO"+()+"("++")"+"("++")";}/***Getonerowby,notuse1,1is*asql.*/(,[],[]){=.().map(f-("%s=:%s",(f),f)).(.(","));=.().map(f-("%s=:%s",(f),f)).(.("AND"));""+()+"SET"++""+;}/***Getonerowby,notuse1,1is*asql.*/(,[]){=.().map(f-("%s=:%s",(f),f)).(.("AND"));"FROM"+()+""+;}/**Getby.use.*/(,[],[]){=.().map(this:).(.(","));=.().map(f-("%s=:%s",(f),f)).(.("AND"));""++"FROM"++(.?""+:"");}}

所以在执行sql时验证了此猜想,在此就是主键定义,也就是定义了主键的时候会执行语义。

三、分析

其中又根据具体数据库方言的实现分为两种,支持幂等写入则为一次SQL执行,不支持幂等写入则为两次SQL执行(先查询存不存在,再根据存在与否更新或插入)。

推荐内容