我已经经历了几个问题,this有些相关,但没有回答我的问题。
c3p0 是否有连接池maxPoolSize
确保某个时间的连接数永远不会超过这个限制?如果maxPoolSize=5
并且 10 个用户同时开始使用该应用程序?
我的应用程序。配置
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass"><value>${database.driverClassName}</value>/property>
<property name="jdbcUrl"><value>${database.url}</value></property>
<property name="user"><value>${database.username}</value></property>
<property name="password"><value>${database.password}</value></property>
<property name="initialPoolSize"><value>${database.initialPoolSize}</value>/property>
<property name="minPoolSize"><value>${database.minPoolSize}</value></property>
<property name="maxPoolSize"><value>${database.maxPoolSize}</value></property>
<property name="idleConnectionTestPeriod"><value>200</value></property>
<property name="acquireIncrement"><value>1</value></property>
<property name="maxStatements"><value>0</value></property>
<property name="numHelperThreads"><value>3</value></property>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="dataSource" ref="dataSource"/>
</bean>
区分数据源和连接池很重要。
maxPoolSize 由 c3p0 在 a 上强制执行per-pool基础。但是单个数据源可能拥有多个连接池,因为每组身份验证凭据都有(并且必须有)一个不同的池。如果只是默认的dataSource.getConnection()
方法被调用,那么 maxPoolSize 将是池获取和管理的最大连接数。但是,如果使用获取连接dataSource.getConnection( user, password )
,那么 DataSource 最多可以容纳(maxPoolSize * num_distinct_users)
连接。
回答您的具体问题,如果maxPoolSize
如果 5 和 10 个客户端同时访问 c3p0 数据源,则不超过 5 个客户端首先会获得连接。其余客户将wait()
直到连接返回(或c3p0.checkoutTimeout
已过期)。
一些注意事项:c3p0 强制执行maxPoolSize
如上所述。但不能保证,即使只使用单个每个身份验证池,您偶尔也不会看到超过maxPoolSize
连接已检查。例如,c3p0 异步过期并销毁连接。就 c3p0 而言,一旦连接对客户端不可用并标记为销毁,连接就会消失,而不是在它实际被销毁时。所以,有可能,如果maxPoolSize
是 5,您偶尔会在数据库中观察到 6 个打开的连接。池中将有 5 个连接处于活动状态,而第 6 个连接在等待销毁的队列中但尚未销毁。
您可能会看到意外打开许多连接的另一种情况是,如果您在运行时修改连接池属性。事实上,内部连接池的配置是不可变的。当您在运行时“更改”池参数时,实际发生的情况是使用新配置启动新池,并将旧池置于“wind-down”模式。从旧池中签出的连接仍然有效且有效,但是当它们被签入时,它们就会被销毁。只有当所有旧池连接都已重新签入时,池才真正死亡。
所以,如果你有一个游泳池maxPoolSize
签出连接,然后更改配置参数,您可能会暂时看到高达(2 * maxPoolSize)
,如果在返回从旧池检出的连接之前,新池受到大量流量的影响。实际上,这很少是一个问题,因为动态重新配置并不常见,并且连接检出应该并且通常非常简短,因此旧池连接会迅速消失。但这有可能发生!
我希望这有帮助。
ps acquireIncrement
最好设置大于 1 的值。acquireIncrement
1 表示没有连接提前预取,因此每当负载增加时,某些线程将直接经历连接获取的延迟。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)