论坛首页 Java企业应用论坛

spring+hibernate配置c3p0无法释放数据库连接

浏览 44578 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-07  
voff12 写道
还是得看源代码,以求彻底解决此问题。
如果c3p0起作用的话:
tomcat起动后,打开浏览页后,可以看到设定的5个最小5个连接数(MySQL Adminstator观察)出现。

而且可以用Jprofire检测到c3p0包的使用情况:

当用户增加多时,数据库最大的连接数增到20后,连接数不再增加。



写一个测试用的页面,每秒刷新N次。。。
之后再看。。。内存。。。
如果还长。。。那就是缓存的问题了。。。
如果不长。。。再看代码也来的急。。。。代码想要看一遍会死人的。
0 请登录后投票
   发表时间:2007-06-07  
tonyyl 写道
hibernate.connection.provider_class=C3p0ConnectionProvider,这样就该行了

谢谢,不过还是不行。谢谢抛出。
不知道c3p0是不是在中间。spring的位置在那里?datasource的位置在那里?
hibernate--> c3p0 -->jdbc
spring --> hibernate -->c3p0 -->jdbc?
0 请登录后投票
   发表时间:2007-07-04  
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
            <value>com.mysql.jdbc.Driver</value>
        </property>
<property name="jdbcUrl">
            <value>jdbc:mysql://localhost/auction</value>
        </property>
<property name="user">
            <value>root</value>
        </property>
<property name="password">
            <value>123456</value>
        </property>
<property name="maxPoolSize">
            <value>40</value>
        </property>
<property name="minPoolSize">
            <value>1</value>
        </property>
<property name="initialPoolSize">
            <value>1</value>
        </property>
<property name="maxIdleTime">
            <value>20</value>
        </property>
</bean>

    <!--定义了Hibernate的SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref local="dataSource"/>
        </property>
        <property name="mappingResources">
            <list>
<value>AuctionUser.hbm.xml</value>
<value>Bid.hbm.xml</value>
<value>Item.hbm.xml</value>
<value>Kind.hbm.xml</value>
<value>State.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.jdbc.batch_size">20</prop>
            </props>
        </property>
    </bean>
0 请登录后投票
   发表时间:2007-07-04  
没有问题
0 请登录后投票
   发表时间:2007-09-04  
个人认为c3p0本身可能存在一定的问题,
我的应用有时候会抛出一个
java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
0 请登录后投票
   发表时间:2007-09-10  
#     public ArrayList showblog(int firstRow,int maxRow,int caid,String bauthor){  
#         List   list=new   ArrayList();     
#   
#           Session   session  =  getHibernateTemplate().getSessionFactory().openSession();     
#           Query   query   =session.createQuery("from Blog where cateid='"+caid+"' and bauthor ='"+bauthor+"' order by blogid desc");     
#           query.setFirstResult(firstRow);     
#           query.setMaxResults(maxRow);     
#           list=query.list();    
#           session.flush();  
#           session.close();  
#           return   (ArrayList) list;  
#     }  
#   


有可能是这段代码的问题。这种直接取出session然后执行的代码在关闭连接方面好像有问题。你把你的代码替换成getHibernateTemplate().XXX()这样,使用Template的方法来实现。看看连接数是否还会有问题。(你原本的连接池配置没有多大问题)

我最近也有过这种问题,最开始是
		Criteria criteria = getSession().createCriteria(getPersistentClass())
				.add(Example.create(exampleInstance));

		try {
			Map<Object, Object> propertyMap;
			propertyMap = BeanUtils.describe(exampleInstance);
			if (propertyMap.containsKey("id") && propertyMap.get("id") != null) {
				criteria.add(Expression.idEq(new Integer((String)propertyMap.get("id"))));
			}
		} catch (Exception e) {
			logger.error("describe bean Exception : ", e);
		}

		int totalCount = (Integer) criteria.setProjection(
				Projections.rowCount()).uniqueResult();
		criteria.setProjection(null);

		if (totalCount < 1) {
			return new Page();
		}

		int startIndex = Page.getStartOfPage(pageNo, pageSize);
		List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize)
				.list();


