tomcat自带连接池dbcp配置以及优化说明

2023-11-16

转自:http://www.totcms.com/html/201602-29/20160229114145.htm


一个网站每天大概有20万的访问量,使用的tomcat自带dbcp连接池,一般网站访问很好,速度也很快,但是过一段时间后,总是报timeout waiting for idle object的异常信息,最后查了apache tomcat的官方文档,终于找到解决方法:

数据库连接池创建和管理池中的数据库连接对象。重建和复用已存在的连接对象要比创建新的连接要频繁的多。

连接池会存在这样一个问题。web应用已经明确关闭ResultSet,Statement,及Connection对象;当关闭出现故障的web应用所使用的资源
时将会导致这个连接资源不能在复用,这就是数据库连接池泄露,最终导致在你的应用程序中没有连接对象可以使用。


这当然是有解决方法的,Apache Commons DBCP可以配置为跟踪和恢复这些被弃的数据库连接对象。不仅恢复还可以跟踪那些连接数据库却没有关闭的代码片段。


要增加连接池中被弃的连接重新可用,打开配置文件,为Resource标签配置以下参数:

removeAbandonedOnBorrow=true
removeAbandonedOnMaintenance=true
removeAbandonedTimeout="60"
logAbandoned="true"

默认情况下removeAbandonedOnBorrow和removeAbandonedOnMaintenance都是为false。

注意:removeAbandonedOnMaintenance只有在timeBetweenEvictionRunsMillis设置为正数的情况下才有效。

removeAbandonedTimeout属性是设置数据库连接被释最多空闲时间多少秒之后设置为空闲。默认移除废弃连接的时间为300秒。

提示:

如果启用removeAbandonedOnMaintenance 或 removeAbandonedOnBorrow,那些被认为废弃的连接对象有可能被池回收。这个机制以下情况下会触发:
当getNumIdle() < 2并且getNumActive() > getMaxTotal() - 3及emoveAbandonedOnBorrow 设置为true时;或 当removeAbandonedOnMaintenance设置为true并且回收完成时。
打个比方说:
如果设置maxTotal=20,当有18个活跃连接、1个空闲连接时会触发removeAbandonedOnBorrow,不过仅是那些使用时间超过removeAbandonedTimeout秒数的活动连接才会被移除(默认是300秒)
,遍历resultset不作为正在使用。创建Statement,PrepareStatement或CallableStatement或使用其中一个执行查询(执行exceute方法)重置父连接的lastUsed属性。

 

DBCP连接池配置参数讲解

-----------------------------

一、Apache官方DBCP文档给出的配置示例:

可参见:http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html

<Context>

  <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"

               maxActive="100" maxIdle="30" maxWait="10000"

               username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"

               url="jdbc:mysql://localhost:3306/javatest"/>

</Context>

 

tomcat JDBC连接池配置示例,自动检查连接的可用性,dbcp定时检测连接,dbcp自动重连的配置

Xml代码    收藏代码
  1. <Resource  
  2. name="jdbc/TestDB"  JNDI数据源的name,查找时用:java:comp/env/jdbc/TestDB  
  3. type="javax.sql.DataSource"  
  4. factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"  
  5. driverClassName="com.mysql.jdbc.Driver" JDBC驱动类  
  6. url="jdbc:mysql://localhost:3306/test?  
  7. characterEncoding=UTF-8&amp;autoReconnectForPools=true&amp;rewriteBatchedStatements=true&amp;useCursorFetch=true&amp;defaultFetchSize=20" 数据库URL地址    
  8. username="xxx" 访问数据库用户名  
  9. password="xxx" 访问数据库的密码  
  10.    
  11. maxWait="3000" 从池中取连接的最大等待时间,单位ms.  
  12. initialSize="10"  初始化连接  
  13. maxIdle="60"   最大空闲连接  
  14. minIdle="10"   最小空闲连接  
  15. maxActive="80" 最大活动连接  
  16.    
  17. validationQuery = "SELECT 1"  验证使用的SQL语句  
  18. testWhileIdle = "true"      指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.  
  19. testOnBorrow = "false"   借出连接时不要测试,否则很影响性能  
  20. timeBetweenEvictionRunsMillis = "30000"  每30秒运行一次空闲连接回收器  
  21. minEvictableIdleTimeMillis = "1800000"  池中的连接空闲30分钟后被回收  
  22. numTestsPerEvictionRun="10" 在每次空闲连接回收器线程(如果有)运行时检查的连接数量  
  23.       
  24. removeAbandoned="true"  连接泄漏回收参数,当可用连接数少于3个时才执行  
  25. removeAbandonedTimeout="180"  连接泄漏回收参数,180秒,泄露的连接可以被删除的超时值  
  26. />  

 

 

