You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by "casel.chen" <ca...@126.com> on 2022/02/15 05:25:07 UTC

flink sql jdbc sink事务提交问题

最近在扩展flink sql jdbc connector以支持phoenix数据库,测试debug的时候发现数据能够通过PhoenixStatement.executeBatch()写入,但因为没有提交事务,所以其他人看不到。
源码中PhoenixPreparedStatement.execute()方法会调用executeMutation(statement)方法,继而判断connection.getAutoCommit()与否来执行connection.commit()方法。完了回到PhoenixStatement.executeBatch()执行flushIfNecessary()方法,里面根据connection.getAutoFlush()与否来执行connection.flush()操作。
一开始我没有在phoenix jdbc url上添加;autocommit=true参数,发现变化的数据并没有commit到数据库。后来添加了;autocommit=true参数后执行了connection.commit()方法才将数据提交成功。


有几个疑问:
1. 换成sink进mysql数据库就没有这个问题,难道不同数据库的jdbc sink行为会不一样么?
2. connection autoflush参数在哪里设置?跟autocommit区别是什么?
3. buffer条数满了或interval周期达到又或者checkpoint时就会执行flush操作,里面执行的是JdbcBatchingOutputFormat.flush方法,这里我也没有找到connection.commit()操作,数据是如何提交到数据库的呢?不开启事务情况下,执行完statement.executeBatch()就会提交么?

Re:Re:flink sql jdbc sink事务提交问题

Posted by "casel.chen" <ca...@126.com>.
如果mysql配置不是auto commit,那么事务是在哪一步提交呢?

















在 2022-02-16 10:24:39,"Michael Ran" <gr...@163.com> 写道:
>jdbc 连接 mysql 的driver  记得默认就是AutoCommit。phoenix不太清楚
>在 2022-02-15 13:25:07,"casel.chen" <ca...@126.com> 写道:
>>最近在扩展flink sql jdbc connector以支持phoenix数据库,测试debug的时候发现数据能够通过PhoenixStatement.executeBatch()写入,但因为没有提交事务,所以其他人看不到。
>>源码中PhoenixPreparedStatement.execute()方法会调用executeMutation(statement)方法,继而判断connection.getAutoCommit()与否来执行connection.commit()方法。完了回到PhoenixStatement.executeBatch()执行flushIfNecessary()方法,里面根据connection.getAutoFlush()与否来执行connection.flush()操作。
>>一开始我没有在phoenix jdbc url上添加;autocommit=true参数,发现变化的数据并没有commit到数据库。后来添加了;autocommit=true参数后执行了connection.commit()方法才将数据提交成功。
>>
>>
>>有几个疑问:
>>1. 换成sink进mysql数据库就没有这个问题,难道不同数据库的jdbc sink行为会不一样么?
>>2. connection autoflush参数在哪里设置?跟autocommit区别是什么?
>>3. buffer条数满了或interval周期达到又或者checkpoint时就会执行flush操作,里面执行的是JdbcBatchingOutputFormat.flush方法,这里我也没有找到connection.commit()操作,数据是如何提交到数据库的呢?不开启事务情况下,执行完statement.executeBatch()就会提交么?

Re:flink sql jdbc sink事务提交问题

Posted by Michael Ran <gr...@163.com>.
jdbc 连接 mysql 的driver  记得默认就是AutoCommit。phoenix不太清楚
在 2022-02-15 13:25:07,"casel.chen" <ca...@126.com> 写道:
>最近在扩展flink sql jdbc connector以支持phoenix数据库,测试debug的时候发现数据能够通过PhoenixStatement.executeBatch()写入,但因为没有提交事务,所以其他人看不到。
>源码中PhoenixPreparedStatement.execute()方法会调用executeMutation(statement)方法,继而判断connection.getAutoCommit()与否来执行connection.commit()方法。完了回到PhoenixStatement.executeBatch()执行flushIfNecessary()方法,里面根据connection.getAutoFlush()与否来执行connection.flush()操作。
>一开始我没有在phoenix jdbc url上添加;autocommit=true参数,发现变化的数据并没有commit到数据库。后来添加了;autocommit=true参数后执行了connection.commit()方法才将数据提交成功。
>
>
>有几个疑问:
>1. 换成sink进mysql数据库就没有这个问题,难道不同数据库的jdbc sink行为会不一样么?
>2. connection autoflush参数在哪里设置?跟autocommit区别是什么?
>3. buffer条数满了或interval周期达到又或者checkpoint时就会执行flush操作,里面执行的是JdbcBatchingOutputFormat.flush方法,这里我也没有找到connection.commit()操作,数据是如何提交到数据库的呢?不开启事务情况下,执行完statement.executeBatch()就会提交么?