From f07c20afabf6652fac794801274c683756a26f65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Fri, 12 Dec 2025 22:50:23 +0800 Subject: [PATCH] =?UTF-8?q?update=20Ip2Region=20version=20to=203.3.1?= =?UTF-8?q?=EF=BC=8C=E4=BD=BF=E7=94=A8=E6=96=B0=E7=9A=84xdb=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=8A=A0=E8=BD=BD=E5=87=BD=E6=95=B0=E4=BC=98=E5=8C=96?= =?UTF-8?q?xdb=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9A=84=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../common/core/utils/ip/RegionUtils.java | 26 +++++++------------ 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/pom.xml b/pom.xml index ee9aef2df..dddeac86c 100644 --- a/pom.xml +++ b/pom.xml @@ -38,7 +38,7 @@ 1.80 1.16.7 - 3.3.0 + 3.3.1 2.28.22 diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java index 37be66895..1bb69c5b3 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ip/RegionUtils.java @@ -1,6 +1,5 @@ package org.dromara.common.core.utils.ip; -import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.resource.ResourceUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.exception.ServiceException; @@ -9,8 +8,7 @@ import org.lionsoul.ip2region.service.Config; import org.lionsoul.ip2region.service.Ip2Region; import org.lionsoul.ip2region.xdb.Util; -import java.io.File; -import java.net.URL; +import java.io.InputStream; import java.time.Duration; /** @@ -40,33 +38,27 @@ public class RegionUtils { // 初始化Ip2Region服务实例 static { try { - // 创建临时文件用于处理IP离线数据库xdb文件 - File v4TempXdb = FileUtil.writeFromStream(ResourceUtil.getStream(DEFAULT_IPV4_XDB_PATH), FileUtil.createTempFile()); + // 注意:Ip2Region 的xdb文件加载策略 CachePolicy 有三种,分别是:BufferCache(全量读取xdb到内存中)、VIndexCache(默认策略,按需读取并缓存)、NoCache(实时读取) + // 本项目工具使用的 CachePolicy 为 BufferCache,BufferCache会加载整个xdb文件到内存中,setXdbInputStream 仅支持 BufferCache 策略。 + // 因为加载整个xdb文件会耗费非常大的内存,如果你不希望加载整个xdb到内存中,更推荐使用 VIndexCache 或 NoCache(即实时读取文件)策略和 setXdbPath/setXdbFile 加载方法(需要注意的一点,setXdbPath 和 setXdbFile 不支持读取ClassPath(即源码和resource目录)中的文件)。 + // 一般而言,更建议把xdb数据库放到一个指定的文件目录中(即不打包进jar包中),然后使用 NoCache + 配合SearcherPool的并发池读取数据,更方便随时更新xdb数据库 // IPv4配置 Config v4Config = Config.custom() .setCachePolicy(Config.BufferCache) - .setXdbPath(v4TempXdb.getPath()) + .setXdbInputStream(ResourceUtil.getStream(DEFAULT_IPV4_XDB_PATH)) .asV4(); - // 删除临时文件 - // 注意:因为使用的 CachePolicy 为 BufferCache,BufferCache是加载整个xdb文件到内存中,所以临时文件的删除不会影响到正常的使用。如果使用的是 VIndexCache 或 NoCache(即实时读取文件),删除临时文件会导致xdb数据库读取不到而无法使用。 - // CachePolicy的三种策略:BufferCache(全量读取xdb到内存中)、VIndexCache(按需读取并缓存)、NoCache(实时读取) - // 一般而言,更建议把xdb数据库放到一个指定的文件目录中(即不打包进jar包中),然后使用 NoCache + 配合SearcherPool的并发池读取数据,更方便随时更新xdb数据库 - v4TempXdb.delete(); // IPv6配置 Config v6Config = null; - URL v6Url = ResourceUtil.getResource(DEFAULT_IPV6_XDB_PATH); - if (v6Url == null) { + InputStream v6XdbInputStream = ResourceUtil.getStreamSafe(DEFAULT_IPV6_XDB_PATH); + if (v6XdbInputStream == null) { log.warn("未加载 IPv6 地址库:未在类路径下找到文件 {}。当前仅启用 IPv4 查询。如需启用 IPv6,请将 ip2region_v6.xdb 放置到 resources 目录", DEFAULT_IPV6_XDB_PATH); } else { - File v6TempXdb = FileUtil.writeFromStream(v6Url.openStream(), FileUtil.createTempFile()); v6Config = Config.custom() .setCachePolicy(Config.BufferCache) - .setXdbPath(v6TempXdb.getPath()) + .setXdbInputStream(v6XdbInputStream) .asV6(); - // 删除临时文件 - v6TempXdb.delete(); } // 初始化Ip2Region实例