DBCP连接池的自我检测

-----------------------------

默认配置的DBCP连接池,是不对池中的连接做测试的,有时连接已断开了,但DBCP连接池不知道,还以为连接是好的呢。

应用从池中取出这样的连接访问数据库一定会报错。这也是好多人不喜欢DBCP的原因。

 

问题例一:

MySQL8小时问题,Mysql服务器默认连接的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。

但是DBCP连接池并不知道连接已经断开了,如果程序正巧使用到这个已经断开的连接,程序就会报错误。

 

问题例二:

    以前还使用Sybase数据库,由于某种原因,数据库死了后重启、或断网后恢复。

    等了约10分钟后,DBCP连接池中的连接还都是不能使用的(断开的),访问数据应用一直报错,最后只能重启Tomcat问题才解决 。

 

解决方案:

    方案1、定时对连接做测试,测试失败就关闭连接。

    方案2、控制连接的空闲时间达到N分钟,就关闭连接,(然后可再新建连接)。

    以上两个方案使用任意一个就可以解决以述两类问题。如果只使用方案2,建议 N <= 5分钟。连接断开后最多5分钟后可恢复。

    也可混合使用两个方案,建议 N = 30分钟。

    

    下面就是DBCP连接池,同时使用了以上两个方案的配置配置

    validationQuery = "SELECT 1"  验证连接是否可用,使用的SQL语句

    testWhileIdle = "true"      指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.

    testOnBorrow = "false"   借出连接时不要测试,否则很影响性能

    timeBetweenEvictionRunsMillis = "30000"  每30秒运行一次空闲连接回收器

    minEvictableIdleTimeMillis = "1800000"  池中的连接空闲30分钟后被回收,默认值就是30分钟。

    numTestsPerEvictionRun="3" 在每次空闲连接回收器线程(如果有)运行时检查的连接数量,默认值就是3.

    

    解释:

    配置timeBetweenEvictionRunsMillis = "30000"后,每30秒运行一次空闲连接回收器(独立线程)。并每次检查3个连接,如果连接空闲时间超过30分钟就销毁。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接,维护数量不少于minIdle,过行了新老更替。

    testWhileIdle = "true" 表示每30秒,取出3条连接,使用validationQuery = "SELECT 1" 中的SQL进行测试 ,测试不成功就销毁连接。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接。

    testOnBorrow = "false" 一定要配置,因为它的默认值是true。false表示每次从连接池中取出连接时,不需要执行validationQuery = "SELECT 1" 中的SQL进行测试。若配置为true,对性能有非常大的影响,性能会下降7-10倍。所在一定要配置为false.

    每30秒,取出numTestsPerEvictionRun条连接(本例是3,也是默认值),发出"SELECT 1" SQL语句进行测试 ,测试过的连接不算是“被使用”了,还算是空闲的。连接空闲30分钟后会被销毁。

    

 

DBCP连接池配置参数注意事项  

-----------------------------

maxIdle值与maxActive值应配置的接近。

因为,当连接数超过maxIdle值后,刚刚使用完的连接(刚刚空闲下来)会立即被销毁。而不是我想要的空闲M秒后再销毁起一个缓冲作用。这一点DBCP做的可能与你想像的不一样。

若maxIdle与maxActive相差较大,在高负载的系统中会导致频繁的创建、销毁连接,连接数在maxIdle与maxActive间快速频繁波动,这不是我想要的。

高负载系统的maxIdle值可以设置为与maxActive相同或设置为-1(-1表示不限制),让连接数量在minIdle与maxIdle间缓冲慢速波动。

 

timeBetweenEvictionRunsMillis建议设置值

initialSize="5",会在tomcat一启动时,创建5条连接,效果很理想。

但同时我们还配置了minIdle="10",也就是说,最少要保持10条连接,那现在只有5条连接,哪什么时候再创建少的5条连接呢?

1、等业务压力上来了, DBCP就会创建新的连接。

2、配置timeBetweenEvictionRunsMillis=“时间”,DBCP会启用独立的工作线程定时检查,补上少的5条连接。销毁多余的连接也是同理。

 

连接销毁的逻辑

------------------------------

DBCP的连接数会在  0 - minIdle - maxIdle - maxActive  之间变化。变化的逻辑描述如下:

 

默认未配置initialSize(默认值是0)和timeBetweenEvictionRunsMillis参数时,刚启动tomcat时,连接数是0。当应用有一个并发访问数据库时DBCP创建一个连接。

