数据库事务和批处理

事务:

事务使用来保证数据操作的完整性

  • 一个业务由若干个一次性的操作组成,这些操作要么都成功,要么都失败
  • 事务的四大特性ACID
    • 原子性(Atomicity):不可再分
    • 一致性(consistency):事务执行的前后,数据库是一致的
    • 隔离性(Isolation):两个事务的操作互不干扰
    • 持久性(Durability):事务提交后,结果被永久保存
  • JDBC默认是自动提交事务的,将每一条sql语句都当做一个独立的事务执行
    • 关闭自动提交事务 conn.setAAutoCommit(false);
    • 提交事务 conn.,commit();
    • 回滚事务 conn.rollback();

批处理操作

当需要执行的sql语句比较多时,每次发送一条SQL语句并执行的效率比较低,此时可以批量处理SQL。步骤:

  1. 在url中调价rewriteBatchedStatements=true参数,启用批处理
  2. 调用addBatch()方法,添加批处理
  3. 调用executeBatch()方法,执行批处理

区别

事务是在数据库方存储sql,没有提交事务的数据放在数据库的临时表空间。最后一次吧临时表空间中的数据提交到数据库服务器执行,消耗的是数据库服务器内存

批处理底层是在客户端存储SQL,最后一次把客户端存储的数据发送到数据库服务器执行,消耗的是客户端的内存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Flink 批处理将数据写入数据库可以通过 Flink 的 `OutputFormat` 接口来实现。下面是一个简单的示例,假设有一个数据集 `DataSet<Tuple2<String, Integer>>`,其每个元素是一个字符串和一个整数,需要将其写入到 MySQL 数据库: 1. 首先需要引入对应的依赖,例如: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> ``` 2. 然后定义一个实现了 `OutputFormat` 接口的类,例如: ```java public class MySQLOutputFormat implements OutputFormat<Tuple2<String, Integer>> { private Connection connection; private PreparedStatement statement; @Override public void configure(Configuration configuration) { // 获取数据库连接等配置信息 String jdbcUrl = configuration.getString("jdbc.url", "jdbc:mysql://localhost:3306/test"); String username = configuration.getString("jdbc.username", "root"); String password = configuration.getString("jdbc.password", "root"); try { connection = DriverManager.getConnection(jdbcUrl, username, password); statement = connection.prepareStatement("INSERT INTO table_name (col1, col2) VALUES (?, ?)"); } catch (SQLException e) { e.printStackTrace(); } } @Override public void open(int i, int i1) throws IOException { // 打开连接,并设置事务等配置信息 try { connection.setAutoCommit(false); } catch (SQLException e) { e.printStackTrace(); } } @Override public void writeRecord(Tuple2<String, Integer> tuple2) throws IOException { // 将数据写入 PreparedStatement try { statement.setString(1, tuple2.f0); statement.setInt(2, tuple2.f1); statement.addBatch(); } catch (SQLException e) { e.printStackTrace(); } } @Override public void close() throws IOException { // 执行批量写入,并提交事务 try { statement.executeBatch(); connection.commit(); } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭连接等资源 try { if (statement != null) { statement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } ``` 3. 最后在 Flink 程序使用该类进行数据写入,例如: ```java DataSet<Tuple2<String, Integer>> dataSet = ... // 获取数据集 Configuration config = new Configuration(); config.setString("jdbc.url", "jdbc:mysql://localhost:3306/test"); config.setString("jdbc.username", "root"); config.setString("jdbc.password", "root"); dataSet.output(new MySQLOutputFormat()).configure(config); env.execute(); ``` 以上是一个简单的示例,需要根据具体情况进行适当的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值