tomcat数据源配置DBCP

原文件:

https://www.cnblogs.com/sicd/p/4053780.html

 

DBCP object created 日期 by the following code was never closed:

1、分析    

  看到标题 DBCP 首先想到的肯定是 数据库连接池哪方面有问题,那么先别着急去解决,不要一股脑就钻进逻辑代码中,然后启用调试就开始一步一步

的分析。我们首先要做的就是想,想想数据库连接池,在项目中是如何实现的,那么不管你或早或晚,都会想到数据库连接池相关的配置文件和代码。那么

问题来了,是否是配置文件配置的有问题(挖掘技术哪家强?)?

  那么先来分析下各项连接池配置的属性:

  #回收被遗弃的(一般是忘了释放的)数据库连接到连接池中。 
  dataBase.removeAbandoned =false

  # 数据库连接过多长时间不用将被视为被遗弃而收回连接池中。 
  dataBase.removeAbandonedTimeout = 30

  # 将被遗弃的数据库连接的回收记入日志。 
  dataBase.logAbandoned = false

  #连接池的最大数据库连接数,设为0 表示无限制。 
  dataBase.maxActive = 200

  #数据库连接的最大空闲连接数。超过此空闲连接数,,数据库连接将被标记为不可用,然后被释放。设为0 表示无限制。 
  dataBase.maxIdle=40

  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1 表示无限制
  dataBase.maxWait=10000

  #取得、返回对象和空闲时是否进行验证,检查对象是否有效,默认都为false即不验证
  dataBase.testOnBorrow=true
  dataBase.testWhileIdle=true
  dataBase.testOnReturn=true
  dataBase.validationQuery=select 1 from dual

  说明:

  1. #回收被遗弃的(一般是忘了释放的)数据库连接到连接池中。 
  dataBase.removeAbandoned =false

  如果这个值为true一般是用来调试的时候用的,正式发布后应该改为false,

  2. # 将被遗弃的数据库连接的回收记入日志。 

  dataBase.logAbandoned = false

  这个如果设置为true就会引起如下错误:
  DBCP object created 日期 by the following code was never closed:
  java.lang.Exception
  

  3.#连接池的最大数据库连接数,设为0 表示无限制。 

  dataBase.maxActive = 200

  #数据库连接的最大空闲时间。超过此空闲时间,数据库连接将被标记为不可用,然后被释放。设为0 表示无限制。 
  dataBase.maxIdle=40

  会有可能出现:Cannot get a connection, pool error Timeout waiting for idle object这样的错误

  (转载网上资料)  

 

2、深入

  不小心暴露的解决方法,那么 到底是为什么呢?

  原因是:dataBase.removeAbandoned = true  

  设置为true以后,使用这个配置将会使用AbandonedObjectPool,同时上方也提到过,此配置只建议在开发阶段使用

  因为,AbandonedObjectPool能帮你发现占用连接过长的代码,比如LOG信息,说明getCustomerOnline占用连接的时间

  超过了removeAbandonedTimeout设定的时间,所以设置dataBase.removeAbandoned = false就行了,

  AbandonedObjectPool只在开发使用,在后续的版本会去掉,并且现在的API都弃用(不赞成)了,因此在使用此

  功能的时候多多注意。

 

DBCP object created 2018-10-10 16:08:54 by the following code was never closed:
java.lang.Exception
at org.apache.commons.dbcp.AbandonedTrace.setStackTrace(AbandonedTrace.java:202)
at org.apache.commons.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:121)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:140)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:518)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:82)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1700)
at org.hibernate.loader.Loader.doQuery(Loader.java:801)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
at org.hibernate.loader.Loader.doList(Loader.java:2533)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
。。。。。。。。。。。。。
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:700)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
。。。。。。。。。。。。。
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
DBCP object created 2018-10-10 16:09:54 by the following code was never closed:
java.lang.Exception

 

这里的代码中DBCP报的错,不影响业务代码。公司的网络有问题,导致业务代码访问数据库连接有无反应。

转载于:https://www.cnblogs.com/javaeye235/p/9766748.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tomcat配置数据,可以使用 Tomcat 的内置数据(JNDI DataSource)或者第三方的数据,例如 Apache Commons DBCP 或者 C3P0 等。 下面是使用 Tomcat 内置数据配置数据的步骤: 1. 在 Tomcat 的 conf 目录下的 context.xml 文件中添加如下配置: ```xml <Resource name="jdbc/MyDataSource" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mydatabase" username="dbuser" password="dbpassword" maxTotal="100" maxIdle="30" maxWaitMillis="10000"/> ``` 其中,name 属性指定数据的 JNDI 名称,url 属性指定数据库的连接地址,username 和 password 属性指定数据库的登录用户名和密码,maxTotal、maxIdle 和 maxWaitMillis 属性指定连接池的属性。 2. 在 web.xml 文件中添加如下配置: ```xml <resource-ref> <description>My DataSource</description> <res-ref-name>jdbc/MyDataSource</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> ``` 其中,res-ref-name 属性指定数据的 JNDI 名称,res-type 属性指定数据的类型,res-auth 属性指定认证方式。 3. 在 Java 代码中获取数据并使用: ```java Context initContext = new InitialContext(); Context envContext = (Context) initContext.lookup("java:/comp/env"); DataSource ds = (DataSource) envContext.lookup("jdbc/MyDataSource"); Connection conn = ds.getConnection(); // 使用连接执行 SQL 查询等操作 conn.close(); ``` 以上就是使用 Tomcat 内置数据配置数据的完整步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值