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