目前连接数量还未达到minIdle,但DBCP也不自动创建新连接已使数量达到minIdle数量(没有一个独立的工作线程来检查和创建)。

随着应用并发访问数据库的增多,连接数也增多,但都与minIdle值无关,很快minIdle被超越,minIdle值一点用都没有。

直到连接的数量达到maxIdle值,这时的连接都是只增不减的。 再继续发展,连接数再增多并超过maxIdle时,使用完的连接(刚刚空闲下来的)会立即关闭,总体连接的数量稳定在maxIdle但不会超过maxIdle。

但活动连接(在使用中的连接)可能数量上瞬间超过maxIdle,但永远不会超过maxActive。

这时如果应用业务压力小了,访问数据库的并发少了,连接数也不会减少(没有一个独立的线程来检查和销毁),将保持在maxIdle的数量。

 

默认未配置initialSize(默认值是0),但配置了timeBetweenEvictionRunsMillis=“30000”(30秒)参数时,刚启动tomcat时,连接数是0。马上应用有一个并发访问数据库时DBCP创建一个连接。

目前连接数量还未达到minIdle,每30秒DBCP的工作线程检查连接数是否少于minIdle数量,若少于就创建新连接直到达到minIdle数量。

随着应用并发访问数据库的增多,连接数也增多,直到达到maxIdle值。这期间每30秒DBCP的工作线程检查连接是否空闲了30分钟,若是就销毁。但此时是业务的高峰期,是不会有长达30分钟的空闲连接的,工作线程查了也是白查,但它在工作。到这里连接数量一直是呈现增长的趋势。

当连接数再增多超过maxIdle时,使用完的连接(刚刚空闲下来)会立即关闭,总体连接的数量稳定在maxIdle。停止了增长的趋势。但活动连接(在使用中的连接)可能数量上瞬间超过maxIdle,但永远不会超过maxActive。

这时如果应用业务压力小了,访问数据库的并发少了,每30秒DBCP的工作线程检查连接(默认每次查3条)是否空闲达到30分钟(这是默认值),若连接空闲达到30分钟,就销毁连接。这时连接数减少了,呈下降趋势,将从maxIdle走向minIdle。当小于minIdle值时,则DBCP创建新连接已使数量稳定在minIdle,并进行着新老更替。

 

配置initialSize=“10”时,tomcat一启动就创建10条连接。其它同上。

 

minIdle要与timeBetweenEvictionRunsMillis配合使用才有用,单独使用minIdle不会起作用。

 

 

Tomcat中配置DBCP连接池

-----------------------------

Tomcat自带DBCP的包,是$CATALINA_HOME/lib/tomcat-dbcp.jar。

tomcat-dbcp.jar含有commons pool、commons DBCP两个包的内容。但只含有与连接池有关的类。

数据源配置在context.xml文件中, 要在tomcat的lib目录中放jdbc 驱动包

数据源配置在server.xml的host中,不需要在tomcat的lib目录中放jdbc 驱动包,只使用工程中的jdbc驱动包

 

 

JNDI配置:更改tomcat的server.xml或context.xml

 

    全局的数据源:

    如果需要配置全局的 Resource,则在server.xml的GlobalNamingResources节点里加入Resource,再在Context节点里加入ResourceLink的配置。

    全局的resource只是为了重用,方便所有该tomcat下的web工程的数据源管理,但如果你的tomcat不会同时加载多个web工程,也就是说一个tomcat只加载一个web工程时,是没有必要配置全局的resource的。

 

每个web工程一个数据源:

在$CATALINA_HOME/conf/context.xml的根节点Context里加入Resource配置。这种配置方法,你在context.xml配置了一个数据源,但Tomcat中有同时运行着5个工程,那了就坏事儿了,这个在Tomcat启动时数据源被创建了5份,每个工程1份数据源。连接数会是你配置的参数的5倍。

只有在你的Tomcat只加载一个web工程时,才可以直接以context.xml配置数据源。

 

