eclipselink 连接池

Posted

技术标签:

【中文标题】eclipselink 连接池【英文标题】:eclipselink connection pooling 【发布时间】:2013-02-13 16:09:52 【问题描述】:

如果没有在 Eclipse 链接的 persistence.xml 中定义连接池,那么默认行为是什么?

它会为每个事务打开和关闭一个 JDBC 连接吗?它会创建一个具有一些默认值的连接池吗?

【问题讨论】:

您在 persistence.xml 中指定了哪种事务类型? 【参考方案1】:

不使用数据源时 EclipseLink 的默认连接池是最小/最大 32 个连接的池,初始为 1 个连接。所以每个事务都将使用一个池连接,而不是连接/断开连接。

【讨论】:

你是说eclipselink支持连接池,即使persistence.xml文件中没有对池的引用? 是的,这是默认设置(32 个连接池) 这里是配置属性:eclipse.org/eclipselink/documentation/2.4/jpa/extensions/… 我不明白这个。我没有配置任何东西。如果我在很短的时间内启动大量事务,netstation 会向我显示相同数量的处于 TIME_WAIT 状态的 TCP 连接。不应该吗,如果我假设你是对的,那么这里总共限制为 32 个连接??【参考方案2】:

如果您使用应用服务器(Java EE)和容器管理的持久性,那么您需要在应用服务器的管理控制台中设置连接池,并且不需要在持久性中设置池属性。 xml,例如:

<persistence-unit name="myPU" transaction-type="JTA">
  <jta-data-source>jdbc_my_DataSource</jta-data-source>
  <exclude-unlisted-classes>false</exclude-unlisted-classes>
  <shared-cache-mode>NONE</shared-cache-mode>
  <properties/>
</persistence-unit>

如果你使用没有应用服务器(Java SE)的EclipseLink,使用应用管理的持久化,那么如果你不配置池,将使用Internal Connection Pooling,例如:

<persistence-unit name="DemoPU" transaction-type="RESOURCE_LOCAL">
  <properties>
    <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
    <property name="javax.persistence.jdbc.user" value="myuser"/>
    <property name="javax.persistence.jdbc.password" value="mypassword"/>
    <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
  </properties>
</persistence-unit>

【讨论】:

当您指的是应用服务器时,您是指 EE 还是 SE?那么当没有定义连接池时,它为每个 tx 定义一个连接?使用 Spring/Tomcat 的 bean 管理持久性怎么样? Eclipselink 仍然使用连接池,只是它维护池而不是使用数据源。 Eclipselink 内部池在此处wiki.eclipse.org/Configuring_an_Internal_Connection_Pool_(ELUG) 有所描述,要使用的 jpa 持久性属性在此处发布wiki.eclipse.org/EclipseLink/Features/…【参考方案3】:
<property name="eclipselink.connection-pool.default.initial" value="1"/>
<property name="eclipselink.connection-pool.default.min" value="64"/>
<property name="eclipselink.connection-pool.default.max" value="64"/>

【讨论】:

詹姆斯所说的 1/32/32 似乎是正确的(请参阅我在此线程的回答中引用的源代码。)【参考方案4】:

只是想为上面 James 的回答提供代码源:您可以看到在 ServerSession 的构造函数中创建了一个默认连接池,使用 ConnectionPool 中定义的 init/min/max 默认值,并且可以选择由开发人员通过EntityManagerSetupImpl 中的属性覆盖/调整。

【讨论】:

以上是关于eclipselink 连接池的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 EclipseLink 重新连接丢失的连接?

EclipseLink MongoDB 连接

Eclipselink 和 Postgresql 批量编写

同一应用程序中的 JPA/Eclipselink 和 JDBC 连接

JPA + EclipseLink+ HSQLDB 不创建表

EclipseLink - Oracle 存储过程调用新手问题