`

Spring 配置C3p0连接池的导致的问题

阅读更多

此文转自http://jody.iteye.com/blog/207977

项目遇到了一个瓶胫,当用户访问并发数不大的情况下,系统运行正常,但是当并发数达到一定量的时候,就会出现“无法获取连接,网络适配器断开”

 

首先确定网络是否连接正常。WEB服务器是不是开了防火Q,是否中了ARP之类的病毒。发现都是正常的。

网络和服务器没有问题后,就检查ORACLE数据库,发并连接正常,但是用户会话会有些异常,系统启动时会话量增大,运行中居然变小。

那确定应该是程序的问题。首先将问题锁定在数据库连接管理上。

 

项目中采用的是C3P0连接池来管理数据库连接,系统架构是采用Hibernate+Spring+Strtus实现,由Spring整合C3P0连接池来管理连接。下面是配置文件:

 

Java代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">   
  3. <beans default-lazy-init="true">   
  4.     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">   
  5.         <property name="location">   
  6.             <value>classpath:/database.properties</value>   
  7.         </property>   
  8.     </bean>    
  9.     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">   
  10.         <property name="driverClassName">   
  11.             <value>${jdbc.driverClassName}</value>   
  12.         </property>   
  13.         <property name="url">   
  14.             <value>${jdbc.url}</value>   
  15.         </property>   
  16.         <property name="username">   
  17.             <value>${jdbc.username}</value>   
  18.         </property>   
  19.         <property name="password">   
  20.             <value>${jdbc.password}</value>   
  21.         </property>   
  22.     </bean>   
  23.     <!-- Hibernate SessionFactory -->   
  24.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
  25.         <property name="dataSource">   
  26.             <ref local="dataSource" />   
  27.         </property>   
  28.         <property name="hibernateProperties">   
  29.             <props>   
  30.                 <prop key="hibernate.dialect"> ${hibernate.dialect} </prop>   
  31.                 <prop key="hibernate.show_sql"> ${hibernate.show_sql} </prop>   
  32.                 <prop key="hibernate.c3p0.minPoolSize"> ${hibernate.c3p0.minPoolSize}</prop>   
  33.                 <prop key="hibernate.c3p0.maxPoolSize"> ${hibernate.c3p0.maxPoolSize} </prop>   
  34.                 <prop key="hibernate.c3p0.timeout"> ${hibernate.c3p0.timeout} </prop>   
  35.                 <prop key="hibernate.c3p0.max_statement"> ${hibernate.c3p0.max_statement} </prop>   
  36.                 <prop key="hibernate.cache.provider_class">cn.com.jody.common.framework.hibernate.MemcachedCacheProvider</prop>   
  37.                 <prop key="memcached.servers">192.168.1.0:8888</prop>   
  38.                 <prop key="memcached.server.weights">1</prop>   
  39.                 <prop key="memcached.failover">true</prop>   
  40.                 <prop key="memcached.initConn">10</prop>   
  41.                 <prop key="memcached.minConn">10</prop>   
  42.                 <prop key="memcached.maxConn">50</prop>   
  43.                 <prop key="memcached.maintSleep">30</prop>   
  44.                 <prop key="memcached.nagle">false</prop>   
  45.                 <prop key="memcached.socketTO">3000</prop>   
  46.                 <prop key="memcached.aliveCheck">true</prop>   
  47.                 <prop key="memcached.*">20m</prop>   
  48.                 <prop key="hibernate.cache.use_query_cache">false</prop>   
  49.                 <prop key="hibernate.cache.use_second_level_cache">true</prop>   
  50.                 <prop key="hibernate.jdbc.batch_size">100</prop>   
  51.                 <prop key="hibernate.jdbc.fetch_size">50</prop>   
  52.                 <prop key="hibernate.default_batch_fetch_size">50</prop>   
  53.                 <prop key="hibernate.cache.use_minimal_puts">true</prop>   
  54.                 <prop key="hibernate.connection.release_mode">after_transaction</prop>   
  55.             </props>   
  56.         </property>   
  57.         <property name="mappingDirectoryLocations">   
  58.             <list>   
  59.                 <value>classpath:/ormappings</value>   
  60.             </list>   
  61.         </property>   
  62.     </bean>   
  63.   
  64.     <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->   
  65.     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">   
  66.         <property name="sessionFactory">   
  67.             <ref local="sessionFactory" />   
  68.         </property>   
  69.     </bean>   
  70. </beans>  细细检查发现,原来是上面的配置存在问题。

 

数据源(dataSource)是通过Spring的“org.springframework.jdbc.datasource.DriverManagerDataSource”类通过连接JDBC驱动获取的数据库源。

 

Hibernate的(sessionFactory)是通过Spring的“org.springframework.orm.hibernate3.LocalSessionFactoryBean”来管理的。这个配置中虽然配置了C3P0连接池:

Xml代码 复制代码
  1. <prop key="hibernate.c3p0.minPoolSize"> ${hibernate.c3p0.minPoolSize}</prop>  
  2.                 <prop key="hibernate.c3p0.maxPoolSize"> ${hibernate.c3p0.maxPoolSize} </prop>  
  3.                 <prop key="hibernate.c3p0.timeout"> ${hibernate.c3p0.timeout} </prop>  
  4.                 <prop key="hibernate.c3p0.max_statement"> ${hibernate.c3p0.max_statement} </prop>  

但是却没有作用,对Spring 管理的数据源(dataSource)没有改变。当Hibernate中调用一个sessionFactory时,得到的数据源(dataSource)只是在Spring中通过JDBC驱动获取和数据源。没有通过数据库连接池来管理数据库连接。所以当数据库连接达到一定的数量时,就出现无法获取数据库连接的现像。

 

修改Application.xml配置文件:

 

Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3. <beans default-lazy-init="true">  
  4.     <!-- ========================= RESOURCE DEFINITIONS ========================= -->  
  5.     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  6.         <property name="location" value="classpath:/database.properties"/>  
  7.   
  8.   
  9.     </bean>    
  10.     <!-- Local DataSource that works in any environment -->  
  11.     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">  
  12.         <property name="driverClass" value="${jdbc.driverClassName}"/>  
  13.         <property name="jdbcUrl" value="${jdbc.url}"/>  
  14.         <property name="maxPoolSize" value="${hibernate.c3p0.maxPoolSize}"/>  
  15.         <property name="minPoolSize" value="${hibernate.c3p0.minPoolSize}"/>  
  16.         <property name="idleConnectionTestPeriod" value="30"/>  
  17.         <property name="acquireIncrement" value="5"/>  
  18.         <property name="properties">  
  19.             <props>  
  20.                 <prop key="user">${jdbc.username}</prop>  
  21.                 <prop key="password">${jdbc.password}</prop>  
  22.             </props>  
  23.         </property>  
  24.     </bean>  
  25.     <!-- Hibernate SessionFactory -->  
  26.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  27.         <property name="dataSource">  
  28.             <ref local="dataSource" />  
  29.         </property>  
  30.         <property name="hibernateProperties">  
  31.             <props>  
  32.                 <prop key="hibernate.dialect"> ${hibernate.dialect} </prop>  
  33.                 <prop key="hibernate.show_sql"> ${hibernate.show_sql} </prop>  
  34.   
  35.   
  36.   
  37.   
  38.                 <prop key="hibernate.cache.provider_class">cn.com.jody.common.framework.hibernate.MemcachedCacheProvider</prop>  
  39.                 <prop key="memcached.servers">192.168.1.0:8888</prop>  
  40.                 <prop key="memcached.server.weights">1</prop>  
  41.                 <prop key="memcached.failover">true</prop>  
  42.                 <prop key="memcached.initConn">10</prop>  
  43.                 <prop key="memcached.minConn">10</prop>  
  44.                 <prop key="memcached.maxConn">50</prop>  
  45.                 <prop key="memcached.maintSleep">30</prop>  
  46.                 <prop key="memcached.nagle">false</prop>  
  47.                 <prop key="memcached.socketTO">3000</prop>  
  48.                 <prop key="memcached.aliveCheck">true</prop>  
  49.                 <prop key="memcached.*">20m</prop>  
  50.                 <prop key="hibernate.cache.use_query_cache">false</prop>  
  51.                 <prop key="hibernate.cache.use_second_level_cache">true</prop>  
  52.                 <prop key="hibernate.jdbc.batch_size">100</prop>  
  53.                 <prop key="hibernate.jdbc.fetch_size">50</prop>  
  54.                 <prop key="hibernate.default_batch_fetch_size">50</prop>  
  55.                 <prop key="hibernate.cache.use_minimal_puts">true</prop>  
  56.                 <prop key="hibernate.connection.release_mode">after_transaction</prop>  
  57.             </props>  
  58.         </property>  
  59.                 <property name="mappingDirectoryLocations">  
  60.             <list>  
  61.                 <value>classpath:/orm</value>  
  62.             </list>  
  63.         </property>  
  64.     </bean>  
  65.   
  66.     <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->  
  67.     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  68.         <property name="sessionFactory">  
  69.             <ref local="sessionFactory" />  
  70.         </property>  
  71.     </bean>  
Xml代码 复制代码
  1. </beans>  

 这个配置中,

数据源(dataSource)是通过C3P0的“com.mchange.v2.c3p0.ComboPooledDataSource”类通过连接JDBC驱动获取的数据库源,并且有连接池的管理。

然后,

Hibernate的(sessionFactory)是通过Spring的“org.springframework.orm.hibernate3.LocalSessionFactoryBean”来管理的。这个配置中虽然配置了C3P0连接池:

这样,Spring管理的是C3P0连接池中的连接事务,Hibernate调用的是C3P0连接池中的连接,因为有了连接池的管理,所以当用户并发量大时,在处理上也可以胜任。当然,C3P0也是有一个并发量限制,单机处理并发量问题,还是不现实,集群才是最好的办法。

 

以上是总结项目中的问题。

 

 

 

 

 

 

  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">   

改成

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">  

分享到:
评论

相关推荐

    C3P0连接池配置需要的jar包

    配置C3P0连接池时,开发者通常需要在配置文件(如Hibernate的`hibernate.cfg.xml`或Spring的`applicationContext.xml`)中指定以下参数: - `driver_class`: 数据库驱动类名,例如`com.mysql.jdbc.Driver`。 - `...

    spring + c3p0 连接池

    本示例将深入探讨如何在Spring项目中配置并使用C3P0连接池,以实现高效、稳定的数据库连接管理。 **一、Spring框架简介** Spring是一个开源的Java平台,它简化了企业级应用的开发。Spring的核心特性包括依赖注入...

    spring 配置c3p0

    总结,Spring配置C3P0连接池涉及到添加依赖、在Spring配置文件中定义数据源bean以及配置C3P0的相关参数。通过这种方式,我们可以有效地管理和利用数据库连接,提高系统的稳定性和效率。在实际项目中,还需要根据具体...

    C3P0连接池jar包(正式).zip

    总的来说,C3P0作为一款成熟的数据库连接池,以其丰富的配置选项和稳定的性能,被广泛应用于各种Java企业级应用中。正确地配置和使用C3P0,可以显著提升系统的并发能力和响应速度,同时降低数据库的压力。

    Tomcat统一配置C3P0连接池

    【描述】中的XML配置片段展示了在Spring框架中配置一个通过JNDI查找的数据源,这正是Tomcat统一配置C3P0连接池的一个关键步骤。`&lt;bean id="dataSource2" class="org.springframework.jndi.JndiObjectFactoryBean"&gt;`...

    c3p0连接池jar包以及Spring对c3p0的依赖包

    3. **连接池配置**:C3P0允许通过配置文件灵活设置各种参数,如初始化连接数、最大连接数、最小连接数、超时时间等。 4. **异常处理**:C3P0有完善的异常处理机制,当检测到数据库连接出现问题时,可以自动尝试重连...

    c3p0连接池参数配置

    在配置C3P0连接池时,合理设置参数对于优化数据库访问性能至关重要。 ### 重要参数详解 1. **acquireIncrement**:当连接池中的可用连接数量低于最小阈值时,C3P0会一次性增加此参数指定数量的连接。默认值为3,这...

    C3P0连接池jar包(完整版).zip

    C3P0:数据库连接池技术 步骤: 1.导入jar包 c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar 2.定义配置文件 名称:c3p0.properties 或者 c3p0-config.xml 路径:直接将文件放在src目录下即可 3.创建数据库连接池...

    c3p0连接池

    在实际使用中,我们需要配置C3P0连接池,这可以通过`C3P0连接池配置.txt`文件完成。配置项通常包括: - `minPoolSize`:最小连接数,启动时创建的连接数。 - `maxPoolSize`:最大连接数,超过这个数,应用将无法...

    C3P0连接池jar包

    作为一个连接池,C3P0的主要任务是管理和复用数据库连接,从而避免频繁创建和关闭连接导致的性能损耗。在Java应用中,尤其是在大型的Web应用程序中,C3P0能显著提升系统的运行效率和资源利用率。 C3P0的核心功能...

    C3P0连接池技术.zip

    C3P0连接池就是这样的工具,它允许开发者预配置一定数量的连接,并在需要时分配给应用程序,用完后回收,从而显著提高了系统的响应速度和并发能力。 C3P0连接池的核心功能包括: 1. 连接管理:C3P0能自动检测并...

    c3p0连接池使用所需jar包

    C3P0是一个开源的JDBC连接池...总之,C3P0连接池是Java开发中常用的数据库连接管理工具,正确配置和使用它可以有效提升应用的数据库访问性能。记住引入正确的jar包,并根据项目需求进行适当的配置,是使用C3P0的关键。

    springMVC整合C3P0连接池

    总之,整合SpringMVC和C3P0连接池可以提升应用的数据库操作性能,通过合理配置C3P0参数,可以进一步优化连接池的使用,降低资源消耗。同时,结合Spring的其他组件,如JdbcTemplate,可以简化数据库操作,让代码更易...

    spring_c3p0_配置

    ### Spring与C3P0数据源配置详解 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,它提供了一种全面的方式来构建应用程序。Spring的核心特性包括依赖注入(Dependency Injection, DI)和面向切面编程...

    数据库连接池c3p0jar包

    在本文中,我们将深入探讨C3P0连接池的基本概念、工作原理以及如何在Java项目中配置和使用。 **C3P0简介** C3P0是由David Syer创建的一个开源的JDBC连接池,它的全称是Composed Connection Pool 2000。C3P0的主要...

    引用外部文件配置C3P0连接池.zip

    在Spring框架中,我们可以利用C3P0连接池来管理数据库连接,提升系统的效率。下面我们将详细讲解如何引用外部文件配置C3P0连接池。 首先,我们需要了解C3P0的基本配置参数。C3P0提供了许多可调整的参数,如最小连接...

    c3p0连接池相关包

    C3P0连接池是Java开发中常用的数据库连接池组件,尤其在Spring框架的应用中扮演着重要的角色。它由Mchange公司开发,提供了一种高效、灵活且稳定的数据库连接管理方式,有效地解决了数据库连接资源的分配与回收问题...

Global site tag (gtag.js) - Google Analytics