问题描述
问题是这样的,前台界面查询数据,查看数据库,每查询一次,数据库连接就增加,感觉根本没从c3p0数据库连接池里面拿,每次操作都创建新的数据库连接,旧的连接也没释放,一直刷新界面,然后就报不能连接数据库的错误。cp3o配置如下:#----------datasource配置#最大的连接池大小datasource.maxPoolSize=50#最小的连接池大小datasource.minPoolSize=3#初始化连接池大小datasource.initialPoolSize=5#最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default:0datasource.maxIdleTime=60#当连接池连接耗尽时,客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。默认:0datasource.checkoutTimeout=3000#当连接池中的连接耗尽的时候datasource一次同时获取的连接数。Default:3datasource.acquireIncrement=5#定义在从数据库获取新连接失败后重复尝试的次数。Default:30datasource.acquireRetryAttempts=0#两次连接中间隔时间,单位毫秒。Default:1000datasource.acquireRetryDelay=1000#连接关闭时默认将所有未提交的操作回滚。Default:falsedatasource.autoCommitOnClose=false#每60秒检查所有连接池中的空闲连接。默认值:0,不检查datasource.idleConnectionTestPeriod=60#测试连接有效性datasource.testConnectionOnCheckout=false#自动测试的table名称datasource.automaticTestTable=c3p0TestTable#c3p0全局的PreparedStatements缓存的大小。如果maxStatements与maxStatementsPerConnection均为0,则缓存不生效,只要有一个不为0,则语句的缓存就能生效。如果默认值:0datasource.maxStatements=100datasource.maxStatementsPerConnection=0#方言(使用sqlserver数据库)hibernate.dialect=org.hibernate.dialect.OracleDialect#是否显示查询语句hibernate.show_sql=true#hibernate缓存对象hibernate.cache.class=org.hibernate.cache.EhCacheProvider#是否使用查询缓存hibernate.cache.query=turespring配置:<beanid="placeholderConfig"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><propertyname="location"><value>classpath:com/config/init/init.properties</value></property></bean><!--c3p0连接池配置--><beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"><!--用户名--><propertyname="user"value="${datasource.username}"/><!--用户密码--><propertyname="password"value="${datasource.password}"/><propertyname="driverClass"value="${datasource.driverClass}"/><propertyname="jdbcUrl"value="${datasource.url}"/><!--连接池中保留的最大连接数。默认值:15--><propertyname="maxPoolSize"value="${datasource.maxPoolSize}"/><!--连接池中保留的最小连接数,默认为:3--><propertyname="minPoolSize"value="${datasource.minPoolSize}"/><!--初始化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间,默认为3--><propertyname="initialPoolSize"value="${datasource.initialPoolSize}"/><!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。默认值:0--><propertyname="maxIdleTime"value="${datasource.maxIdleTime}"/><!--当连接池连接耗尽时,客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。默认:0--><propertyname="checkoutTimeout"value="${datasource.checkoutTimeout}"/><!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值:3--><propertyname="acquireIncrement"value="${datasource.acquireIncrement}"/><!--定义在从数据库获取新连接失败后重复尝试的次数。默认值:30;小于等于0表示无限次--><propertyname="acquireRetryAttempts"value="${datasource.acquireRetryAttempts}"/><!--重新尝试的时间间隔,默认为:1000毫秒--><propertyname="acquireRetryDelay"value="${datasource.acquireRetryDelay}"/><!--每60秒检查所有连接池中的空闲连接。默认值:0,不检查--><propertyname="idleConnectionTestPeriod"value="${datasource.idleConnectionTestPeriod}"/><!--每60秒检查所有连接池中的空闲连接。默认值:0,不检查--><propertyname="testConnectionOnCheckout"value="${datasource.testConnectionOnCheckout}"/><propertyname="automaticTestTable"value="${datasource.automaticTestTable}"/><!--c3p0全局的PreparedStatements缓存的大小。如果maxStatements与maxStatementsPerConnection均为0,则缓存不生效,只要有一个不为0,则语句的缓存就能生效。如果默认值:0--><propertyname="maxStatements"value="${datasource.maxStatements}"/><!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。默认值:0--><propertyname="maxStatementsPerConnection"value="${datasource.maxStatementsPerConnection}"/></bean><beanid="sessionFactory"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><propertyname="dataSource"><refbean="dataSource"/></property><propertyname="hibernateProperties"><props><propkey="hibernate.dialect">${hibernate.dialect}</prop><propkey="hibernate.show_sql">${hibernate.show_sql}</prop><propkey="hibernate.current_session_context_class">thread</prop></props></property><!----><!--主键Bean类--><!--<propertyname="annotatedClasses"><list><value>com.base.entity.BasUser</value></list></property>--><propertyname="packagesToScan"><list><value>com.base.entity</value></list></property><!--<propertyname="packagesToScan"value="com.base.dao"></property>--></bean><beanid="hibernateTemplate"class="org.springframework.orm.hibernate3.HibernateTemplate"><propertyname="sessionFactory"ref="sessionFactory"></property></bean><beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><propertyname="sessionFactory"><refbean="sessionFactory"/></property></bean><!--配置事务的传播特性--><tx:adviceid="txAdvice"transaction-manager="transactionManager"><tx:attributes><tx:methodname="*"propagation="REQUIRED"/><tx:methodname="save*"propagation="REQUIRED"/><tx:methodname="update*"propagation="REQUIRED"/><tx:methodname="delete*"propagation="REQUIRED"/><tx:methodname="*"read-only="false"/></tx:attributes></tx:advice><!--使用annotation自动注册bean(@Respository,@Component),并检查@Required,@Autowired的属性已被注入--><context:component-scanbase-package="com"/><!--那些类的哪些方法参与事务--><aop:config><aop:pointcutid="allServiceMethod"expression="execution(*com.*.service..*.*(..))"/><aop:advisorpointcut-ref="allServiceMethod"advice-ref="txAdvice"/></aop:config><!--使Spring关注Annotation--><context:annotation-config/>这个是dao,前台查询调用其中的查询方法publicclassBaseDaoImpextendsHibernateDaoSupport{@ResourcepublicvoidsetSessionFacotry(SessionFactorysessionFacotry){super.setSessionFactory(sessionFacotry);}publicSessiongetCurrentSession(){returnthis.getHibernateTemplate().getSessionFactory().getCurrentSession();}/***查询hql,返回list*/publicListlistHQLQuery(finalStringhql){returnthis.getHibernateTemplate().executeFind(newHibernateCallback(){publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{if(null==hql||"".equals(hql)){returnnull;}Queryquery=session.createQuery(hql);returnquery.list();}});/*Sessionsession=this.getCurrentSession();session.beginTransaction();Listlist;try{list=session.createQuery(hql).list();}finally{session.getTransaction().commit();//session.close();}returnlist;*/}}查了很多资料说是session没关闭,但是,我用下面这个直接在代码里面commit,发现session是关掉了的,但是关掉了session,每次查询数据库还是增加了数据库连接。我怀疑我的dao代码写的有问题,麻烦大神帮我看看,困了好几天了。。。。。
解决方案
解决方案二:
用Myeclipse的Profile或者JProfile来监控一下!
解决方案三:
引用1楼littlebrain4solving的回复:
用Myeclipse的Profile或者JProfile来监控一下!
能具体点么。
解决方案四:
事务已经配置了spring的代理还打开什么事务肯定会爆掉的啊session.beginTransaction();这种的都去掉你的server里面的sacve*update_*那些都已经由spring代理了第二个就是就算你没用spring做事务代理你hibernate查询那也不需要打开事务查询根本就不需要事务
解决方案五:
引用3楼zcwgogo的回复:
事务已经配置了spring的代理还打开什么事务肯定会爆掉的啊session.beginTransaction();这种的都去掉你的server里面的sacve*update_*那些都已经由spring代理了第二个就是就算你没用spring做事务代理你hibernate查询那也不需要打开事务查询根本就不需要事务
那段是注释掉的,我用这段代码的时候,已经把spring的配置去掉了。我只是想试下提交事务是不是session就关了。
解决方案六:
上复制的这种代码都仔细看看原理要么复制过来有什么用,以后还是基于公司的框架来做,既然自己决定要搭建框架就要理解原理要么就不要做这事情就做coder就好了
解决方案七:
事务提交肯定是不会关闭链接的
解决方案八:
//session.close();---这个代码为啥会注释掉了?手动关一下session再看是否还是连接不关闭
解决方案九:
这种算是好的了。如果针对一个表既写又读,干脆就死锁了。还是别用spring为好,纯hibernate都不会出现那种情况。
解决方案十:
引用2楼weijiankuk的回复:
Quote: 引用1楼littlebrain4solving的回复:
用Myeclipse的Profile或者JProfile来监控一下!能具体点么。
你现在目前搞不清楚哪里出现的问题,而且我们也只能猜测是连接上出现的问题;我建议你用监控工具看看情况,你通过监控器可以看到各个资源消耗的情况;这样利于你的判断。毕竟我们也不能完全通过你提供的这段内容得知具体情况。