具有可变数量参数的 Java 功能接口

问题描述 投票:0回答:1

我想编写一个非常轻量级的库方法,它将采用任意数量的 java lambda 函数,并在关闭自动提交的情况下执行它们。如果发生错误,它将回滚。因此 lambda 函数本身可以具有处理数据库更新等的代码。

我只是简单地使用函数闭包并将其传递给执行数据库逻辑的代码以使其具有事务性。寻找一种方法来泛化它,所以我要做的就是简单地传递一组 lambda 函数,并期望代码中的任何数据库更新都是事务性的。

关于如何解决这个问题有什么建议,或者我是否以正确的方式思考这个问题?

java spring-boot functional-interface
1个回答
-1
投票

您可以在 Java 中创建一个轻量级库方法,该方法采用多个 lambda 函数,在关闭自动提交的情况下执行它们,并在发生错误时回滚,如下所示,

第 1 步:定义功能接口:创建一个功能接口来表示任务:

@FunctionalInterface
public interface TransactionalTask {
    void execute() throws Exception;
}

第 2 步:创建事务管理器:实现管理事务的类:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class TransactionManager {

    private Connection getConnection() throws SQLException {
        // Replace with your actual database connection details
        return DriverManager.getConnection("jdbc:database_url", "user_name", "dpassword");
    }

    public void executeTransaction(TransactionalTask... tasks) {
        try (Connection connection = getConnection()) {
            connection.setAutoCommit(false);

            try {
                for (TransactionalTask task : tasks) {
                    task.execute();
                }
                connection.commit();
            } catch (Exception e) {
                connection.rollback();
                throw new RuntimeException("Transaction failed and rolled back", e);
            }

        } catch (SQLException e) {
            throw new RuntimeException("Failed to manage transaction", e);
        }
    }
}

第 3 步:使用事务管理器:通过将任务作为 lambda 函数传递来以事务方式执行任务:

public class Main {
    public static void main(String[] args) {
        TransactionManager transactionManager = new TransactionManager();

        transactionManager.executeTransaction(
            () -> {
                // Task 1: DB update logic
                System.out.println("Executing task 1");
                // DB update logic
            },
            () -> {
                // Task 2: Another DB update logic
                System.out.println("Executing task 2");
                // DB update logic
            }
            // Add more tasks
        );
    }
}

它确保所提供的 lambda 函数内的所有数据库操作都在单个事务中执行。如果任何操作失败,事务将回滚,确保原子性。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.