项目遇到了一个瓶胫,当用户访问并发数不大的情况下,系统运行正常,但是当并发数达到一定量的时候,就会出现“无法获取连接,网络适配器断开”
首先确定网络是否连接正常。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也是有一个并发量限制,单机处理并发量问题,还是不现实,集群才是最好的办法。
以上是总结项目中的问题。
分享到:
相关推荐
配置C3P0连接池时,开发者通常需要在配置文件(如Hibernate的`hibernate.cfg.xml`或Spring的`applicationContext.xml`)中指定以下参数: - `driver_class`: 数据库驱动类名,例如`com.mysql.jdbc.Driver`。 - `...
本示例将深入探讨如何在Spring项目中配置并使用C3P0连接池,以实现高效、稳定的数据库连接管理。 **一、Spring框架简介** Spring是一个开源的Java平台,它简化了企业级应用的开发。Spring的核心特性包括依赖注入...
总结,Spring配置C3P0连接池涉及到添加依赖、在Spring配置文件中定义数据源bean以及配置C3P0的相关参数。通过这种方式,我们可以有效地管理和利用数据库连接,提高系统的稳定性和效率。在实际项目中,还需要根据具体...
【描述】中的XML配置片段展示了在Spring框架中配置一个通过JNDI查找的数据源,这正是Tomcat统一配置C3P0连接池的一个关键步骤。`<bean id="dataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">`...
3. **连接池配置**:C3P0允许通过配置文件灵活设置各种参数,如初始化连接数、最大连接数、最小连接数、超时时间等。 4. **异常处理**:C3P0有完善的异常处理机制,当检测到数据库连接出现问题时,可以自动尝试重连...
总的来说,C3P0作为一款成熟的数据库连接池,以其丰富的配置选项和稳定的性能,被广泛应用于各种Java企业级应用中。正确地配置和使用C3P0,可以显著提升系统的并发能力和响应速度,同时降低数据库的压力。
在配置C3P0连接池时,合理设置参数对于优化数据库访问性能至关重要。 ### 重要参数详解 1. **acquireIncrement**:当连接池中的可用连接数量低于最小阈值时,C3P0会一次性增加此参数指定数量的连接。默认值为3,这...
总之,整合SpringMVC和C3P0连接池可以提升应用的数据库操作性能,通过合理配置C3P0参数,可以进一步优化连接池的使用,降低资源消耗。同时,结合Spring的其他组件,如JdbcTemplate,可以简化数据库操作,让代码更易...
在实际使用中,我们需要配置C3P0连接池,这可以通过`C3P0连接池配置.txt`文件完成。配置项通常包括: - `minPoolSize`:最小连接数,启动时创建的连接数。 - `maxPoolSize`:最大连接数,超过这个数,应用将无法...
作为一个连接池,C3P0的主要任务是管理和复用数据库连接,从而避免频繁创建和关闭连接导致的性能损耗。在Java应用中,尤其是在大型的Web应用程序中,C3P0能显著提升系统的运行效率和资源利用率。 C3P0的核心功能...
C3P0连接池就是这样的工具,它允许开发者预配置一定数量的连接,并在需要时分配给应用程序,用完后回收,从而显著提高了系统的响应速度和并发能力。 C3P0连接池的核心功能包括: 1. 连接管理:C3P0能自动检测并...
C3P0是一个开源的JDBC连接池...总之,C3P0连接池是Java开发中常用的数据库连接管理工具,正确配置和使用它可以有效提升应用的数据库访问性能。记住引入正确的jar包,并根据项目需求进行适当的配置,是使用C3P0的关键。
### Spring与C3P0数据源配置详解 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,它提供了一种全面的方式来构建应用程序。Spring的核心特性包括依赖注入(Dependency Injection, DI)和面向切面编程...
在本文中,我们将深入探讨C3P0连接池的基本概念、工作原理以及如何在Java项目中配置和使用。 **C3P0简介** C3P0是由David Syer创建的一个开源的JDBC连接池,它的全称是Composed Connection Pool 2000。C3P0的主要...
在Spring框架中,我们可以利用C3P0连接池来管理数据库连接,提升系统的效率。下面我们将详细讲解如何引用外部文件配置C3P0连接池。 首先,我们需要了解C3P0的基本配置参数。C3P0提供了许多可调整的参数,如最小连接...
下面将详细介绍C3P0连接池的一些关键参数配置。 1. **初始化参数**: - `initialPoolSize`: 连接池启动时创建的初始连接数。设置合适的值可以避免启动时的延迟。 - `minPoolSize`: 连接池的最小连接数,即使在...
C3P0连接池是Java开发中常用的数据库连接池组件,尤其在Spring框架的应用中扮演着重要的角色。它由Mchange公司开发,提供了一种高效、灵活且稳定的数据库连接管理方式,有效地解决了数据库连接资源的分配与回收问题...