应用程序现代化开发人员必须能够精确地了解应用程序内部的数据库操作和事务处理过程。 Tackle-DiVA(数据密集型有效性分析器)是 Konveyor Tackle 项目中的一个以数据为中心的开源 Java 应用程序分析工具,旨在将应用程序重构到 Kubernetes。
本文概述了 Tackle-DiVA,并提供了示例说明和分析结果。
什么是 Tackle-DiVA?
Tackle-DiVA 使用 Java 和 Python 构建,并通过命令行界面操作。它导入目标 Java 应用程序源文件,并将分析结果作为文件提供。

(Yasuharu Katsuno,CC BY-SA 4.0)
分解此图表
- 服务入口清单分析提取用于实现公共 API 的 Java 类列表。
- 数据库清单分析导出应用程序操作的数据库表列表。
- 事务清单 提取一组事务处理过程。
- 代码到数据库的依赖关系分析哪个 Java 类操作哪个数据库表。
- 数据库到数据库和 事务到事务的依赖关系分析找到转换并行执行的线索。
- 最后,事务重构建议分析显示来自原始顺序执行的并行可执行事务。
试用一下!
Tackle-DiVA 入门很容易。它充分利用了 Docker 容器,唯一的前提条件是可运行 Docker 的环境,例如 RedHat Enterprise Linux、Ubuntu 或 macOS。
一旦您的机器上安装了 Docker,请运行
$ cd /tmp
$ git clone https://github.com/konveyor/tackle-diva.git && tackle-diva
$ docker build . -t diva
这将构建 Tackle-DiVA 并将其打包为 Docker 镜像。Tackle-DiVA 现在可以在您的机器上使用了。
下一步是准备目标 Java 应用程序的源代码。我将使用 DayTrader 应用程序作为示例
$ cd /tmp
$ git clone https://github.com/WASdev/sample.daytrader7.git
最后一步是通过附加完整目录路径来执行 diva_docker
命令
$ cd /tmp/tackle-diva/distrib/bin/
$ ./diva_docker /tmp/sample.daytrader7/
这将创建 tackle-diva/distrib/output
目录并存储分析结果文件
$ ls /tmp/tackle-diva/distrib/output
contexts.yml transaction.json transaction_summary.dot
database.json transaction.yml transaction_summary.pdf
探索分析结果
查看 DayTrader 应用程序的一些分析结果。
服务入口清单结果存储在 contexts.yml
文件中。它发现 TradeAppServlet.init class/method
在 login
和 register
操作的服务入口中起着关键作用
- entry:
methods:
- "com.ibm.websphere.samples.daytrader.web.TradeAppServlet.init"
http-param:
action:
- "login"
- entry:
methods:
- "com.ibm.websphere.samples.daytrader.web.TradeAppServlet.init"
http-param:
action:
- "register"
数据库清单分析在 database.json
文件中导出六个数据库表。这些表在 DayTrader 应用程序中使用
{
"/app": [
"orderejb",
"holdingejb",
"quoteejb",
"accountejb",
"keygenejb",
"accountprofileejb"
]
}
事务清单分析结果被转储到 transaction.json
和 .yml
文件中,但查看事务时最好查看 transaction_summary.pdf
文件。以下事务由对两个数据库表(holdingejb
和 orderejb
)的六个 SQL 操作组成:

(Yasuharu Katsuno,CC BY-SA 4.0)
transaction.json
和 .yml
文件还包含 代码到数据库的依赖关系分析结果。以下显示了 TradeDirect 类如何调用查询操作到两个数据库表,accountprofileejb
和 accountejb
"stacktrace" : [
...
{
"method" : "<src-method: < Source,
Lcom/ibm/websphere/samples/daytrader/direct/TradeDirect,
getStatement(Ljava/sql/Connection;Ljava/lang/String;)
Ljava/sql/PreparedStatement; >>",
"file" : "/app/daytrader-ee7-ejb/src/
main/java/com/ibm/websphere/
samples/daytrader/direct/TradeDirect.java",
"position" : "TradeDirect.java [1935:15] -> [1935:41]"
}
],
"sql" : "select * from accountprofileejb ap where ap.userid = (
select profile_userid from accountejb a where a.profile_userid=?)"
数据库到数据库的依赖关系分析结果位于 transaction_summary.dot
和 .pdf
文件中。accoutprofileejb
和 accoutejb
数据库表具有互查关系

(Yasuharu Katsuno,CC BY-SA 4.0)
事务到事务的依赖关系分析结果在 transaction_summary.dot
和 .pdf
文件中找到。两个事务对 orderejb
数据库表具有依赖关系。上层事务更新表,下层事务查询表

(Yasuharu Katsuno,CC BY-SA 4.0)
最后,并行可执行事务显示在 transaction_summary.dot
和 .pdf
文件中,这是 事务重构建议分析的结果。在本例中,下半部分的两个事务可以在上半部分事务处理完成后并行执行,这有助于保持数据一致性,因为没有事务依赖关系

(Yasuharu Katsuno,CC BY-SA 4.0)
了解更多
要了解有关应用程序重构的更多信息,请查看 Konveyor Tackle 站点,加入社区,并访问 GitHub 上的源代码。
评论已关闭。