Java SE 中的 JPA 与 Java EE 性能
JPA in Java SE vs Java EE performance
我在 Java SE (Oracle Java 7) 和 Java EE (Websphere Liberty) 环境中使用 JPA/Eclipselink。
我有一个从 Java SE 和 Java EE 调用的组件(组件我指的是相同的源代码),它执行 JPA 查询。
(Java SE 运行 以 -javaagent:lib/eclipselink.jar
参数开始)
我进行了 3 次测试 运行s:
- 在 Java EE 中 - 代码 运行 速度很快(例如,查询大约需要 0.01 秒)
- 在 Java SE - 代码 运行s 慢 (2 seconds/query)
- 在 Java SE AND Java EE 服务器是 运行ning - 代码 运行s 和第一种情况一样快
有点疑惑;为什么启动 Java EE 服务器会导致代码(运行ning 在不同的 JVM 中)加速?在没有 运行 宁 Java EE 服务器的情况下,我可以做些什么来加速 Java SE 中的查询?
更新
这个问题可能与底层数据库有关。我运行按以下顺序申请
- 已启动 Java SE 应用程序 - 查询很慢
- 已启动 Java EE 应用程序 - Java SE 应用程序中的查询速度很快
- 已停止 Java EE 应用程序 - 在 Java SE 应用程序
中查询仍然很快
因此,Java EE 应用程序可能会初始化某种数据库缓存(?),但 Java SE 应用程序不会 - 但是我没有看到任何内容日志可能与此相关。
我看到的另一个问题是,这两个应用程序使用不同的数据库驱动程序(这可能会导致一些性能差异,但不能解释为什么同时启动这两个应用程序会导致速度加快...)
终于想通了:
- 在 JEE 环境中,JPA 自动使用连接池;但在 JSE 环境中,没有可用的连接池
- 当创建到任何 db2 数据库的连接时,将启动许多代理(例如监控、收集统计信息等);启动(和终止)这些代理大约需要 2 秒(这些代理在
db2 get snapshot on all for database
输出中可见)
- 当 JEE 运行 时,与 db2 模式保持持久(池化)连接;这样所有代理都是 运行
- 当使用代理启动 J2SE 应用程序时 运行,创建数据库连接的开销非常小;另一方面,如果没有持久连接可用,这个开销很小
使用 C3PO 加快了查询(连接)速度。
我在 Java SE (Oracle Java 7) 和 Java EE (Websphere Liberty) 环境中使用 JPA/Eclipselink。
我有一个从 Java SE 和 Java EE 调用的组件(组件我指的是相同的源代码),它执行 JPA 查询。
(Java SE 运行 以 -javaagent:lib/eclipselink.jar
参数开始)
我进行了 3 次测试 运行s:
- 在 Java EE 中 - 代码 运行 速度很快(例如,查询大约需要 0.01 秒)
- 在 Java SE - 代码 运行s 慢 (2 seconds/query)
- 在 Java SE AND Java EE 服务器是 运行ning - 代码 运行s 和第一种情况一样快
有点疑惑;为什么启动 Java EE 服务器会导致代码(运行ning 在不同的 JVM 中)加速?在没有 运行 宁 Java EE 服务器的情况下,我可以做些什么来加速 Java SE 中的查询?
更新
这个问题可能与底层数据库有关。我运行按以下顺序申请
- 已启动 Java SE 应用程序 - 查询很慢
- 已启动 Java EE 应用程序 - Java SE 应用程序中的查询速度很快
- 已停止 Java EE 应用程序 - 在 Java SE 应用程序 中查询仍然很快
因此,Java EE 应用程序可能会初始化某种数据库缓存(?),但 Java SE 应用程序不会 - 但是我没有看到任何内容日志可能与此相关。
我看到的另一个问题是,这两个应用程序使用不同的数据库驱动程序(这可能会导致一些性能差异,但不能解释为什么同时启动这两个应用程序会导致速度加快...)
终于想通了:
- 在 JEE 环境中,JPA 自动使用连接池;但在 JSE 环境中,没有可用的连接池
- 当创建到任何 db2 数据库的连接时,将启动许多代理(例如监控、收集统计信息等);启动(和终止)这些代理大约需要 2 秒(这些代理在
db2 get snapshot on all for database
输出中可见) - 当 JEE 运行 时,与 db2 模式保持持久(池化)连接;这样所有代理都是 运行
- 当使用代理启动 J2SE 应用程序时 运行,创建数据库连接的开销非常小;另一方面,如果没有持久连接可用,这个开销很小
使用 C3PO 加快了查询(连接)速度。