`

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

    博客分类:
  • SSH
阅读更多

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

 

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

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

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

 

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

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-lazy-init="true">
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
            <value>classpath:/database.properties</value>
        </property>
    </bean> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>${jdbc.driverClassName}</value>
        </property>
        <property name="url">
            <value>${jdbc.url}</value>
        </property>
        <property name="username">
            <value>${jdbc.username}</value>
        </property>
        <property name="password">
            <value>${jdbc.password}</value>
        </property>
    </bean>
	<!-- Hibernate SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref local="dataSource" />
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect"> ${hibernate.dialect} </prop>
                <prop key="hibernate.show_sql"> ${hibernate.show_sql} </prop>
                <prop key="hibernate.c3p0.minPoolSize"> ${hibernate.c3p0.minPoolSize}</prop>
                <prop key="hibernate.c3p0.maxPoolSize"> ${hibernate.c3p0.maxPoolSize} </prop>
                <prop key="hibernate.c3p0.timeout"> ${hibernate.c3p0.timeout} </prop>
                <prop key="hibernate.c3p0.max_statement"> ${hibernate.c3p0.max_statement} </prop>
                <prop key="hibernate.cache.provider_class">cn.com.jody.common.framework.hibernate.MemcachedCacheProvider</prop>
                <prop key="memcached.servers">192.168.1.0:8888</prop>
                <prop key="memcached.server.weights">1</prop>
                <prop key="memcached.failover">true</prop>
                <prop key="memcached.initConn">10</prop>
                <prop key="memcached.minConn">10</prop>
                <prop key="memcached.maxConn">50</prop>
                <prop key="memcached.maintSleep">30</prop>
                <prop key="memcached.nagle">false</prop>
                <prop key="memcached.socketTO">3000</prop>
                <prop key="memcached.aliveCheck">true</prop>
                <prop key="memcached.*">20m</prop>
                <prop key="hibernate.cache.use_query_cache">false</prop>
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.jdbc.batch_size">100</prop>
                <prop key="hibernate.jdbc.fetch_size">50</prop>
                <prop key="hibernate.default_batch_fetch_size">50</prop>
                <prop key="hibernate.cache.use_minimal_puts">true</prop>
                <prop key="hibernate.connection.release_mode">after_transaction</prop>
            </props>
        </property>
        <property name="mappingDirectoryLocations">
            <list>
                <value>classpath:/ormappings</value>
            </list>
        </property>
    </bean>

	<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref local="sessionFactory" />
        </property>
    </bean>
</beans>

 

 细细检查发现,原来是上面的配置存在问题。

 

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

 

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

<prop key="hibernate.c3p0.minPoolSize"> ${hibernate.c3p0.minPoolSize}</prop>
                <prop key="hibernate.c3p0.maxPoolSize"> ${hibernate.c3p0.maxPoolSize} </prop>
                <prop key="hibernate.c3p0.timeout"> ${hibernate.c3p0.timeout} </prop>
                <prop key="hibernate.c3p0.max_statement"> ${hibernate.c3p0.max_statement} </prop>

 

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

 

修改Application.xml配置文件:

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-lazy-init="true">
	<!-- ========================= RESOURCE DEFINITIONS ========================= -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:/database.properties"/>


    </bean> 
	<!-- Local DataSource that works in any environment -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClassName}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="maxPoolSize" value="${hibernate.c3p0.maxPoolSize}"/>
        <property name="minPoolSize" value="${hibernate.c3p0.minPoolSize}"/>
        <property name="idleConnectionTestPeriod" value="30"/>
        <property name="acquireIncrement" value="5"/>
        <property name="properties">
            <props>
                <prop key="user">${jdbc.username}</prop>
                <prop key="password">${jdbc.password}</prop>
            </props>
        </property>
    </bean>
	<!-- Hibernate SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref local="dataSource" />
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect"> ${hibernate.dialect} </prop>
                <prop key="hibernate.show_sql"> ${hibernate.show_sql} </prop>




                <prop key="hibernate.cache.provider_class">cn.com.jody.common.framework.hibernate.MemcachedCacheProvider</prop>
                <prop key="memcached.servers">192.168.1.0:8888</prop>
                <prop key="memcached.server.weights">1</prop>
                <prop key="memcached.failover">true</prop>
                <prop key="memcached.initConn">10</prop>
                <prop key="memcached.minConn">10</prop>
                <prop key="memcached.maxConn">50</prop>
                <prop key="memcached.maintSleep">30</prop>
                <prop key="memcached.nagle">false</prop>
                <prop key="memcached.socketTO">3000</prop>
                <prop key="memcached.aliveCheck">true</prop>
                <prop key="memcached.*">20m</prop>
                <prop key="hibernate.cache.use_query_cache">false</prop>
                <prop key="hibernate.cache.use_second_level_cache">true</prop>
                <prop key="hibernate.jdbc.batch_size">100</prop>
                <prop key="hibernate.jdbc.fetch_size">50</prop>
                <prop key="hibernate.default_batch_fetch_size">50</prop>
                <prop key="hibernate.cache.use_minimal_puts">true</prop>
                <prop key="hibernate.connection.release_mode">after_transaction</prop>
            </props>
        </property>
		        <property name="mappingDirectoryLocations">
            <list>
                <value>classpath:/orm</value>
            </list>
        </property>
    </bean>

	<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref local="sessionFactory" />
        </property>
    </bean>
</beans>

 这个配置中,

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

然后,

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

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

 

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

分享到:
评论
8 楼 cuilji 2010-06-07  
受教了,谢谢!
7 楼 filix 2009-08-07  
我转载了哦。
6 楼 filix 2009-08-07  
我很看好你哦。文章写的真棒!
5 楼 tianhaoleng 2008-08-24  
我只是想测试下javaeye的评论功能实现。
4 楼 lilei9963 2008-08-14  
我也有同样的问题,但是,我的配置是和你第二次正确的配置一样,出现这个原因是因为大久时间没有人访问系统,然后就会和数据库断开连接了.如果三至五小时没人访问,就会出现上面出现的问题.
3 楼 tvjody 2008-07-16  
人过留言,雁过拔毛
2 楼 tvjody 2008-07-16  
不是吧~~你~~~~~
1 楼 tianhaoleng 2008-07-10  
我只是想测试下javaeye的评论功能实现。

相关推荐

    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的相关参数。通过这种方式,我们可以有效地管理和利用数据库连接,提高系统的稳定性和效率。在实际项目中,还需要根据具体...

    Tomcat统一配置C3P0连接池

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

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

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

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

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

    c3p0连接池参数配置

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

    springMVC整合C3P0连接池

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

    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的关键。

    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连接池的一些关键参数配置。 1. **初始化参数**: - `initialPoolSize`: 连接池启动时创建的初始连接数。设置合适的值可以避免启动时的延迟。 - `minPoolSize`: 连接池的最小连接数,即使在...

    c3p0连接池相关包

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

Global site tag (gtag.js) - Google Analytics