spring数据源(database-datasource)

本文深入探讨了在数据库连接管理中,如何利用Spring框架整合C3P0、DBCP、Proxool等连接池技术,实现高效、稳定的数据访问。包括配置细节、性能优化、以及与JNDI、Tomcat集成的实践案例。

hibernate开发组推荐c3p0

spring开发组推荐dbcp 

dbcp的配置:

#连接设置
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:DBSERVER
jdbc.username=user
jdbc.password=pass

#<!-- 初始化连接 -->
dataSource.initialSize=10

#<!-- 最大空闲连接 -->
dataSource.maxIdle=20

#<!-- 最小空闲连接 -->
dataSource.minIdle=5

#最大连接数量
dataSource.maxActive=50

#是否在自动回收超时连接的时候打印连接的超时错误
dataSource.logAbandoned=true

#是否自动回收超时连接
dataSource.removeAbandoned=true

#超时时间(以秒数为单位)
dataSource.removeAbandonedTimeout=180

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
dataSource.maxWait=1000

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${db.driverClassName}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>

 <property name="validationQuery">
<value>SELECT 1</value>
</property>
<property name="testOnBorrow">
<value>true</value>
</property>
</bean>

c3p0的配置:

<bean id="fidsDatasource"   
        class="com.mchange.v2.c3p0.ComboPooledDataSource" 
        destroy-method="close">
        <property name="driverClass">
            <value>${db.driverClass}</value>
        </property>
        <property name="jdbcUrl">            
            <value>${db.jdbcurl}</value>
        </property>
        <property name="user">
            <value>${db.user}</value>
        </property>
        <property name="password">
            <value>${db.password}</value>
        </property>
        <property name="minPoolSize">
            <value>15</value>
        </property>
        <property name="acquireIncrement">
            <value>10000</value>
        </property>
        <property name="maxPoolSize">
            <value>25</value>
        </property>
    </bean>



1.来至于JNDI Java Naming and Directory Interface (使用tomcat作为实例)

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/testDB"></property>//代表命名服务目录名称为jdbc/testDB(实际为:
java:comp/env/jdbc/testDB)

<property name="resourceRef" value="true"></property>加上这个的意思是不用使用java:comp/env/jdbc/testDB来设置jndiName
</bean>

或者使用

在xml使用jee命名空间

    xmlns:jee="http://www.springframework.org/schema/jee"

  http://www.springframework.org/schema/jee/spring-jee-2.5.xsd

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/testDB" resource-ref="true" />

  tomcat中的context.xml中配置

  <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/hibernate"/>

 在工程的web.xml中配置

<resource-ref>
<res-ref-name>jdbc/testDB</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

 

测试:

   javax.naming.InitialContext cxt;
   cxt = new InitialContext();
   DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/TestDB" );

 

2.使用数据源连接池

如果jndi不能获取到数据源,那么就是用连接池,spring并没有提供连接池

但jakarta commons database connection pools (DBCP)提供了一个。

<bean id="dataSource"
  class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName"
   value="${database.driverClassName}">
  </property>
  <property name="url" value="${database.url}"></property>
  <property name="username" value="${database.username}"></property>
  <property name="password" value="${database.password}"></property>
    <property name="maxActive" value="${database.maxActive}"></property>
    <property name="maxIdle" value="${database.maxIdle}"></property>
     <property name="removeAbandoned" value="${database.removeAbandoned}"></property>
 <property name="removeAbandonedTimeout" value="${database.removeAbandonedTimeout}"></property>
 <property name="maxWait" value="${database.maxWait}"></property> 
  <property name="logAbandoned" value="${database.logAbandoned}"></property>
  </bean>

  <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list><value>classpath:jdbc.properties</value>
<value>classpath:otherParams.properties</value>
</list>
</property>
</bean>

initialSize属性 池启动的时候创建的连接数量

maxActive 同一时间可以从连接池中分配的最多连接数量。设置为0为无限制

maxIdle   池里不会被释放的最多空闲连接数,设置为0表示为无限制

maxOpenPreparedStatements   同一时间能够从语句池里分配的已备语句的最大数量。设置为0表示无限制。

maxWait 在抛出异常前,池等待连接被收回的最长时间。 -1为无限等到。

minEvictableIdleTimeMillis  连接报错空闲而不被驱逐的最长时间

minIdle  在不创建新连接的情况下,最少保持空闲的连接数目。

poolPreparedStatements  是否对已备语句进行池管理。

 

3.jdbc驱动的数据源
(1)DiverManagerDataSource提供的连接没有池管理。每次都是新连接。(以牺牲性能为代价)

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" value="com.mysql.driver.jdbcDriver" />

<property name="url" value="..." />

 <property name="username" ....

<property name="password" ....

</bean>

(2)org.springframework.jdbc.datasource.SingleConnectionDataSource
只使用一个数据连接。相当于整个数据库就只有一个连接。不适用于并发程序。



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

一、连接池概述
 数据库连接池概述:
  数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个
应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
  数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时
间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
  数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些
数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接
数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设
置要考虑到下列几个因素:
  1) 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;
  2) 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之
后的数据库操作。
  3) 如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库
