

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 优化 AWS Blu Age 现代化应用程序的性能
<a name="optimize-performance-aws-blu-age-modernized-application"></a>

*Vishal Jaswani、Manish Roy 和 Himanshu Sah，Amazon Web Services*

## Summary
<a name="optimize-performance-aws-blu-age-modernized-application-summary"></a>

使用 AWS Blu Age 进行现代化改造的大型机应用程序需要在部署到生产环境之前进行功能和性能等效性测试。在性能测试中，经过现代化的应用程序的运行速度可能比传统系统慢，尤其是在处理复杂的批处理作业时。之所以存在这种差异，是因为大型机应用程序采用单体架构，而现代应用程序则采用多层架构。这种模式提供了一些优化技术，可以解决通过在 Blu Age 中使用[自动重构实现现代化的应用程序的 AWS](https://docs.aws.amazon.com/m2/latest/userguide/refactoring-m2.html)这些性能差距。

该模式使用具有原生 Java 和数据库调整功能的 AWS Blu Age 现代化框架来识别和解决性能瓶颈。该模式描述了如何使用分析和监控来识别性能问题，包括指标（例如 SQL 执行时间、内存利用率和 I/O 模式）。然后阐述了如何实施针对性优化，包括数据库查询重构、缓存技术应用以及业务逻辑优化。

批处理时间的缩短和系统资源使用率的提升，助您在现代化系统中实现与大型机相当的性能水平。在向基于云的现代架构过渡期间，这种方法保持了功能等效性。

要使用此模式，请按照[操作说明](#optimize-performance-aws-blu-age-modernized-application-epics)部分的说明，设置系统并识别性能热点，然后应用[架构](#optimize-performance-aws-blu-age-modernized-application-architecture)部分详述的优化技术。

## 先决条件和限制
<a name="optimize-performance-aws-blu-age-modernized-application-prereqs"></a>

**先决条件**
+  AWS 蓝光时代的现代化应用程序
+ 许可[JProfiler 证](https://www.ej-technologies.com/store/jprofiler)
+ 安装数据库客户端和性能分析工具的管理权限
+ AWS Blu Age [3 级认证](https://bluinsights.aws/certification/)
+ 对 AWS Blu Age 框架、生成的代码结构和 Java 编程有中级水平的了解

**限制**

以下优化功能和特性超出此模式的范围：
+ 应用程序层之间的网络延迟优化
+ 通过亚马逊弹性计算云 (Amazon) 实例类型和存储优化实现基础设施级优化 EC2
+ 并发用户负载测试和压力测试

**产品版本**
+ JProfiler 版本 13.0 或更高版本（我们推荐最新版本）
+ pgAdmin 版本 8.14 或更高版本

## 架构
<a name="optimize-performance-aws-blu-age-modernized-application-architecture"></a>

此模式使用 JProfiler 和 pgadmin 等工具为 AWS Blu Age 应用程序设置分析环境。它支持通过 B AWS lu Age APIs 提供的 DAOManager 和 SQLExecution生成器进行优化。

本节剩余部分将详细说明如何识别现代化应用程序的性能热点，并提供相应的优化策略及示例。执行[操作说明](#optimize-performance-aws-blu-age-modernized-application-epics)部分的步骤时，可参考此信息以获取进一步指导。

**识别现代化大型机应用程序中的性能热点**

在现代化大型机应用程序中，*性能热点*是代码中导致严重降速或效率低下的特定区域。这些热点通常是大型机与现代化应用程序之间的架构差异造成的。要识别这些性能瓶颈并优化现代化应用程序的性能，您可以使用三种技术：SQL 日志记录、查询`EXPLAIN`计划和 JProfiler 分析。

*热点识别技术：SQL 日志记录*

现代 Java 应用程序，包括那些使用 AWS Blu Age 实现现代化的应用程序，都具有记录 SQL 查询的内置功能。您可以在 Bl AWS u Age 项目中启用特定的记录器来跟踪和分析应用程序执行的 SQL 语句。这种技术对于识别效率低下的数据库访问模式（例如单个查询过多、数据库调用结构不佳）特别有用，可通过批量处理或改进查询来优化。

要在 AWS Blu Age 现代化应用程序中实现 SQL 日志记录，请将`application.properties`文件中 SQL 语句`DEBUG`的日志级别设置为，以捕获查询执行的详细信息：

```
level.org.springframework.beans.factory.support.DefaultListableBeanFactory : WARN
level.com.netfective.bluage.gapwalk.runtime.sort.internal: WARN
level.org.springframework.jdbc.core.StatementCreatorUtils: DEBUG
level.com.netfective.bluage.gapwalk.rt.blu4iv.dao: DEBUG
level.com.fiserv.signature: DEBUG
level.com.netfective.bluage.gapwalk.database.support.central: DEBUG
level.com.netfective.bluage.gapwalk.rt.db.configuration.DatabaseConfiguration: DEBUG
level.com.netfective.bluage.gapwalk.rt.db.DatabaseInteractionLoggerUtils: DEBUG
level.com.netfective.bluage.gapwalk.database.support.AbstractDatabaseSupport: DEBUG
level.com.netfective.bluage.gapwalk.rt: DEBUG
```

利用记录的数据监控高频和低效的查询，从而确定优化目标。请重点关注批处理过程中的查询，因为它们通常对性能影响最大。

*热点识别技术：查询 EXPLAIN 计划*

此方法使用了关系数据库管理系统的查询规划功能。可以使用不同命令（例如 PostgreSQL 或 MySQL 中的 `EXPLAIN`、Oracle 中的 `EXPLAIN PLAN`）检查您的数据库打算如何运行给定查询。这些命令的输出结果能提供有关查询执行策略的宝贵信息，包括是否会使用索引或执行全表扫描。这些信息对于优化查询性能至关重要，尤其是在适当建立索引能显著缩短执行时间的情况下。

使用特定于您的数据库的 `EXPLAIN` 命令，从应用程序日志中提取重复性最高的 SQL 查询，并分析低效查询的执行路径。以下是 PostgreSQL 数据库的示例。

查询：

```
SELECT * FROM tenk1 WHERE unique1 < 100;
```

`EXPLAIN` 命令：

```
EXPLAIN SELECT * FROM tenk1 where unique1 < 100;
```

输出：

```
Bitmap Heap Scan on tenk1 (cost=5.06..224.98 rows=100 width=244) 
Recheck Cond: (unique1 < 100) 
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=100 width=0)
Index Cond: (unique1 < 100)
```

可以如下所示解释 `EXPLAIN` 输出：
+ 请从最内层开始，按照由内而外的方式阅读 `EXPLAIN` 计划的操作流程（从下至上）。
+ 寻找关键术语。例如，`Seq Scan` 表示全表扫描，`Index Scan` 显示索引使用情况。
+ 检查成本值：第一个数字是启动成本，第二个数字是总成本。
+ 如需预计的输出行数，请参阅 `rows` 值。

在这个示例中，查询引擎使用索引扫描来查找匹配的行，然后仅获取这些行（`Bitmap Heap Scan`）。尽管单行访问的成本更高，但比整表扫描更高效。

`EXPLAIN` 计划输出中的表扫描操作表明缺少索引。优化时需要创建适当的索引。

*热点识别技术： JProfiler 分析*

JProfiler 是一款全面的 Java 分析工具，可通过识别缓慢的数据库调用和 CPU 密集型调用来帮助您解决性能瓶颈。该工具在识别低效的 SQL 查询和内存使用问题方面尤为有效。

查询分析示例：

```
select evt. com.netfective.bluage.gapwalk.rt.blu4iv.dao.Blu4ivTableManager.queryNonTrasactional
```

“ JProfiler 热点” 视图提供以下信息：
+ **时间**列
  + 显示执行总时长（例如 329 秒）
  + 显示占应用程序总时间的百分比（例如 58.7%）
  + 帮助确定最耗时的操作
+ **平均时间**列
  + 显示每次执行的持续时间（例如 2,692 微秒）
  + 表示单个操作的性能
  + 帮助发现运行缓慢的单个操作
+ **事件**列
  + 显示执行次数（例如 122,387 次）
  + 表示操作频率
  + 帮助识别频繁调用的方法

对于结果示例：
+ 高频：122,387 次执行表明存在优化空间
+ 性能隐忧：平均时间为 2,692 微秒表明效率低下
+ 严重影响：占总时间的 58.7% 表明存在重大瓶颈

JProfiler 可以分析应用程序的运行时行为，以揭示通过静态代码分析或 SQL 日志记录可能不明显的热点。这些指标可帮助识别需要优化的操作，并确定最有效的优化策略。有关 JProfiler 功能的更多信息，请参阅[JProfiler 文档](https://www.ej-technologies.com/resources/jprofiler/help/doc/main/introduction.html)。

将这三种技术（SQL 日志记录、查询`EXPLAIN`计划和 JProfiler）结合使用时，可以全面了解应用程序的性能特征。通过识别和解决最关键的性能热点，可以弥合原始大型机应用程序与基于云的现代化系统之间的性能差距。

确定应用程序的性能热点后，可以应用优化策略，我们将在下一节进行相关介绍。

**针对大型机现代化的优化策略**

本节主要概述针对大型机系统中已现代化的应用程序的关键优化策略。它侧重于三种策略：使用现有缓存 APIs、实现有效缓存和优化业务逻辑。

*优化策略：使用现有的 APIs*

AWS Blu Age 提供了几个强大 APIs 的 DAO 接口，你可以用它们来优化性能。两个主要接口—— DAOManager 和 SQLExecution生成器——提供了增强应用程序性能的功能。

**DAOManager**

DAOManager 充当现代化应用程序中数据库操作的主要接口。其中提供多种方法来增强数据库操作和提升应用程序性能，尤其适用于简单的创建、读取、更新和删除（CRUD）操作以及批量处理。
+ **使用 SetMaxResults。**在 DAOManager API 中，您可以使用**SetMaxResults**方法指定在单个数据库操作中要检索的最大记录数。默认情况下，一次只能 DAOManager 检索 10 条记录，这在处理大型数据集时可能会导致多次数据库调用。当您的应用程序需要处理大量记录，并且当前正在发出多个数据库调用来检索这些记录时，请使用此优化。这在批处理场景中特别有用，尤其是在遍历大型数据集时。在以下示例中，左侧代码（优化前）使用默认的数据检索值：10 条记录。右边的代码（优化后）设置**setMaxResults**为一次检索 100,000 条记录。  
![\[使用 SetMaxResults 避免多次数据库调用的示例。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/6b42fafd-1535-416d-8abd-1a5f9007ddba/images/beb9623e-e7a8-45ef-adc6-19a249224b05.png)
**注意**  
请谨慎选择较大的批处理大小并检查对象尺寸，因为此优化会增加内存占用。
+ **替换 SetOnGreatorOrEqual 为 SetOnEqual。**这种优化涉及更改用于设置记录检索条件的方法。该**SetOnGreatorOrEqual**方法检索大于或等于指定值的记录，而仅**SetOnEqual**检索与指定值完全匹配的记录。

  当您知道需要精确匹配并且当前正在使用**SetOnEqual**后面跟着 **readNextEqual()** 的**SetOnGreatorOrEqual**方法时，请按以下代码示例所示使用。这种优化可以减少不必要的数据检索。  
![\[使用 SetOnEqual 根据精确匹配检索记录的示例。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/6b42fafd-1535-416d-8abd-1a5f9007ddba/images/5ce0dac9-f281-4862-a71f-1614493a83f0.png)
+ **使用批量写入和更新操作。**可以使用批量操作将多个写入或更新操作组合成一个数据库事务。这样可以减少数据库调用次数，并显著提高涉及多条记录的操作的性能。

  在以下示例中，左侧代码在一个循环中执行写入操作，这会降低应用程序的性能。可以使用批量写入操作来优化此代码：在 `WHILE` 循环的每次迭代中，将记录添加到批次中，直到批次大小达到预定大小 100。然后，当批次达到预定的批次大小时，您可以将其刷新，然后将剩余的记录刷新到数据库中。这在处理需要更新的大型数据集时尤其有用。  
![\[将多个操作组合成一个数据库事务的示例。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/6b42fafd-1535-416d-8abd-1a5f9007ddba/images/e3bd60d4-06f5-4c1c-9cbd-463f6835a1ba.png)
+ **添加索引。**添加索引属于数据库级别的优化，可以显著提高查询性能。索引可助力数据库快速定位具有特定列值的行，而无需扫描整个表。对 `WHERE` 子句、`JOIN` 条件或 `ORDER BY` 语句中经常使用的列使用索引。在处理大型数据表或需要快速数据检索时，这一点尤为重要。

**SQLExecution生成器**

SQLExecutionBuilder 是一个灵活的 API，您可以使用它来控制将要执行的 SQL 查询，`INSERT`通过使用和使用`SELECT`动态表名仅获取某些列。在以下示例中， SQLExecutorBuilder 使用您定义的自定义查询。

![\[在自定义查询中使用 SQLExecutor Builder 的示例。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/6b42fafd-1535-416d-8abd-1a5f9007ddba/images/364e9fb1-0cbc-47d0-936d-46fb3b48b608.png)


**在 DAOManager 和 SQLExecution生成器之间进行选择**

这两者之间的选择 APIs 取决于您的具体用例：
+  DAOManager 当你希望 AWS Blu Age Runtime 生成 SQL 查询而不是自己编写查询时使用。
+ 当您需要编写 SQL 查询以利用数据库特定的功能或编写最佳 SQL 查询时，请选择 B SQLExecution uilder。

*优化策略：应用缓存技术*

在现代化应用程序中，实施有效的缓存策略可以显著减少数据库调用次数并提高响应速度。这有助于弥合大型机与云环境之间的性能差距。

在 AWS Blu Age 应用程序中，简单的缓存实现使用内部数据结构，例如哈希映射或数组列表，因此您不必设置需要成本和代码重组的外部缓存解决方案。这种方法对经常被访问但变更频率较低的数据特别有效。在实施缓存策略时，请考虑内存限制和更新模式，以确保缓存的数据保持一致并带来实际的性能优势。

成功缓存的关键在于确定要缓存哪些数据。在以下示例中，左侧代码始终从表中读取数据，而右侧代码仅在本地哈希映射中没有给定键的值时才从表中读取数据。`cacheMap` 是一个哈希映射对象，在程序上下文中创建，并在程序上下文的清理方法中清除。

使用以下方法进行缓存 DAOManager：

![\[使用 DAOManager进行缓存优化的示例。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/6b42fafd-1535-416d-8abd-1a5f9007ddba/images/4efd3d22-c694-4f7d-a543-2bed341d1651.png)


使用 SQLExecution生成器缓存：

![\[使用 SQLExecution Builder 进行缓存优化的示例。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/6b42fafd-1535-416d-8abd-1a5f9007ddba/images/c8964804-96eb-4e26-b2bf-8742e62b4c33.png)


*优化策略：业务逻辑优化*

业务逻辑优化的重点是重构从 AWS Blu Age 自动生成的代码，以更好地与现代架构功能保持一致。当生成的代码保持与传统大型机代码相同的逻辑结构时，这就变得必要了，因为这种逻辑结构可能并不适用于现代系统。目标是在保持与原应用程序功能等效性的同时，提高性能。

这种优化方法不限于简单的 API 调整和缓存策略。还涉及更改应用程序处理数据以及与数据库交互的方式。常见的优化措施包括：避免为简单更新执行不必要的读取操作、删除冗余的数据库调用，以及重组数据访问模式，以更好地与现代应用程序架构保持一致。下面是几个示例：
+ **直接在数据库中更新数据。**使用直接 SQL 更新来重构业务逻辑，而不是使用循环进行多项 DAOManager 操作。例如，以下代码（左侧）会进行多次数据库调用，并占用过多内存。具体而言，它在循环中执行多次数据库读写操作，采用逐条更新而非批量处理，且每次迭代都会创建不必要的对象。

  以下经过优化的代码（右侧）仅使用一次直接 SQL 更新操作。具体来说，它使用单个数据库调用（而非多个调用），并且不需要循环，因为所有更新都在单个语句中处理。这种优化提高了性能和资源利用率，并降低了复杂性。它能防止 SQL 注入，提供更好的查询计划缓存，并有助于提高安全性。  
![\[使用直接 SQL 更新而不是循环 DAOManager 操作来重构代码。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/6b42fafd-1535-416d-8abd-1a5f9007ddba/images/7d0a7879-8db2-4cc5-b41c-ee370b3f22e5.png)
**注意**  
始终使用参数化查询来防止 SQL 注入，并确保适当管理事务。
+ **减少冗余的数据库调用。**冗余的数据库调用会严重影响应用程序性能，尤其是在循环中发生时。一种简单但有效的优化技巧是，避免多次重复执行相同的数据库查询。以下代码比较演示了将 `retrieve()` 数据库调用移至循环之外可如何防止重复执行相同的查询，从而提高效率。  
![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/6b42fafd-1535-416d-8abd-1a5f9007ddba/images/da9c15f4-bcf1-4827-b91a-73212fe35cca.png)
+ **使用 SQL `JOIN` 子句减少数据库调用****。**实现 SQLExecution Builder 以最大限度地减少对数据库的调用。 SQLExecutionBuilder 可以更好地控制 SQL 的生成，对于 DAOManager 无法有效处理的复杂查询特别有用。例如，以下代码使用多个 DAOManager 调用：

  ```
  List<Employee> employees = daoManager.readAll();
  for(Employee emp : employees) {
      Department dept = deptManager.readById(emp.getDeptId());  // Additional call for each employee
      Project proj = projManager.readById(emp.getProjId());     // Another call for each employee
      processEmployeeData(emp, dept, proj);
  }
  ```

  优化的代码在 SQLExecution Builder 中使用单个数据库调用：

  ```
  SQLExecutionBuilder builder = new SQLExecutionBuilder();
  builder.append("SELECT e.*, d.name as dept_name, p.name as proj_name");
  builder.append("FROM employee e");
  builder.append("JOIN department d ON e.dept_id = d.id");
  builder.append("JOIN project p ON e.proj_id = p.id");
  builder.append("WHERE e.status = ?", "ACTIVE");
  
  List<Map<String, Object>> results = builder.execute();  // Single database call
  for(Map<String, Object> result : results) {
      processComplexData(result);
  }
  ```

*组合使用优化策略*

这三种策略协同作用： APIs 提供高效数据访问的工具，缓存可减少重复数据检索的需求，业务逻辑优化可确保以最有效的方式使用 APIs 这些工具。定期监控和调整这些优化措施可确保持续提升性能，同时保持现代化应用程序的可靠性和功能。成功的关键在于，了解何时以及如何根据应用程序的特征和性能目标应用每种策略。

## 工具
<a name="optimize-performance-aws-blu-age-modernized-application-tools"></a>
+ [JProfiler](https://www.ej-technologies.com/jprofiler)是一款专为开发人员和性能工程师设计的 Java 分析工具。它分析 Java 应用程序并帮助识别性能瓶颈、内存泄漏和线程问题。 JProfiler 提供 CPU、内存和线程分析以及数据库和 Java 虚拟机 (JVM) 监控，以深入了解应用程序行为。
**注意**  
作为替代方案 JProfiler，你可以使用 [Java Visual](https://visualvm.github.io/) VM。这是适用于 Java 应用程序的免费开源性能分析和监控工具，可实时监控 CPU 使用率、内存消耗、线程管理和垃圾回收统计信息。由于 Java VisualVM 是一个内置的 JDK 工具，因此它比 JProfiler 满足基本分析需求更具成本效益。
+ [pgAdmin](https://www.pgadmin.org/) 是 PostgreSQL 的开源管理和开发工具。它提供了一个图形界面，可帮助您创建、维护和使用数据库对象。可以使用 pgAdmin 执行各种任务，从编写简单的 SQL 查询，到开发复杂的数据库，不一而足。其功能包括：突出显示语法的 SQL 编辑器、服务器端代码编辑器、SQL/Shell/批处理任务的调度代理，以及对 PostgreSQL 所有功能的支持，适合新手和经验丰富的 PostgreSQL 用户。

## 最佳实践
<a name="optimize-performance-aws-blu-age-modernized-application-best-practices"></a>

确定性能热点：
+ 在开始优化之前，记录基准性能指标。
+ 根据业务需求设定明确的绩效改进目标。
+ 进行基准测试时，禁用详细日志记录，因为这可能影响性能。
+ 设置性能测试套件并定期运行。
+ 使用最新版本的 pgAdmin。（旧版本不支持 `EXPLAIN` 查询计划。）
+ 对于基准测试，请在优化完成 JProfiler 后分离，因为这会增加延迟。
+ 对于基准测试，请确保在启动模式（而非调试模式）下运行服务器，因为调试模式会增加延迟。

优化策略：
+ 在`application.yaml`文件中配置**SetMaxResults**值，根据您的系统规格指定大小合适的批次。
+ 根据数据量和内存限制配置**SetMaxResults**值。
+ 更改**SetOnGreatorOrEqual**为 “**SetOnEqual**仅在后续调用时” `.readNextEqual()`。
+ 在批量写入或更新操作中，请单独处理最后一个批次，因为它可能小于配置的批次大小，并且可能会被写入或更新操作遗漏。

缓存：
+ 在 `processImpl` 中引入用于缓存的字段，这些字段会在每次执行时发生变异，应始终在该 `processImpl` 的上下文中定义。也应使用 `doReset()` 或 `cleanUp()` 方法清除这些字段。
+ 实施内存缓存时，请正确调整缓存的大小。存储在内存中的超大缓存会占用所有资源，这可能会影响应用程序的整体性能。

SQLExecution生成器：
+ 对于计划在 SQLExecution Builder 中使用的查询，请使用密钥名称，例如`PROGRAMNAME_STATEMENTNUMBER`。
+ 使用 SQLExecution Builder 时，请务必检查该`Sqlcod`字段。此字段包含一个值，用于指定查询被正确执行，还是否遇到任何错误。
+ 可使用参数化查询防止 SQL 注入。

业务逻辑优化：
+ 重构代码时保持功能等效性，并对相关程序子集进行回归测试和数据库比较。
+ 保留分析快照以供比较。

## 操作说明
<a name="optimize-performance-aws-blu-age-modernized-application-epics"></a>

### 安装 JProfiler 和 pgadmin
<a name="install-jprofiler-and-pgadmin"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装和配置 JProfiler。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/optimize-performance-aws-blu-age-modernized-application.html) | 应用程序开发人员 | 
| 安装和配置 pgAdmin。 | 在此步骤中，您需要安装并配置用于查询数据库的数据库客户端。这种模式使用 PostgreSQL 数据库，并采用 pgAdmin 作为数据库客户端。如果使用的是其他数据库引擎，请依相应数据库客户端的文档操作。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/optimize-performance-aws-blu-age-modernized-application.html) | 应用程序开发人员 | 

### 确定热点
<a name="identify-hotspots"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在您的 AWS Blu Age 应用程序中启用 SQL 查询日志记录。 | 在 Bl AWS u Age 应用程序`application.properties`的文件中启用 SQL 查询日志记录器，如[架构](#optimize-performance-aws-blu-age-modernized-application-architecture)部分所述。 | 应用程序开发人员 | 
| 生成和分析查询 `EXPLAIN` 计划，以确定数据库性能热点。 | 有关详细信息，请参阅[架构](#optimize-performance-aws-blu-age-modernized-application-architecture)一节。 | 应用程序开发人员 | 
| 创建 JProfiler 快照以分析执行缓慢的测试用例。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/optimize-performance-aws-blu-age-modernized-application.html) | 应用程序开发人员 | 
| 分析 JProfiler 快照以确定性能瓶颈。 | 按照以下步骤分析 JProfiler 快照。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/optimize-performance-aws-blu-age-modernized-application.html)有关使用的更多信息 JProfiler，请参阅 “[架构](#optimize-performance-aws-blu-age-modernized-application-architecture)” 部分和[JProfiler 文档](https://www.ej-technologies.com/jprofiler/docs)。 | 应用程序开发人员 | 

### 建立基线
<a name="establish-a-baseline"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在实施优化之前，应先建立性能基准。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/optimize-performance-aws-blu-age-modernized-application.html) | 应用程序开发人员 | 

### 应用优化策略
<a name="apply-optimization-strategies"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 优化读取调用。 | 使用该 DAOManager **SetMaxResults**方法优化数据检索。有关此方法的更多信息，请参阅[架构](#optimize-performance-aws-blu-age-modernized-application-architecture)部分。 | 应用程序开发者， DAOManager | 
| 重构业务逻辑以避免多次调用数据库。 | 使用 SQL `JOIN` 子句减少数据库调用次数。有关详细信息和示例，请参阅[架构](#optimize-performance-aws-blu-age-modernized-application-architecture)部分的*业务逻辑优化*。 | 应用程序开发者、 SQLExecution生成器 | 
| 重构代码，使用缓存来降低读取调用的延迟。 | 有关此技巧的更多信息，请参阅[架构](#optimize-performance-aws-blu-age-modernized-application-architecture)部分的*缓存*。 | 应用程序开发人员 | 
| 重写使用多个 DAOManager 操作进行简单更新操作的低效代码。 | 有关直接在数据库中更新数据的更多信息，请参阅[架构](#optimize-performance-aws-blu-age-modernized-application-architecture)部分的*业务逻辑优化*。 | 应用程序开发人员 | 

### 成本优化策略
<a name="test-optimization-strategies"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在保持功能等效性的同时，以迭代方式验证每项优化更改。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/optimize-performance-aws-blu-age-modernized-application.html)使用基准指标作为参考，可以确保准确衡量每次优化的影响，同时保持系统可靠性。 | 应用程序开发人员 | 

## 问题排查
<a name="optimize-performance-aws-blu-age-modernized-application-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 当您运行现代应用程序时，会看到带 `Query_ID not found` 错误的异常。 | 要解决此问题，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/optimize-performance-aws-blu-age-modernized-application.html) | 
| 您已添加索引，但未见性能提升。 | 请执行以下步骤，确保查询引擎正在使用索引：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/optimize-performance-aws-blu-age-modernized-application.html) | 
| 你遇到了一个 out-of-memory例外。 | 验证代码是否释放了数据结构占用的内存。 | 
| 批量写入操作会导致表中缺少记录 | 查看代码，确保在批处理计数不为零时执行额外的写入操作。 | 
| SQL 日志记录不会显示在应用程序日志中。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/optimize-performance-aws-blu-age-modernized-application.html) | 

## 相关资源
<a name="optimize-performance-aws-blu-age-modernized-application-resources"></a>
+ 使用 [AWS Blu Age 自动重构应用程序](https://docs.aws.amazon.com/m2/latest/userguide/refactoring-m2.html)（*AWS Mainframe Modernization 用户*指南）
+ [pgAdmin 文档](https://www.pgadmin.org/docs/)
+ [JProfiler 文档](https://www.ej-technologies.com/jprofiler/docs)