EclipseLink连接池技术

19
如果在Eclipse Link的persistence.xml中没有定义连接池,那么默认行为是什么?
它会为每个事务打开和关闭一个JDBC连接吗?它会创建一个具有某些默认值的连接池吗?

你在 persistence.xml 文件中指定了哪种事务类型? - MRalwasser
4个回答

13

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


你是在说 eclipselink 支持连接池,即使在 persistence.xml 文件中没有关于连接池的引用吗? - user1796571
是的,这是默认设置(32个连接池)。 - James
1
以下是配置属性:http://eclipse.org/eclipselink/documentation/2.4/jpa/extensions/p_connection_pool.htm - eskatos
我不理解这个。我没有配置任何东西。如果我在很短的时间内启动了很多事务,netstation会显示相同数量的处于TIME_WAIT状态的TCP连接。如果我假设你是正确的,那么它不应该在这里限制为总共32个连接吗? - col.panic

7
如果您使用应用程序服务器(Java EE)和容器管理的持久性,则需要在应用程序服务器的管理控制台中设置连接池,并且不需要在persistence.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,并且使用应用程序管理的持久性,则如果您不配置池,则会使用内部连接池,例如:

<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管理的持久性如何? - user1796571
3
Eclipselink仍然使用连接池,只是它维护池而不使用数据源。关于Eclipselink内部池的描述可以在这里找到:http://wiki.eclipse.org/Configuring_an_Internal_Connection_Pool_(ELUG),可用的JPA持久性属性可以在这里找到:http://wiki.eclipse.org/EclipseLink/Features/JPA#EntityManagerFactory_Properties。 - Chris

2
<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 正如詹姆斯所说,看我在这个帖子中引用的源代码,是正确的。 - Glen Mazza

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接