连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
目前常用的连接池有:C3P0、DBCP、Proxool
网上的评价是:
C3P0比较耗费资源,效率方面可能要低一点。
DBCP在实践中存在BUG,在某些种情会产生很多空连接不能释放,Hibernate3.0已经放弃了对其的支持。
Proxool的负面评价较少,现在比较推荐它,而且它还提供即时监控连接池状态的功能,便于发现连接泄漏的情况。
配置如下:
1、在spring配置文件中,一般在applicationContext.xml中
     <bean id="proxoolDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
            <property name="driver" value="${jdbc.connection.driverClassName}"/>
            <property name="driverUrl" value="${jdbc.connection.url}"/>
            <property name="user" value="${jdbc.connection.username}"/>
            <property name="password" value="${jdbc.connection.password}"/>
            <!-- 测试的SQL执行语句 -->
           <property name="houseKeepingTestSql" value="${proxool.houseKeepingTestSql}"/>
            <!-- 最少保持的空闲连接数 (默认2个) -->
             <property name="prototypeCount" value="${proxool.prototypeCount}"/>
            <!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒) -->
            <property name="houseKeepingSleepTime" value="${proxool.hourseKeepingSleepTime}"/>
            <!-- 最大活动时间(超过此时间线程将被kill,默认为5分钟) -->
             <property name="maximumActiveTime" value="${proxool.maximumActiveTime}"/>
            <!-- 连接最长时间(默认为4个小时) -->
            <property name="maximumConnectionLifetime" value="${proxool.maximumConnectionLifetime}"/>
            <!-- 最小连接数 (默认2个) -->
            <property name="minimumConnectionCount" value="${proxool.minimumConnectionCount}"/>
            <!-- 最大连接数 (默认5个) -->
            <property name="maximumConnectionCount" value="${proxool.maximumConnectionCount}"/>
            <!-- -->
            <property name="statistics" value="${proxool.statistics}"/>
            <!-- 别名 -->
             <property name="alias" value="${proxool.alias}"/>
            <!-- -->
            <property name="simultaneousBuildThrottle" value="${proxool.simultaneous-build-throttle}"/>
     </bean>
     然后注入到sessionFactory中
     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
           <property name="dataSource" ref="proxoolDataSource"/>
     </bean>
 
Porxool 配置文件 
--==--==--==--==--==<proxool.xml>==--==--==--==--==--==--== 
<?xml version="1.0" encoding="UTF-8"?> 
<proxool> 
      <alias>WMS</alias> 
      <driver-url>jdbc:postgresql://192.168.210.184:5432/wms</driver-url> 
      <driver-class>org.postgresql.Driver</driver-class> 
      <driver-properties> 
             <property name="user" value="wms_user" /> 
             <property name="password" value="wms" /> 
      </driver-properties> 
      <minimum-connection-count>2</minimum-connection-count> 
      <maximum-connection-count>40</maximum-connection-count> 
      <simultaneous-build-throttle>20</simultaneous-build-throttle> 
      <prototype-count>2</prototype-count> 
      <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql> 
</proxool> 
--==--==--==--==--==<proxool.xml>==--==--==--==--==--==--== 
  
配置说明: 
alias                                          -〉数据库连接别名(程序中需要使用的名称) 
driver-url                                   -〉数据库驱动 
driver-class                                -〉驱动程序类 
driver-properties                        -〉联机数据库的用户和密码 
minimum-connection-count          -〉最小连接数量,建议设置0以上,保证第一次连接时间 
maximum-connection-count         -〉最大连接数量,如果超过最大连接数量则会抛出异常。连接数设置过多,服务器CPU和内存性能消耗很
大。 
simultaneous-build-throttle          -〉同时最大连接数 
prototype-count                          -〉一次产生连接的数量。 
                                                 例:如果现在prototype-count设置为4个,但是现在已经有2个可以获得的连接,那么
将会试图再创建2个连接。 
                                                  但不能超过最大连接数。 
maximum-active-time                 -〉连接最大时间活动 默认5分钟 
maximum-connection-lifetime      -〉连接最大生命时间 默认4小时

-----------------------------------------------------------
数据源配置: 

database.properties内容: 
Java代码   收藏代码
  1. UserName=***  
  2. Password=*****  
  3. jdbc.DriverClassName=com.mysql.jdbc.Driver  
  4. jdbc.url=jdbc:mysql://localhost:3306/databaseName  
  5. jdbc.username=${UserName}  
  6. jdbc.password=${Password}  
  7. jdbc.maxActive=10  
  8. jdbc.maxIdle=5  
  9. jdbc.maxWait=10000  


ibatis模板类配置: 
Java代码   收藏代码
  1. <context:property-placeholder location="classpath:database.properties" />  
  2.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
  3.         destroy-method="close">  
  4.         <property name="url" value="${jdbc.url}" />  
  5.         <property name="driverClassName" value="${jdbc.DriverClassName}" />  
  6.         <property name="username" value="${jdbc.username}" />  
  7.         <property name="password" value="${jdbc.password}" />  
  8.         <property name="maxActive" value="${jdbc.maxActive}" />  
  9.         <property name="maxIdle" value="${jdbc.maxIdle}" />  
  10.         <property name="maxWait" value="${jdbc.maxWait}" />  
  11.     </bean>  
  12.   
  13. <!-- 声明iBatis模板类 -->  
  14.     <bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">  
  15.         <property name="sqlMapClient">  
  16.             <bean class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">  
  17.                 <property name="dataSource" ref="dataSource" />  
  18.                 <property name="configLocation" value="classpath:sqlMapConfig.xml" />  
  19.             </bean>  
  20.         </property>  
  21.     </bean>  


sqlMapConfig.xml 内容: 
Java代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE sqlMapConfig        
  3.     PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"        
  4.     "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">  
  5. <sqlMapConfig>  
  6.     <settings cacheModelsEnabled="false" enhancementEnabled="true"  
  7.         lazyLoadingEnabled="true" useStatementNamespaces="true" />  
  8.     <sqlMap resource="com/UserInfo.xml" />  
  9. </sqlMapConfig>  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值