君子博学而日参省乎己 则知明而行无过矣

博客园 首页 新随笔 联系 订阅 管理

数据库连接的建立与关闭对于一个应用来说是耗费系统资源的操作。传统的数据库连接是通过DriveManager来实现的,每个数据库连接对象都对应了一个实际的物理数据库连接,每次都要新建一个数据库连接,并且在使用完毕之后要负责关闭这个连接,这样不仅造成了系统资源的浪费,而且也不利于连接资源的管理。 
  
    数据库连接池的作用就是创建一个数据库连接的缓冲池,应用程序启动的时候会预先新建一定数量的连接,放入这个缓冲池中待用,当应用程序需要一个数据库连接的时候,它可以从这个缓冲池中取出一个现成的连接来使用,在使用完毕之后再归还给这个缓冲池。这样的话,数据库连接的资源就能很好的被管理起来了。 

    当连接池中的连接都被用光的时候,如果这个时候还需要空闲的数据库连接的话,可以再新建立一定数量的连接,放入缓冲池中以提供应用程序的需求。当然,这个连接的数量并不是可以无限制的扩大的,我们可以通过设定连接池中的最大连接数来防止系统无限制的建立与数据库的连接。 

    如果这个时候连接池中的连接全都在使用中,并且当前连接池中的连接已经达到了所允许的最大连接数,就等待一段事件,如果在等待的时间内有连接被释放出来,那么就可以被分配给当前正在等待的用户,如果等待时间超过了设置的最大等待时间也一直没有线程归还连接,那么当前的请求连接的线程将返回null,抛出异常,这个异常最终将层层往上,一直到servlet处被处理。 

    数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。 

    Spring可以用来管理数据库连接。 
    Spring包含了两个数据源的实现类包:DBCP与C3P0。 

1、DBCP的数据库连接池配置: 

Java代码  收藏代码
  1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  2.     <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
  3.     <property name="url" value="jdbc:mysql://localhost/ad?useUnicode=true&amp;characterEncoding=GBK&amp;jdbcCompliantTruncation=false"/>  
  4.     <property name="username" value="root"/>  
  5.     <property name="password" value="root"/>                
  6.     <!-- 连接池中初始化的连接数量 -->  
  7.     <property name="initialSize" value="1"/>        
  8.     <!-- 最小连接数量 -->  
  9.     <property name="minActive" value="1"/>  
  10.     <!-- 最大连接数量 -->  
  11.     <property name="maxActive" value="20"/>         
  12.     <!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->  
  13.     <property name="maxWait" value="1000"/>         
  14.     <!-- 最大空闲连接 -->  
  15.     <property name="maxIdle" value="20"/>       
  16.     <!-- 最小空闲连接 -->  
  17.     <property name="minIdle" value="5"/>        
  18.     <property name="defaultAutoCommit" value="false"></property>  
  19. </bean>  



    数据库连接池在初始化的时候会创建一定数量的数据库连接,如果设置了rmoveAbandoned=true,那么在使用的过程中,系统会对无效的数据库连接进行回收。但是连接池将保证一定会持有一定数量的数据库连接,无论这些数据库连接是否被使用,都不会被回收,这个就是minActive。因此,如果应用程序对数据库连接的使用量不大,那么minActive太大的话将造成大量的数据库连接资源都被闲置,浪费。 

    maxActive最大连接数是连接池能申请的最大连接数,如果对数据库连接的请求超过这个数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。 

2、C3P0的数据库连接池配置 

Java代码  收藏代码
  1. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  
  2.     <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
  3.     <property name="url" value="jdbc:mysql://localhost/ad?useUnicode=true&amp;characterEncoding=GBK&amp;jdbcCompliantTruncation=false"/>  
  4.     <property name="username" value="root"/>  
  5.     <property name="password" value="root"/>  
  6.               
  7.     <!-- 连接池中保留的最小连接数 -->  
  8.     <property name="minPoolSize" value="1"/>        
  9.     <!-- 连接池中保留的最大连接数 -->  
  10.     <property name="maxPoolSize" value="20"/>       
  11.     <!-- 最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->  
  12.     <property name="maxIdleTime" value="1800"/>         
  13.     <!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->  
  14.     <property name="acquireIncrement" value="3"/>       
  15.     <!-- 最大的PreparedStatement的数量 -->  
  16.     <property name="maxStatements" value="1000"/>       
  17.     <!-- 每60秒检查所有连接池中的空闲连接。Default: 0 -->  
  18.     <property name="idleConnectionTestPeriod" value="0"/>       
  19.     <!-- 定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->  
  20.     <property name="acquireRetryAttempts" value="30"/>          
  21.     <property name="breakAfterAcquireFailure" value="true"/>  
  22.     <property name="testConnectionOnCheckout" value="false"/>  
  23. </bean>  



    注意的是C3P0中有个参数为”acquireIncrement”,这个参数表示的意义是:当连接池中的没有空闲的连接的时候,如果有新的数据库连接请求的话,C3P0会一次性新建3个数据库连接放入缓冲池中。 

posted on 2013-07-15 02:52  刺猬的温驯  阅读(86)  评论(0)    收藏  举报