如何解决 Azure for PostgreSQL 中的内存不足错误

问题描述

我在一个项目中工作,该项目从数据库提取一百万条数据,并将该数据转换为 csv 文件以供下载。我使用的数据库是 Postgresql,我将它部署到 AKS(Azure kubernetes)。该代码在我的本地工作正常。我正在从 AKS 使用的本地连接同一个数据库。但是当我尝试在 AKS 中执行代码时,我总是得到

 java.lang.OutOfMemoryError: Java heap space] with root cause
  java.lang.OutOfMemoryError: Java heap space
at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor.getExtractor(VarcharTypeDescriptor.java:59) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:249) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.custom.ScalarResultColumnProcessor.extract(ScalarResultColumnProcessor.java:54) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.custom.ResultRowProcessor.buildresultRow(ResultRowProcessor.java:83) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.custom.ResultRowProcessor.buildresultRow(ResultRowProcessor.java:60) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.custom.Customloader.getResultColumnorRow(Customloader.java:412) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.Loader.getRowFromresultSet(Loader.java:775) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.Loader.getRowsFromresultSet(Loader.java:1044) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.Loader.processResultSet(Loader.java:995) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.Loader.doQuery(Loader.java:964) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:350) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.Loader.doList(Loader.java:2887) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.Loader.doList(Loader.java:2869) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2701) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.Loader.list(Loader.java:2696) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.loader.custom.Customloader.list(Customloader.java:338) ~[hibernate-core-5.4.21.Final.jar!/:5.4.21.Final]
at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java

我正在发布执行的代码

Query query = entityManager.createNativeQuery(sqlQuery);
List<Object[]> objectList = query.getResultList();
objectList.forEach(glObject -> {
 myEntity entity = myEntity.builder()
 .supl_num(glObject[0])
 .detail(glObject[1])
 ...............
  .build();
myEntityList.add(entity);   
});

AKS 部署配置

...........
ports:
     -containerPort: 80
resources:
  requests:
    cpu : 75m
    memory:256Mi
  limits:
     cpu:1
   memory: 2Gi

我不明白为什么这一次又一次地造成

解决方法

在您的 JDBC URL 中使用 defaultRowFetchSize 连接参数,以便驱动程序分块而不是一次获取数据。