!813 紧急修复Ip2Region InputStream读取函数导致的OOM问题

Merge pull request !813 from 疯狂的狮子Li/dev
This commit is contained in:
疯狂的狮子Li
2025-12-23 06:44:24 +00:00
committed by Gitee
3 changed files with 21 additions and 7 deletions

View File

@@ -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实例

View File

@@ -20,7 +20,7 @@ public class NicknameTranslationImpl implements TranslationInterface<String> {
@Override @Override
public String translation(Object key, String other) { public String translation(Object key, String other) {
if (key instanceof Long id) { if (key instanceof Long id) {
return userService.selectNicknameByIds(id.toString()); return userService.selectNicknameById(id);
} else if (key instanceof String ids) { } else if (key instanceof String ids) {
return userService.selectNicknameByIds(ids); return userService.selectNicknameByIds(ids);
} }

View File

@@ -1,5 +1,6 @@
package org.dromara.common.translation.core.impl; package org.dromara.common.translation.core.impl;
import cn.hutool.core.convert.Convert;
import org.dromara.common.core.service.UserService; import org.dromara.common.core.service.UserService;
import org.dromara.common.translation.annotation.TranslationType; import org.dromara.common.translation.annotation.TranslationType;
import org.dromara.common.translation.constant.TransConstant; import org.dromara.common.translation.constant.TransConstant;
@@ -19,9 +20,6 @@ public class UserNameTranslationImpl implements TranslationInterface<String> {
@Override @Override
public String translation(Object key, String other) { public String translation(Object key, String other) {
if (key instanceof Long id) { return userService.selectUserNameById(Convert.toLong(key));
return userService.selectUserNameById(id);
}
return null;
} }
} }