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:

  1. 在 Java EE 中 - 代码 运行 速度很快(例如,查询大约需要 0.01 秒)
  2. 在 Java SE - 代码 运行s 慢 (2 seconds/query)
  3. 在 Java SE AND Java EE 服务器是 运行ning - 代码 运行s 和第一种情况一样快

有点疑惑;为什么启动 Java EE 服务器会导致代码(运行ning 在不同的 JVM 中)加速?在没有 运行 宁 Java EE 服务器的情况下,我可以做些什么来加速 Java SE 中的查询?

更新

这个问题可能与底层数据库有关。我运行按以下顺序申请

  1. 已启动 Java SE 应用程序 - 查询很慢
  2. 已启动 Java EE 应用程序 - Java SE 应用程序中的查询速度很快
  3. 已停止 Java EE 应用程序 - 在 Java SE 应用程序
  4. 中查询仍然很快

因此,Java EE 应用程序可能会初始化某种数据库缓存(?),但 Java SE 应用程序不会 - 但是我没有看到任何内容日志可能与此相关。

我看到的另一个问题是,这两个应用程序使用不同的数据库驱动程序(这可能会导致一些性能差异,但不能解释为什么同时启动这两个应用程序会导致速度加快...)

终于想通了:

  • 在 JEE 环境中,JPA 自动使用连接池;但在 JSE 环境中,没有可用的连接池
  • 当创建到任何 db2 数据库的连接时,将启动许多代理(例如监控、收集统计信息等);启动(和终止)这些代理大约需要 2 秒(这些代理在 db2 get snapshot on all for database 输出中可见)
  • 当 JEE 运行 时,与 db2 模式保持持久(池化)连接;这样所有代理都是 运行
  • 当使用代理启动 J2SE 应用程序时 运行,创建数据库连接的开销非常小;另一方面,如果没有持久连接可用,这个开销很小

使用 C3PO 加快了查询(连接)速度。