Redisson:在finalize方法中关闭客户端
Redisson: Closing client in finalize method
我正在为 redission 客户端编写一个适配器以在我们的应用程序中使用,我不确定在 finalize 块中关闭客户端是否是一个好的设计。下面是代码。请告诉我
private static final RedissonClient client;
static {
File configFile = Paths.get(Constants.ConfigDir, "cache-
config.yml").toFile();
try {
client = Redisson.create(Config.fromYAML(configFile));
} catch (IOException e) {
throw new UnableToCreateCacheClientException(e.getMessage() + e.getStackTrace(), e.getCause());
}
}
@Override
protected void finalize() throws Throwable {
super.finalize();
client.shutdown();
}
public static RedissonClient getClient() {
return client;
}
编辑:我有兴趣了解在 Web 应用程序中关闭静态最终连接对象的正确设计。我无法在方法的 finally 块中关闭它,因为客户端将被多个 类
中的多个方法使用
您不应该依赖 finalize()
关闭客户端的方法 - 您应该确保在其他地方关闭它。 finalize() 只会在对象被垃圾回收时调用,这可能在客户端应该关闭很久之后才被调用(也可能永远不会,具体取决于程序的生命周期和 gc 选项。)
出于这个原因,许多人会完全摆脱 finalize() 方法。
如果你确实把它留在那里,那么就把它当作一个备份来捕获上游的编码错误。首先检查客户端是否关闭,如果没有,请确保打印了一条警告消息,表明您遇到了需要解决的错误!
我正在为 redission 客户端编写一个适配器以在我们的应用程序中使用,我不确定在 finalize 块中关闭客户端是否是一个好的设计。下面是代码。请告诉我
private static final RedissonClient client;
static {
File configFile = Paths.get(Constants.ConfigDir, "cache-
config.yml").toFile();
try {
client = Redisson.create(Config.fromYAML(configFile));
} catch (IOException e) {
throw new UnableToCreateCacheClientException(e.getMessage() + e.getStackTrace(), e.getCause());
}
}
@Override
protected void finalize() throws Throwable {
super.finalize();
client.shutdown();
}
public static RedissonClient getClient() {
return client;
}
编辑:我有兴趣了解在 Web 应用程序中关闭静态最终连接对象的正确设计。我无法在方法的 finally 块中关闭它,因为客户端将被多个 类
中的多个方法使用您不应该依赖 finalize()
关闭客户端的方法 - 您应该确保在其他地方关闭它。 finalize() 只会在对象被垃圾回收时调用,这可能在客户端应该关闭很久之后才被调用(也可能永远不会,具体取决于程序的生命周期和 gc 选项。)
出于这个原因,许多人会完全摆脱 finalize() 方法。
如果你确实把它留在那里,那么就把它当作一个备份来捕获上游的编码错误。首先检查客户端是否关闭,如果没有,请确保打印了一条警告消息,表明您遇到了需要解决的错误!