<Resource name="jdbc/testDB"       //指定的jndi名称,会用于spring数据源bean的配置和ResourceLink的配置

               type="javax.sql.DataSource"   //数据源类型,使用标准的javax.sql.DataSource

               driverClassName="com.mysql.jdbc.Driver"    //JDBC驱动器 

               url="jdbc:mysql://localhost:3306/test" //数据库URL地址             

               username="test"     //数据库用户名

               password="test"   //数据库密码

               maxIdle="40"   //最大的空闲连接数

               maxWait="4000" //当池的数据库连接已经被占用的时候,最大等待时间

               maxActive="40" //连接池当中最大的数据库连接

               removeAbandoned="true" 

               removeAbandonedTimeout="180"

               logAbandoned="true" //被丢弃的数据库连接是否做记录,以便跟踪

               factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" />

 

      这里的factory指的是该Resource 配置使用的是哪个数据源配置类,这里使用的是tomcat自带的标准数据源Resource配置类,这个类也可以自己写,实现javax.naming.spi.ObjectFactory 接口即可。某些地方使用的commons-dbcp.jar中的org.apache.commons.dbcp.BasicDataSourceFactory,如果使用这个就需把commons-dbcp.jar及其依赖的jar包,都放在tomcat的lib下,光放在工程的WEB-INF/lib下是不够的。

 

     ResourceLink 的配置有多种:

 

     1)tomcat安装目录下的conf/context.xml,把全局的resource直接公开给该tomcat下的所有web工程,在Context节点中加入:

<ResourceLink global="jdbc/testMDB" name="jdbc/testMDB" type="javax.sql.DataSource"/>   

不建议在此文件中,不使用<ResourceLink/>,而使用<Resource/>直接配置数据源,原因上面已说明了。   

 

     2)tomcat安装目录下的conf/server.xml,该方法可以指定把哪些source绑定到哪个web工程下。

<!-- 新增,第一行为加载的工程配置,第二行是该工程需要的ResourceLink配置 -->

<context docBase="/web/webapps/phoenix" path="" reloadable="false"> 

      <ResourceLink global="jdbc/testMDB" name="jdbc/testMDB" type="javax.sql.DataSource"/>

</context>

也可在此文件中,不使用<ResourceLink/>,而使用<Resource/>直接配置数据源。

 

     3)安装目录下的conf/localhost/下建立一个xml文件,文件名是<yourAppName>.xml。比如工程名为test,则该xml名为test.xml。

<?xml version="1.0" encoding="UTF-8"?>

<Context>   

    <ResourceLink global="jdbc/testMDB" name="jdbc/testMDB" type="javax.sql.DataSource"/>       

</context>

也可在此文件中,不使用<ResourceLink/>,而使用<Resource/>直接配置数据源。

 

     4)tomcat安装目录下的\webapps\test\META-INF\context.xml的Context节点中增加:

<ResourceLink global="jdbc/testMDB" name="jdbc/testMDB" type="javax.sql.DataSource"/>

也可在此文件中,不使用<ResourceLink/>,而使用<Resource/>直接配置数据源。

 

 

本文内容都在tomcat6.0上运行测试过,还下载了commons DBCP的源码,加入了跟踪日志,用于验证本文的理论。

 

由于commons-dbcp所用的连接池出现版本升级,因此commons-dbcp2中的数据库池连接配置也发生了变化,具体的参数配置说明如下:

参数 描述
username 通过JDBC建立一个连接所需的用户名
password 通过JDBC建立一个连接所需的密码
url 通过JDBC建立一个连接所需的URL
driverClassName 所使用的JDBC驱动的类全名
connectionProperties 连接参数是在建立一个新连接时发送给JDBC驱动的
字符串的格式必须是[参数名=参数值;]
提示:用户名和密码属性是需要明确指出的,所以这两个参数不需要包含在这里

参数 缺省值 描述
defaultAutoCommit JDBC驱动的缺省值 通过这个池创建连接的默认自动提交状态。如果不设置,则setAutoCommit 方法将不被调用。
defaultReadOnly JDBC驱动的缺省值 通过这个池创建连接的默认只读状态。如果不设置,则setReadOnly  方法将不被调用。(部分驱动不支持只读模式,如:Informix
defaultTransactionIsolation JDBC驱动的缺省值 通过这个池创建连接的默认事务策略,设置值为下列中的某一个: (参考 javadoc)
  • NONE
  • READ_COMMITTED
  • READ_UNCOMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE
defaultCatalog   通过这个池创建连接的默认缺省的catalog 
cacheState true 如果设置为true,池化的连接将在第一次读或写,以及随后的写的时候缓存当前的只读状态和自动提交设置。这样就省去了对getter的任何进一步的调用时对数据库的额外查询。如果直接访问底层连接,只读状态和/或自动提交设置改变缓存值将不会被反映到当前的状态,在这种情况下,应该将该属性设置为false以禁用缓存。

参数 缺省值 描述
initialSize 0 当这个池被启动时初始化的创建的连接个数,起始生效版本:1.2
maxTotal 8 可以在这个池中同时被分配的有效连接数的最大值,如设置为负数,则不限制
maxIdle 8 可以在池中保持空闲的最大连接数,超出设置值之外的空闲连接将被回收,如设置为负数,则不限制
minIdle 0 可以在池中保持空闲的最小连接数,超出设置值之外的空闲连接将被创建,如设置为0,则不创建
maxWaitMillis indefinitely (如果没有可用连接)池在抛出异常前等待的一个连接被归还的最大毫秒数,设置为-1则等待时间不确定

 提示: 如果在高负载的系统中将maxIdle的值设置的很低,则你可能会发现在一个新的连接刚刚被创建的时候就立即被关闭了。这是活跃的线程及时关闭连接要比那些打开连接的线程要快,导致空闲的连接数大于maxIdle。高负载系统中maxIdle的最合适的配置值是多样的,但是缺省值是一个好的开始点。


参数 缺省值 描述
validationQuery   在连接池返回连接给调用者前用来进行连接校验的查询sql。如果指定,则这个查询必须是一个至少返回一行数据的SQL SELECT语句。如果没有指定,则连接将通过调用isValid() 方法进行校验。
testOnCreate false 指明对象在创建后是否需要被校验,如果对象校验失败,则触发对象创建的租借尝试将失败。
testOnBorrow true 指明在从池中租借对象时是否要进行校验,如果对象校验失败,则对象将从池子释放,然后我们将尝试租借另一个
testOnReturn false 指明在将对象归还给连接池前是否需要校验。
testWhileIdle false 指明对象是否需要通过对象驱逐者进行校验(如果有的话),假如一个对象校验失败,则对象将被从池中释放。
timeBetweenEvictionRunsMillis -1 空闲对象驱逐线程运行时的休眠毫秒数,如果设置为非正数,则不运行空闲对象驱逐线程。
numTestsPerEvictionRun 3 在每个空闲对象驱逐线程运行过程中中进行检查的对象个数。(如果有的话)
minEvictableIdleTimeMillis 1000 * 60 * 30 符合对象驱逐对象驱逐条件的对象在池中最小空闲毫秒总数(如果有的话)
softMiniEvictableIdleTimeMillis -1 符合对象驱逐对象驱逐条件的对象在池中最小空闲毫秒总数,额外的条件是池中至少保留有minIdle所指定的个数的连接。当miniEvictableIdleTimeMillis 被设置为一个正数,空闲连接驱逐者首先检测miniEvictableIdleTimeMillis,当空闲连接被驱逐者访问时,首先与miniEvictableIdleTimeMillis 所指定的值进行比较(而不考虑当前池中的空闲连接数),然后比较softMinEvictableIdleTimeMillis所指定的连接数,包括minIdle条件。
maxConnLifetimeMillis -1 一个连接的最大存活毫秒数。如果超过这个时间,则连接在下次激活、钝化、校验时都将会失败。如果设置为0或小于0的值,则连接的存活时间是无限的。
connectionInitSqls null 在第一次创建时用来初始化物理连接的SQL语句集合。这些语句只在配置的连接工厂创建连接时被执行一次。
lifo true 设置为true表明连接池(如果池中有可用的空闲连接时)将返回最后一次使用的租借对象(最后进入)。设置为false则表明池将表现为FIFO队列——将会按照它们被归还的顺序从空闲连接实例池中获取连接

参数 缺省值 描述
poolPreparedStatements false 设置该连接池的预处理语句池是否生效
maxOpenPreparedStatements unlimited 可以在语句池中同时分配的最大语句数。设置为负数则不限制。

 这个设置同时作用于预处理语句池. 当一个可用的语句池被创建给每一个连接时,通过以下方法创建的预处理语句将被池化。

  • public PreparedStatement prepareStatement(String sql)
  • public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)

 提示 -要确保你的连接会留下一些资源给其他语句。池化预处理语句可能会在数据库中保持他们的游标,可能会引起连接的游标越界,尤其是maxOpenPreparedStatements的值被设置为默认值(无限的),而且一个应用程序可能会为每个连接打开大量不同的预处理语句。为了避免这个问题maxOpenPreparedStatements应该被设置为一个小于连接可以打开的最大游标数的值。


参数 缺省值 描述
accessToUnderlyingConnectionAllowed false 控制PoolGuard是否可以访问底层连接 

如果允许访问的话,使用如下代码结构:


    Connection conn = ds.getConnection();     Connection dconn =((DelegatingConnection) conn).getInnermostDelegate();     ...     conn.close() 

 默认值为false,这是一个有着潜在风险的操作,使用不当可能会导致非常严重的后果。(在守卫连接已被关闭的情况下,关闭底层连接或者继续使用它),只有在你需要直接访问驱动的特有扩展是可以谨慎使用。

 NOTE: 除了最原始那个之外,不要关闭底层连接


参数 缺省值 描述
removeAbandoned false 标记是否删除超过removeAbandonedTimout所指定时间的被遗弃的连接。
如果设置为true,则一个连接在超过removeAbandonedTimeout所设定的时间未使用即被认为是应该被抛弃并应该被移除的。创建一个语句,预处理语句,可调用语句或使用它们其中的一个执行查询(使用执行方法中的某一个)会重新设置其父连接的lastUsed 属性。
在写操作较少的应用程序中将该参数设置为true可以将数据库连接从连接关闭失败中恢复。
removeAbandonedTimeout 300 一个被抛弃连接可以被移除的超时时间,单位为秒
logAbandoned false 标志是否为应用程序中遗弃语句或连接的代码开启日志堆栈追踪。
因为一个堆栈跟踪已被创建,被抛弃的语句和连接相关的日志将被覆盖到打开每个连接或者创建一个Statement时

如果你启用了removeAbandoned,则一个连接被池回收再利用是可能的,因为它被认为是已遗弃 在(getNumIdle() < 2) and (getNumActive() > getMaxTotal() - 3)成立时,这个机制将被触发。

 例如, maxTotal=20 ,这里有18个活跃连接,一个限制连接,将触发 "removeAbandoned"。但是只有在活动连接超过 "removeAbandonedTimeout" 所指定的秒数内未使用才会被删除(默认为300秒)。遍历一个结果集并不被统计为被使用,创建一个语句,预处理语句,可调用语句或使用它们其中的一个执行查询(使用执行方法中的某一个)会重新设置其父连接的lastUsed 属性

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tomcat自带连接池dbcp配置以及优化说明 的相关文章

  • opencv中的cv::ximgproc::SuperpixelSLIC,cv::ximgproc::SuperpixelSEEDS,SuperpixelLSC是超像素算法的

    可以研读下源码 集成到建筑物提取中
  • WorkPlus打造智慧企业移动门户,开启高效办公新时代

    在移动互联网时代 企业对于高效办公和便捷访问的需求不断增长 WorkPlus作为领先的品牌 致力于打造智慧企业移动门户 帮助企业实现高效协作与便捷访问 本文将重点介绍WorkPlus如何通过创新解决方案 为企业提供定制化的智慧移动门户 提升
  • kotlin.text.charsets

    java lang NoClassDefFoundError didn t find class kotlin text charsets Android studio项目中引入了自己下载的两个jar 3 10版本的okhttp和2 0版本
  • jQuery调用接口获取城市天气信息

    jQuery调用接口获取城市天气信息 代码如下
  • idea项目提交git报错bad revision ‘head‘

    报错 bad revision head 新建了一个文件夹 将后端项目 前端项目都放到这个文件夹里面去了 然后想提交git VCS gt import into Version control gt Create git Repositor
  • python中的pip、anaconda换国内源图文解析

    一 python中的pip换源 pip的源换成国内的源 1 首先在C Users 用户 自己的用户名目录下新建一个文件夹pip 2 之后在pip文件夹下新建一个pip txt 里边设置好国内的源 保存后改名为pip ini 文件内的内容如下
  • java中找不到符号是什么意思_JAVA小白入门很难发现的错误

    紧跟着上一篇文章 如何编写JAVA小白第一个程序 首先我们可以来做一下错误示范 这个是我们的Hello java文件 打开命令提示符 编译HelloWorld java 首先这肯定不是环境变量搞错了 可是我文件明明在目录下面 怎么就找不到文
  • Pandas50个高级高频操作

    01 复杂查询 实际业务需求往往需要按照一定的条件甚至复杂的组合条件来查询数据 接下来为大家介绍如何发挥Pandas数据筛选的无限可能 随心所欲地取用数据 1 逻辑运算 Q1成绩大于36df Q1 gt 36 Q1成绩不小于60分 并且是C
  • 构造函数&类属性和实例属性&析构函数

    1 构造函数 概念 构造函数包括 new 和 init 构造函数 也被称为构造器 指的是当创建对象的时候 被自动调用的函数 注意 在Python中 以 xxx 方式命名的函数被称为魔术函数 魔术方法 这类函数在使用的时候无需手动调用 在进行
  • 海得服务器虚拟机,海得PLC远程编程调试流程

    原标题 海得PLC远程编程调试流程 海得PLC远程编程调试流程 1 HINET智能网关LAN口默认IP地址是192 168 1 1 工业智能网关 2 假定PLC的IP地址是192 168 10 2 并且要求不能改变 海得plc 3 将HIN
  • 消息队列:Ubuntu16.04安装和Web页面管理RabbitMQ(楼主亲测、真实有效)

    RabbitMQ 总来来说 RabbitMQ的安装还是有一些难度的 不同的方式 安装的方法也是完全不一样 还要解决蛮多依赖 加上现在有些网站 极其不负责 很多博文都没有经过测试检验就直接发出来的 楼主来亲测一下 希望能对大家有好的帮助 一
  • C++ templates之“模板的模板参数”

    定义 指一个模板 它本身的参数类型就是模板 在英语原文中是 template template parameter 例如 template
  • hdu 5792 World is Exploding 2016 Multi-University 5

    Problem acm hdu edu cn showproblem php pid 5792 题意 给一个序列 V 问有多少个由下标组成的四元组 a b c d 满足 a b c d a lt b c lt d Va lt Vb Vc g
  • 在centos7安装anaconda步骤,亲测。

    在centos7上安装anaconda碰到很多的坑 分享出来 也免得以后自己忘记 第一步 首先anaconda官网下载linux安装包 网址为 https www anaconda com 或者在清华镜像下载 https mirrors t
  • konisGraph学习。复杂查询优化记录

    最近有需求是查两个公司之间的投资关系 比如 a和b之间有哪些直接投资和间接投资 例如 a gt b a gt e gt b a gt c gt d gt b b gt f gt a 需求是查出7跳以内的ab之间的投资关系 v的标签是comp
  • inline内联函数的作用和几点注意

    一 关键字inline必须与函数定义体放在一起才能使函数成为内联 仅将inline放在函数声明前面不起任何作用 二 定义在类声明之中的成员函数将自动地成为内联函数 以上可参考 http blog 163 com jinyongming bl
  • 矩阵求导 两种布局 及常用基础公式

    一 矩阵求导的两种形式 刚开始看矩阵求导这一块的时候发现一模一样的两个公式 在不同地方结果老是不一样 给我看懵了好一阵子 后来才发现原来有两种布局模式 都是可以的 矩阵求导的布局方式有两种 分子布局和分母布局 下面以 小写字母 小写粗体字母
  • stm32晶振配置不一致导致 Invalid Rom Table 至芯片锁死解决方案

    参考博文 Invalid ROM Table原因及解决办法 STM32芯片锁死问题 概述 在调试STM32时 出现如下的现象 软件写好之后首次下载程序至芯片时成功 但程序未能正常运行 之后再下载程序时便报错 Invalid ROM Tabl
  • RPC 服务优雅停机、优雅重启,你的服务重启够优雅吗?

    关注公众号 1024个为什么 及时接收最新推送文章 背景 由于最近上线比较频繁 就遇到了一个小概率的数据不一致的问题 具体过程如下 很明显 是服务没有做到优雅停机 导致的两个服务的数据不一致 优雅停机 优雅重启 本质到底是什么 优雅重启涵盖
  • 【最简单】STM32+ESP8266+MQTT+EMQX完成数据上传和点灯环节

    首先要吐槽一点 那就是网络上的这方面资料杂七杂八 而且很多都是一模一样的 然后我作为一个学生 没有多大的本事 就是想实现最基本的功能 然后在此基础上慢慢拓展 所以那些十分庞大的工程或者一些IoT物联网平台的官方SDK对于我来说是比较难看懂的

