因为我接下去想尝试搭建基于docker的mysql集群,因此连接的docker版本的mysql,出了几个小问题,一个是关闭ssl认证,一个修改mavn版本提升到8.0.11 否则会报caching_sha2_password 的错误
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.11</version>
</dependency>
回归正题,自定义jdbcsink难度不大,核心代码如下
class MyJdbcSinkFunc() extends RichSinkFunction[item_count]{
// 定义连接、预编译语句
var conn: Connection = _
var insertStmt: PreparedStatement = _
var updateStmt: PreparedStatement = _
var count = 0
override def open(parameters: Configuration): Unit = {
Class.forName("com.mysql.jdbc.Driver")
conn = DriverManager.getConnection("jdbc:mysql://localhost:3309/alibaba?characterEncoding=utf8&useSSL=false", "root", "root")
insertStmt = conn.prepareStatement("insert into Item_detail (item_id,cate_id,price,sale_count,save_count) values (?, ?,?,?,?)")
updateStmt = conn.prepareStatement("update Item_detail set sale_count =sale_count +1 where item_id = ?")
}
override def invoke(value: item_count): Unit = {
// 先执行更新操作,查到就更新
updateStmt.setLong(1, value.item_id)
updateStmt.execute()
// 如果更新没有查到数据,那么就插入
if( updateStmt.getUpdateCount == 0 ){
insertStmt.setLong(1, value.item_id)
insertStmt.setLong(2