Java 7 传递方法作为通用 SQL 死锁检查的参数

标签 java methods java-7 generic-programming database-deadlocks

在 Java 7 中是否可以将方法作为参数传递。

该方法将被调用并封装在 do while 中以检查 sql 死锁并重试。

我正在尝试制定一种通用的方法来处理表上有锁时的死锁,因为目前有成千上万的插入和更新来复制它。目前它只会查找 SQLException,但这可以更改为 SQLException 的 getErrorCode 和目标 ER_LOCK_DEADLOCK。

下面的代码只是我想要实现的一个例子:

public void Object1Insert(Object1 object1){
    genericSQLRetry(insertObject1(object1));
}

public void Object2Insert(Object2 object2){
    genericSQLRetry(insertObject2(object2));
}

public void genericSQLRetry({method}){
    int retries = 5;
    boolean isException = false;
  do{
    try {
        isException = false;
        retries--;
        //Invoke method
        {method}
    }catch (SQLException e){
        isException = true;
    }

    if (isException & retries > 0){
        //getRandomSleep would be between 750-1250ms. This is to stop multiple retries at the same time.
        Thread.sleep(getRandomSleep());
    }
  }while (isException == true && retries > 0);
}

最佳答案

In Java 7 is it possible pass the method as a paramater.

没有。这就是 Java 8 添加 lambda(包括方法引用)和函数式接口(interface)的原因。

但是您可以在接口(interface)中定义该方法,在调用类(可能是您在本地实例化的匿名类)中实现该接口(interface),在 genericSQLRetry 中接受该接口(interface),然后调用该方法您收到的实例。

在您的情况下,您可以重新使用 Runnable(这是他们在 Java 8 中对没有参数且没有返回值的 lambda 所做的),并且:

public void Object1Insert(final Object1 object1) {
    genericSQLRetry(new Runnable {
        public void run() {
            insertObject1(object1);
        }
    });
}

public void Object2Insert(Object2 object2) {
    genericSQLRetry(new Runnable {
        public void run() {
            insertObject2(object2);
        }
    });
}

public void genericSQLRetry(Runnable retryable) {
    int retries = 5;
    boolean isException = false;
    do {
        try {
            isException = false;
            retries--;
            //Invoke method
            retryable.run();
        }
        catch (SQLException e) {
            isException = true;
        }

        if (isException & retries > 0) {
            //getRandomSleep would be between 750-1250ms. This is to stop multiple retries at the same time.
            Thread.sleep(getRandomSleep());
        }
    } while (isException == true && retries > 0);
}

不过,就我个人而言,我更喜欢语义更清晰的我自己的界面:

interface Retryable {
    void retry() {
    }
}

然后使用 Retryable 而不是 Runnable

关于Java 7 传递方法作为通用 SQL 死锁检查的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45651252/

相关文章:

java - Maven 本地依赖

java - 首次运行项目时未生成 Log4j 日志文件

java - 如何正确注册自定义 JsonSerializer?

c++ - friend 和内联方法,有什么意义?

java - 如何将类作为参数传递给方法,就好像它是动态变量一样?

Java 7 的 fork/join 框架没有使用所有可用的 CPU 能力

Java Servlets - 转发到 url 而不是 ServletName.do

java - 使用类作为变量标识符?

java - 如何计算 ScheduledExecutorService 的初始延迟#scheduleAtFixedRate

java - JDK 日期/时间的问题是否已修复,或者是否仍被视为已损坏?