【问题标题】:EntityManager JDBC connection usageEntityManager JDBC 连接使用
【发布时间】:2015-09-24 02:14:24
【问题描述】:
@PersistenceContext(unitName = "myPU")
private EntityManager em;

    public void run1()
    {
       // uses em
    }
    public void run2()
    {
       // uses em
    }

据我了解,每种方法代表不同的交易。
我很难弄清楚等价物是什么
可以使用普通 JDBC 的代码,尤其是在 JDBC 连接使用方面。

提交是否在每个方法结束时发出?
是否为每种方法创建并关闭了新连接?
实现可以使用连接池是什么意思?

【问题讨论】:

  • 为什么要将 JDBC 与 EntityManager 一起使用?顾名思义,EntityManager 显式地管理实体。您不必担心 JDBC,底层 JPA 提供程序(例如 Hibernate)将为您完成数据库工作。也许您可以详细说明您正在尝试实现的目标和尝试过的目标。了解您查阅过哪些文档也很有用。
  • 由于您使用了“ejb”标签,我假设这些方法在 SLSB 中并且事务属性是默认的 (REQUIRED)。对吗?
  • @Brian 是,@DuncanKinnear 我不想混合使用 JPA 和 JDBC,我想对它如何使用 JDBC 连接有一个高层次的了解,因为我使用这个概念。
  • 如果您正在调查它在幕后所做的事情,请打开您的 JPA 提供程序的日志并查看。大多数人会在更精细的日志级别记录他们发出的语句,从而准确地向您展示您的配置选项在 JDBC 世界中转换为什么。

标签: java jpa ejb persistence


【解决方案1】:

在大多数情况下:这取决于。

在您的情况下,如果在不同的事务中调用这些方法,您将获得每个 bean 的 EntityManager

通常SQL连接的获取是惰性的。因此,当EntityManager 第一次需要连接时,它将从您配置的池中获取一个。然后容器确保连接对其他事务不可用。事务完成后,commitrollback 等事务操作也由容器管理。

commit 是否在每个方法结束时发出?

不,在每笔交易结束时。如果您的方法开始新事务,那么可以。

是否为每个方法创建和关闭了新连接?

这里也一样。如果一个事务正在进行中并且之前已经使用过来自同一个池的连接,那么它将被重用。否则你不会在其他一些操作中看到你自己的变化。如果您的方法启动新事务,那么是的,您将获得新连接(通常只是池连接周围的新包装器实例以减少连接/断开连接开销),并且无论结果如何,它们都会在事务结束时释放。

实现可以使用连接池是什么意思?

我想我不完全理解你的问题。

根据您的容器,您通常会处理连接池。在您的情况下,EntityManager 也是如此。

连接池是一种重复使用相同物理连接的方法,如前所述,可以减少连接/断开连接开销。

如果还有什么不清楚的地方请告诉我。

【讨论】:

    猜你喜欢
    • 2015-03-25
    • 1970-01-01
    • 2017-04-11
    • 2013-11-19
    • 2017-06-18
    • 2015-09-14
    • 2018-01-09
    • 2013-05-09
    • 2013-04-13
    相关资源
    最近更新 更多