出现跟你一样的问题,后来换成了

		DetachedCriteria criteria = DetachedCriteria.forClass(
				getPersistentClass()).add(Example.create(exampleInstance));

		try {
			Map<Object, Object> propertyMap;
			propertyMap = BeanUtils.describe(exampleInstance);
			if (propertyMap.containsKey("id") && propertyMap.get("id") != null) {
				criteria.add(Expression.idEq(new Integer((String) propertyMap
						.get("id"))));
			}
		} catch (Exception e) {
			logger.error("describe bean Exception : ", e);
		}

		int totalCount = (Integer) getHibernateTemplate().findByCriteria(
				criteria.setProjection(Projections.rowCount())).get(0);

		criteria.setProjection(null);

		if (totalCount < 1) {
			return new Page();
		}

		int startIndex = Page.getStartOfPage(pageNo, pageSize);
		List list = getHibernateTemplate().findByCriteria(criteria,startIndex,pageSize);



问题解决。

最后附上我的连接池配置

	<bean id="DataSource"
		class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass">
			<value>${jdbc.driver}</value>
		</property>
		<property name="jdbcUrl">
			<value>${jdbc.url}</value>
		</property>
		<property name="user">
			<value>${jdbc.username}</value>
		</property>
		<property name="password">
			<value>${jdbc.password}</value>
		</property>
		<property name="initialPoolSize">
			<value>${c3p0.initialPoolSize}</value>
		</property>
		<property name="minPoolSize">
			<value>${c3p0.minPoolSize}</value>
		</property>
		<property name="maxPoolSize">
			<value>${c3p0.maxPoolSize}</value>
		</property>
		<property name="acquireIncrement">
			<value>${c3p0.acquireIncrement}</value>
		</property>
		<property name="maxIdleTime">
			<value>${c3p0.maxIdleTime}</value>
		</property>
		<property name="idleConnectionTestPeriod">
			<value>${c3p0.idleConnectionTestPeriod}</value>
		</property>
		<property name="maxStatements">
			<value>${c3p0.maxStatements}</value>
		</property>
		<property name="checkoutTimeout">
			<value>${c3p0.checkoutTimeout}</value>
		</property>
		<property name="acquireRetryAttempts">
			<value>${c3p0.acquireRetryAttempts}</value>
		</property>
		<property name="breakAfterAcquireFailure">
			<value>${c3p0.breakAfterAcquireFailure}</value>
		</property>
		<property name="autoCommitOnClose">
			<value>${c3p0.autoCommitOnClose}</value>
		</property>
		<property name="testConnectionOnCheckout">
			<value>${c3p0.testConnectionOnCheckout}</value>
		</property>
	</bean>

	<bean id="sessionFactory" name="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="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.autoReconnect">${hibernate.autoReconnect}</prop>
				<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
				<prop key="hibernate.cache.use_query_cache">true</prop>
				<prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
			</props>
		</property>
		<property name="mappingResources">
			<list>
				<value>Role.hbm.xml</value>
			</list>
		</property>
	</bean>
0 请登录后投票
   发表时间:2007-09-12  
<property name="maxStatements">100</property> ,这个属性有什么用?直接去掉好了……

然后尝试一下把<prop  key="hibernate.c3p0.idle_test_period">120</prop>属性设置小一些,例如30,让更短的时间检查空连接,以便释放。

<prop  key="hibernate.c3p0.acquire_increment">2</prop>,值可否设置大一些?
0 请登录后投票
   发表时间:2007-09-12  
问一下用过c3p0的同志:
  这个c3p0连接池在运行中,如果和数据库的网络连接断开过几分钟恢复连接,这个连接池是否还可以正常工作。如果可以正常工作,那么多长时间后就不能正常运行了,可以设定吗?
 
0 请登录后投票
   发表时间:2007-09-13  
zhaosong 写道
问一下用过c3p0的同志:
  这个c3p0连接池在运行中,如果和数据库的网络连接断开过几分钟恢复连接,这个连接池是否还可以正常工作。如果可以正常工作,那么多长时间后就不能正常运行了,可以设定吗?
 


可以正常使用的,但是正在执行的事务会被终止,并抛出一个异常……
0 请登录后投票
   发表时间:2007-09-14  
谢谢tom.duan
检测连接是否可用,是直接发送一个简单数据库请求来检测的,还是有什么更好的方法吗?
另外有推荐的连接池的 ---优秀的数据库连接分配机制--- 吗?
我看了一下c3p0的代码,因为层次太复杂,时间比较少所以没看出具体算法,希望能同过少量代码反映优秀连接分配算法的。不胜感激!!!(以前写的一个不太理想)
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics