c3p0 连接池是否确保最大池大小?

2023-11-27

我已经经历了几个问题,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 的值。acquireIncrement1 表示没有连接提前预取,因此每当负载增加时,某些线程将直接经历连接获取的延迟。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c3p0 连接池是否确保最大池大小? 的相关文章

  • c3p0 ResultSet.unwrap 抛出 AbstractMethodError

    我有一个 ResultSet 对象 需要将其转换为 OracleResultSet 以便我可以对其调用 getOPAQUE String 方法 我使用 c3p0 作为我的连接池 问题在于 c3p0 将 ResultSet 包装在 NewPr
  • 对 spring applicationContext.xml 中使用的数据源使用编码密码

    我想在下面提到的 springApplicationContext xml 中保留编码密码 有什么办法可以实现这一点吗 目前我已经使用 property placeholder 配置了所有属性 如下所示 但原始密码仍然在我的database
  • spring 在运行时添加数据源

    我正在开发一个带有每个租户数据库策略的 Spring Boot 多租户应用程序 要求是在运行时添加新数据库 这意味着我必须动态创建新的数据源对象 我还研究了 Spring 的 AbstractRoutingDataSource 但需要预定义
  • 应用程序与数据库驻留连接池

    情况 我需要在 python 中连接到 Oracle 数据库时使用连接池 多个 python 应用程序将使用我开发的辅助连接库 我的思考过程 这里我可以想到两种连接池的方式 1 让连接池由数据库本身维护和管理 由 Oracle 的 DRCP
  • 是否有理由为连接池设置 maxIdle > maxActive ?

    我刚刚学习连接池 我想知道是否有任何理由设置maxIdle gt maxActive 这是我的理解 空闲连接是已创建并等待使用的连接 一旦客户端借用它 它就会成为活动连接 minIdle确定要在池中创建的初始连接数 当客户端尝试使用该池时
  • 关闭还是不关闭 Oracle 连接?

    我的应用程序存在性能问题 因此我开始从根本上调查这个问题 与数据库的连接 最佳实践说 打开连接 使用它并尽快关闭 但我不知道这会导致的开销 所以问题是 1 尽快打开 使用 关闭连接是使用 ODP NET 的最佳方法吗 2 有没有办法以及如何
  • SQL SERVER (express) 中的连接池 - 推荐数量?

    对于我使用连接池的每个应用程序 是否有建议的连接量 我的应用程序在 同一 服务器上使用 ASP NET 和 C 来对抗 sql Express 我有 5 个应用程序正在运行 它们没有被频繁使用 所有连接都打开和关闭 所以我正在考虑将每个应用
  • Jetty 在 JNDI 上下文中绑定数据源

    我想以编程方式将 DataSource 对象绑定到 eclipse jetty 的 JNDI 上下文 我需要用于测试目的 这是我现在的一段代码 server new Server SERVER PORT webAppContext new
  • 如果我使用 Apache::DBI 的 connect_cached(),我应该断开连接吗?

    我的基于 mod perl2 的 Intranet 应用程序使用DBI gt connect cached 据推测被覆盖Apache DBI的版本相同 它通常工作得很好 但就在最近 我们的测试服务器开始出现问题 只有两个用户连接 我们的应用
  • Spring boot + hikari - dataSource 或 dataSourceClassName 或 jdbcUrl 是必需的问题

    尝试启动 Spring 应用程序时出现以下错误 ERROR 5908 main com zaxxer hikari HikariConfig HikariPool 1 dataSource or dataSourceClassName or
  • 为什么 Dictionary 上的这个 Linq 查询不作为数据源工作

    我在VB中有以下内容 Dim sources From source In importSources Select New With Type source Key Source source Value Name dgridSource
  • C3P0:生产中未返回的连接超时?

    参数unreturnedConnectionTimeout给定时间段后未返回的连接超时 我正在尝试决定是否应该在我的制作中使用它persistence xml 使用它的一大优点是连接池将能够从泄漏的连接中恢复 一个很大的缺点是泄漏的连接将很
  • maven tomcat7:运行配置数据源

    我有一个多模块 Maven 项目 我想将它与tomcat7 maven插件并开始 mvn tomcat7 run 但我不知道如何配置 jndi 数据源 我试着把我的pom xml
  • DetailsView 事件“ItemUpdating”中的 OldValues 集合始终为空

    我正在使用DetailsView 但更新时 我无法获取OldValues 因为ItemUpdating 事件的DetailsViewUpdateEventArgs OldValues 始终为空 NewValues 的值正常 注意 我没有在应
  • Bootstrap Typeahead 仅显示第一个字母

    我很难让 Twitter Bootstrap 的 Typeahead 正常工作 Typeahead 仅匹配输入的第一个字母 我在预输入框中的结果看起来像 n n n N N n 我的代码是 有人可以帮忙吗 检查 html 中输出的数据源属性
  • 如何确定c3p0 max_statements

    我想知道如何正确确定 c3p0 max statements 使用什么值 我经历过一些缓存死锁 这似乎指向我的 max statements 配置 基于我读过的所有 SO 问答 我正在使用 mysql 当我进行一些有 4 个活动线程的多线程
  • BIRT 不显示 base64 编码的图像

    我想将图像包含到 BIRT 报告中 图像应由 XML 数据源 base64 编码 给出 但XML数据源不支持Blob数据类型 我找到了一个很好的答案这个 BIRT 问题 https stackoverflow com questions 2
  • 从 Web 容器外部访问数据源(通过 JNDI)

    我正在尝试从容器外部的胖客户端访问 Web 容器 JBoss 中定义的数据源 我决定通过JNDI查找数据源 实际上 我的持久性框架 Ibatis 就是这样做的 执行查询时我总是会收到此错误 java lang IllegalAccessEx
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • Kendo DataSource:如何在获取之前设置过滤器而不发送两个http请求

    环境 剑道版本 2013 1 319 数据源 productsDataSource new kendo data DataSource type odata transport read http www mydomain com odat

随机推荐