mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2025-12-26 07:26:44 +08:00
fix 临时修复Ip2Region InputStream读取函数导致的OOM问题
This commit is contained in:
parent
496df8494e
commit
961bca462e
@ -1,5 +1,6 @@
|
|||||||
package org.dromara.common.core.utils.ip;
|
package org.dromara.common.core.utils.ip;
|
||||||
|
|
||||||
|
import cn.hutool.core.io.FileUtil;
|
||||||
import cn.hutool.core.io.resource.ResourceUtil;
|
import cn.hutool.core.io.resource.ResourceUtil;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.common.core.exception.ServiceException;
|
import org.dromara.common.core.exception.ServiceException;
|
||||||
@ -8,6 +9,7 @@ import org.lionsoul.ip2region.service.Config;
|
|||||||
import org.lionsoul.ip2region.service.Ip2Region;
|
import org.lionsoul.ip2region.service.Ip2Region;
|
||||||
import org.lionsoul.ip2region.xdb.Util;
|
import org.lionsoul.ip2region.xdb.Util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
|
||||||
@ -43,11 +45,18 @@ public class RegionUtils {
|
|||||||
// 因为加载整个xdb文件会耗费非常大的内存,如果你不希望加载整个xdb到内存中,更推荐使用 VIndexCache 或 NoCache(即实时读取文件)策略和 setXdbPath/setXdbFile 加载方法(需要注意的一点,setXdbPath 和 setXdbFile 不支持读取ClassPath(即源码和resource目录)中的文件)。
|
// 因为加载整个xdb文件会耗费非常大的内存,如果你不希望加载整个xdb到内存中,更推荐使用 VIndexCache 或 NoCache(即实时读取文件)策略和 setXdbPath/setXdbFile 加载方法(需要注意的一点,setXdbPath 和 setXdbFile 不支持读取ClassPath(即源码和resource目录)中的文件)。
|
||||||
// 一般而言,更建议把xdb数据库放到一个指定的文件目录中(即不打包进jar包中),然后使用 NoCache + 配合SearcherPool的并发池读取数据,更方便随时更新xdb数据库
|
// 一般而言,更建议把xdb数据库放到一个指定的文件目录中(即不打包进jar包中),然后使用 NoCache + 配合SearcherPool的并发池读取数据,更方便随时更新xdb数据库
|
||||||
|
|
||||||
|
// TODO 2025年12月23日 Ip2Region封装的 InputStream 读取函数 Searcher.loadContentFromInputStream 在Linux环境下会申请过大的byte[]空间而导致OOM,这里先用临时文件的方案解决,等后续 Ip2Region 更新解决方案
|
||||||
|
// 创建临时文件
|
||||||
|
File v4TempXdb = FileUtil.writeFromStream(ResourceUtil.getStream(DEFAULT_IPV4_XDB_PATH), FileUtil.createTempFile());
|
||||||
|
|
||||||
// IPv4配置
|
// IPv4配置
|
||||||
Config v4Config = Config.custom()
|
Config v4Config = Config.custom()
|
||||||
.setCachePolicy(Config.BufferCache)
|
.setCachePolicy(Config.BufferCache)
|
||||||
.setXdbInputStream(ResourceUtil.getStream(DEFAULT_IPV4_XDB_PATH))
|
.setXdbFile(v4TempXdb)
|
||||||
|
// .setXdbInputStream(ResourceUtil.getStream(DEFAULT_IPV4_XDB_PATH))
|
||||||
.asV4();
|
.asV4();
|
||||||
|
// 删除临时文件
|
||||||
|
v4TempXdb.delete();
|
||||||
|
|
||||||
// IPv6配置
|
// IPv6配置
|
||||||
Config v6Config = null;
|
Config v6Config = null;
|
||||||
@ -55,10 +64,17 @@ public class RegionUtils {
|
|||||||
if (v6XdbInputStream == null) {
|
if (v6XdbInputStream == null) {
|
||||||
log.warn("未加载 IPv6 地址库:未在类路径下找到文件 {}。当前仅启用 IPv4 查询。如需启用 IPv6,请将 ip2region_v6.xdb 放置到 resources 目录", DEFAULT_IPV6_XDB_PATH);
|
log.warn("未加载 IPv6 地址库:未在类路径下找到文件 {}。当前仅启用 IPv4 查询。如需启用 IPv6,请将 ip2region_v6.xdb 放置到 resources 目录", DEFAULT_IPV6_XDB_PATH);
|
||||||
} else {
|
} else {
|
||||||
|
// 创建临时文件
|
||||||
|
File v6TempXdb = FileUtil.writeFromStream(ResourceUtil.getStream(DEFAULT_IPV4_XDB_PATH), FileUtil.createTempFile());
|
||||||
|
|
||||||
v6Config = Config.custom()
|
v6Config = Config.custom()
|
||||||
.setCachePolicy(Config.BufferCache)
|
.setCachePolicy(Config.BufferCache)
|
||||||
.setXdbInputStream(v6XdbInputStream)
|
.setXdbFile(v6TempXdb)
|
||||||
|
// .setXdbInputStream(v6XdbInputStream)
|
||||||
.asV6();
|
.asV6();
|
||||||
|
|
||||||
|
// 删除临时文件
|
||||||
|
v6TempXdb.delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化Ip2Region实例
|
// 初始化Ip2Region实例
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user