随机推荐

  • js、vue、vue3.0、时间格式转换函数

    时间戳转换时间格式 时间戳转任意时间格式 调用方法 gt this getDate 1626137166000 m d H i this getDate 1626137166000 等等 getDate function date form
  • c++ string中的data()和c_str() 区别与联系

    c str 返回的是const char 类型的指针 无法修改指针指向字符串的值 data 有两种版本 一种返回的是const char 类型的指针 此时与上面的c str 用法完全一致 网上有说c str返回的会加上 0 可能不同版本不一
  • 电路基础(2)电阻电路的等效变换

    1 电路的等效变换 两端网络 任何一个复杂的电路 向外引出两个端钮 且从一个端子流入的电流等于从另一端子流出的电流 则称这一电路为二端网络 或一端口网络 两端电路等效 两个两端电路 端口具有相同的电压 电流关系 则称它们是等效的电路 两电路
  • WordPress BuddyPress 存在越权漏洞RCE(CVE-2021-21389)

    一 漏洞描述 BuddyPress 是一个用于构建社区站点的开源 WordPress 插件 在 7 2 1 之前的 5 0 0 版本的 BuddyPress 中 非特权普通用户可以通过利用 REST API 成员端点中的问题来获得管理员权限
  • 错误,调试

    有些也写在了开发工具 xcode中 http article ityran com archives 1143 1 编译iPad真机时 选择了 Architetures Standard armv6 BaseSDK iPhoneDevice
  • 神经网络算法的基本原理,神经网络算法都有哪些

    神经网络算法的三大类分别是 神经网络算法的三大类分别是 1 前馈神经网络 这是实际应用中最常见的神经网络类型 第一层是输入 最后一层是输出 如果有多个隐藏层 我们称之为 深度 神经网络 他们计算出一系列改变样本相似性的变换 各层神经元的活动
  • GeoServer发布地图服务并在OpenLayers中显示:shp的WMS服务和GeoTIFF的WTMS服务

    GeoServer发布的地图服务结构如下 必须创建一个工作区 该工作区下可以存放多组无关数据 也就是说 工作区的作用就类似于一个文件夹 仅仅用于分类 在工作区下添加数据存储 数据存储即一组相关数据 通常 一个地区的地图可能是单个文件构成 也
  • vim进阶

    首先晒一张我的vim截图 基本IDE有的功能都能实现了 虽然在日常工作里还是IDE用的多 但是作为一个开发者 少不了折腾的心 vim 作为与emacs齐名的编辑器 无需更多溢美之词 由于学习曲线陡峭 但是学会之人 无不表示其方便 vim操作
  • Docker 安装 MySQL、Redis、Nginx

    222 1 Portainer 安装 docker可视化 2 Docker 安装MySQL 3 Docker安装Redis 4 Docker安装 Nginx 1 Portainer 安装 docker可视化 docker run d p 8
  • C++多线程(三)事件

    事件 解决两个线程通信问题 要注意死锁 g hEvent CreateEvent NULL FALSE FALSE NULL WaitForSingleObject g hEvent INFINITE ResetEvent g hEvent
  • ubuntu18-opencv3.4.6移植到aarch64

    一 前提条件 需先安装好arm64相关的交叉编译器 安装好cmake gui 下载并解压opencv3 4 6 下载ippicv 2019 lnx intel64 general 20180723 tgz 二 配置cmake 进入openc
  • Unity初学者学习路线与建议

    Unity初学者学习路线与建议 目录 Unity初学者学习路线与建议 一 前言 二 我的学习建议 三 学习要点 一 前言 Holle大家好 先自我介绍一下 我现在大二 专业是数字媒体技术 方向是游戏制作 学的是Unity 和我同专业的另一个
  • Ubuntu 16.04安装MinGW32

    直接使用命令 sudo apt get install mingw32 会报错 Unable to locate package mingw32 解决办法如下 sudo gedit etc apt sources list 在sources
  • ModBus-RTU详解

    Modbus 一个工业上常用的通讯协议 一种通讯约定 Modbus协议包括RTU ASCII TCP 其中MODBUS RTU最常用 比较简单 在单片机上很容易实现 虽然RTU比较简单 但是看协议资料 手册说得太专业了 起初很多内容都很难理
  • Mysql中字符串正确的连接方法

    虽然SQL server和My sql的语句基本都一致 但是仍然存在一些小区别 就如字符串的连接来说 SQL server中的字符串连接是使用 来连接 不带引号sql server是做加法运算 而my sql中无论是带引号和不带引号 它都将
  • 无缓存交换

    请编写一个函数 函数内不使用任何临时变量 直接交换两个数的值 给定一个int数组AB 其第零个元素和第一个元素为待交换的值 请返回交换后的数组 测试样例 1 2 返回 2 1 思路 使用异或 public int exchangeAB in
  • python3生成中文词云图

    usr bin python3 coding utf 8 coding utf 8 导入wordcloud模块 from wordcloud import WordCloud 中文分词库 pip install jieba import j
  • BMP to AVI 及其压缩的实现

    1 设计方案的产生 这个设计方案是物光院嵌入式系统试验室的基于CDMA技术的无线视频传输监控系统的设计的一部分 我简要说明此系统的原理 系统单片机部分主要模块由CDMA DSP与ARM处理器 FLASH ROM组成 此单片机用来获取监控所在
  • python+selenium 处理需要确定证书对话框

    场景如下 使用selenium 处理网页时 碰到了跳出证书的情况 如下图 所见 当使用get请求网页的时候 由于网页一直处于跳出状态 无法使用页面内容来进行操作 只能卡死在这一步 考虑到只需要在当前页面用鼠标点击或者键盘回车即可 但是sel
  • tomcat自带连接池dbcp配置以及优化说明

    转自 http www totcms com html 201602 29 20160229114145 htm 一个网站每天大概有20万的访问量 使用的tomcat自带dbcp连接池 一般网站访问很好 速度也很快 但是过一段时间后 总是报