gpt4 book ai didi

java - Maxmind DatabaseReader Java 堆空间

转载 作者:行者123 更新时间:2023-12-01 19:05:55 26 4
gpt4 key购买 nike

我尝试在 Spring Boot 中使用 GeoLite2-City.mmdb 来获取位置数据。为此,我在配置文件中创建了一个像这样的 bean:

        @Bean   
public static synchronized DatabaseReader mmdbReader() throws IOException {

if ( reader != null ) {
return reader;
}

ResourceLoader resourceLoader = new DefaultResourceLoader();

Resource resource = resourceLoader.getResource("classpath:static/mmdb/GeoLite2-City.mmdb");
InputStream database = resource.getInputStream();

reader = new DatabaseReader.Builder(database).fileMode(com.maxmind.db.Reader.FileMode.MEMORY)
.withCache(new CHMCache()).build();

return reader;
}

我还创建了一个 util 函数来检索位置,如下所示:

     public static GeoLocation getLocation(HttpServletRequest request, DatabaseReader databaseReader) throws IOException, GeoIp2Exception{

if(request.getRemoteAddr().equals("0:0:0:0:0:0:0:1") || request.getRemoteAddr().equals("127.0.0.1")) {
return new GeoLocation("localhost", "Redmond", "USA", 47.673988, -122.121513);
}

InetAddress ipAddress = InetAddress.getByName(request.getRemoteAddr());

CityResponse response = databaseReader.city(ipAddress);

Country country = response.getCountry();
City city = response.getCity();
Location location = response.getLocation();

return new GeoLocation(ipAddress.toString(), city.getName(), country.getName(), location.getLatitude(), location.getLongitude());
}

但是,每次部署应用程序时都会出现此错误


Caused by: java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at com.maxmind.db.BufferHolder.<init>(BufferHolder.java:64)
at com.maxmind.db.Reader.<init>(Reader.java:89)
at com.maxmind.geoip2.DatabaseReader.<init>(DatabaseReader.java:64)
at com.maxmind.geoip2.DatabaseReader.<init>(DatabaseReader.java:54)

at com.maxmind.geoip2.DatabaseReader$Builder.build(DatabaseReader.java:160)
at com.microsoft.apie.configuration.ApplicationConfiguration.mmdbReader(ApplicationConfiguration.java:104)

我的java设置是:

  -Xms512m -Xmx2048m

你能帮忙吗?

最佳答案

我通过这样做解决了这个问题:

a.我从 jar 中删除了文件 GeoLite2-City.mmdb 并将其放在与 jar 相同的文件夹中

b.我重构了这个方法:

    @Bean  
public static synchronized DatabaseReader mmdbReader() throws IOException {

if ( reader != null ) {
return reader;
}

/*ResourceLoader resourceLoader = new DefaultResourceLoader();

Resource resource = resourceLoader.getResource("classpath:static/mmdb/GeoLite2-Country.mmdb");

InputStream database = resource.getInputStream();
*/
FileSystemResource resource = new FileSystemResource("/path/to/file/GeoLite2-City.mmdb");

reader = new DatabaseReader.Builder(resource.getFile()).fileMode(com.maxmind.db.Reader.FileMode.MEMORY_MAPPED)
.withCache(new CHMCache()).build();

return reader;
}

c.重新打包应用程序,它可以工作了!

感谢 Strelok 的建议

关于java - Maxmind DatabaseReader Java 堆空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59557001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com