gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:34:31 25 4
gpt4 key购买 nike

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com