Spring 中数据源和数据库连接池配置的几种方法

来源:互联网 发布:UC数据库设计 编辑:程序博客网 时间:2024/05/01 04:11

原文地址:http://blog.csdn.net/liyangbing315/article/details/4730961


Spring 中数据源和数据库连接池配置的几种方法

一、           数据源的配置:

*    与 Hibernate 集成最常见的一种:

<!-- 配置 sessionFactory -->

       < bean id = "sessionFactory" class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >

              < property name = "configLocation" >

                     < value > classpath:hibernate.cfg .xml </ value >

              </ property >

              <!-- < property name = "configLocation" value = "classpath:hibernate.cfg.xml" >

              </ property > -->

       </ bean >      

      

       <!-- 配置事务管理器 -->   

       < bean id = "transactionManager" class ="org.springframework.orm.hibernate3.HibernateTransactionManager" >

              < property name = "sessionFactory" >

                     < ref local = "sessionFactory" />

              </ property >

       </ bean >

*    DataSource 单独配置:

  < bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" >

          < property name = "driverClassName" value = "com.mysql.jdbc.Driver" />

              < property name = "url" value = "jdbc:mysql://127.0.0.1/test" />

              < property name = "username" value = "root" />

              < property name = "password" value = "root" />

    </ bean >

   

       <!-- 配置 sessionFactory -->

       < bean id = "sessionFactory" class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >

              < property name = "dataSource" ref = "dataSource" ></ property >

              < property name = "configLocation" value = "classpath:hibernate.cfg.xml" >

              </ property >

       </ bean >      

      

       <!-- 配置事务管理器 -->   

       < bean id = "transactionManager" class ="org.springframework.jdbc.datasource.DataSourceTransactionManager" >

       < property name = "dataSource" >

              < ref local = "dataSource" />

       </ property >

              <!--<property name="sessionFactory">

                     <ref local="sessionFactory"/>

              </property>

       --> </ bean >

*取消掉 hibernate.cfg.xml 的配置文件直接配置在 Spring 中

<!-- 配置 sessionFactory -->

       <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

              <property name="dataSource" ref="dataSource"/>

              <property name="hibernateProperties">

                     <props>

                            <prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>

                            <prop key="hibernate.hbm2ddl.auto">true</prop>

                            <prop key="hibernate.show_sql">true</prop>

                     </props>

              </property>

              <property name="mappingResources">

                     <list>

                            <value>com/bjsxt/model/Dictionary.hbm.xml</value>

                            <value>com/bjsxt/model/User.hbm.xml</value>

                            <value>com/bjsxt/model/Customer.hbm.xml</value>

                            <value>com/bjsxt/model/ContactPerson.hbm.xml</value>

                     </list>

              </property>

              <!--<property name="configLocation">

                     <value>classpath:hibernate.cfg.xml</value>

              </property>

       --></bean>

       <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

              <property name="dataSource">

                     <ref local="dataSource"/>

              </property>

       </bean>

二、           数据库连接池的配置 :

在传统的两层结构中,客户端程序在启动时打开数据库连接,在退出程序时关闭数据库连接。这样,在整个程序运行中,每个客户端始终占用一个数据库连接,即使在大量没有数据库操作的空闲时间,如用户输入数据时,从而造成数据库连接的使用效率低下。

在三层结构模式中,数据库连接通过中间层的连接池管理。只有当用户真正需要进行数据库操作时,中间层才从连接池申请一个连接,数据库操作完毕,连接立即释放到连接池中,以供其他用户使用。这样,不仅大大提高了数据库连接的使用效率,使得大量用户可以共享较少的数据库连接,而且省去了建立连接的时间。

 

关于数据库连接池几个属性的说明 :

△        最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;

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

△        如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

Xml 代码

1.      <!-- JDBC 驱动程序 -->   

2.      <property name = "connection.driver_class" > com.mysql.jdbc.Driver</property>

3.      <property name = "connection.url" > jdbc:mysql://localhost:3306/struts?useUnicode = true & characterEncoding = GBK </property> <!-- 数据库用户名 -->  

1.      <property name = "connection.username" > root </property> <!-- 数据库密码 -->   

2.      <property name = "connection.password" > 8888 </property>    

上面的一段配置,在 c3p0 和 dbcp 中,都是必需的,因为 hibernate 会根据上述的配置来生成 connections ,再交给 c3p0 或 dbcp 管理 .

1 C3P0 

只需在 hibernate.cfg.xml 中加入

Xml 代码

1.      <property name = " c3p0.min_size" > </property>   

2.      <property name = " c3p0.max_size" > 30 </property>   

3.      <property name = " c3p0.time_out" > 1800 </property>   

4.      <property name = " c3p0.max_statement" > 50 </property>    

还有在 classespath 中加入 c3p0-0.8.4.5.jar

2 dbcp 

在 hibernate.cfg.xml 中加入

Xml 代码

1.      <property name = " dbcp.maxActive" > 100 </property>   

2.      <property name = " dbcp.whenExhaustedAction" > </property>   

3.      <property name = " dbcp.maxWait" > 60000 </property>   

4.      <property name = " dbcp.maxIdle" > 10 </property>   

5.        

6.      <property name = " dbcp.ps.maxActive" > 100 </property>   

7.      <property name = " dbcp.ps.whenExhaustedAction" > </property>   

8.      <property name = " dbcp.ps.maxWait" > 60000 </property>   

9.      <property name = " dbcp.ps.maxIdle" > 10 </property>   

还有在 classespath 中加入 commons-pool-1.2.jar 和 commons-dbcp-1.2.1.jar.

3) proxool

在 hibernate.cfg.xml 中增加:

Xml 代码

1.      <property name = "hibernate.proxool.pool_alias" > dbpool </property>   

2.      <property name = "hibernate.proxool.xml" > proxool.xml </property>   

3.      <property name = "connection.provider_class" >org.hibernate.connection.ProxoolConnectionProvider </property>   

3) 、在与 hibernate.cfg.xml 同级目录( src 根目录下)增加 proxool.xml 文件:

Xml 代码

1.      <?xml version = "1.0" encoding = "utf-8" ?>   

2.      <!-- the proxool configuration can be embedded within your own application's.   

3.      Anything outside the "proxool" tag is ignored. -- >   

4.      <something-else-entirely>   

5.      <proxool>   

6.          <alias> dbpool </alias>   

7.          <!--proxool 只能管理由自己产生的连接 -->   

8.          <driver-url>   

9.            jdbc:mysql://127.0.0.1:3306/wlsh? characterEncoding = GBK & useUnicodetrue & autoReconnect = true       </driver-url>   

10.     <driver-class> com.mysql.jdbc.Driver </driver-class>   

11.     <driver-properties>   

12.         <property name = "user" value = "root" />   

13.         <property name = "password" value = "123456" />   

14.     </driver-properties>   

15.     <!-- proxool 自动侦察各个连接状态的时间间隔 ( 毫秒 ), 侦察到空闲的连接就马上回收 , 超时的销毁 -->   

16.     <house-keeping-sleep-time> 90000 </house-keeping-sleep-time>   

17.     <!-- 最少保持的空闲连接数 -->   

18.     <prototype-count> </prototype-count>   

19.     <!-- 允许最大连接数 , 超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由 maximum-new-connections 决定 -->   

20.     <maximum-connection-count> 100 </maximum-connection-count>   

21.     <!-- 最小连接数 -->   

22.     <minimum-connection-count> 10 </minimum-connection-count>   

23. </proxool>   

24. </something-else-entirely>   


于在 hibernate3.0 中,已经不再支持 dbcp 了, hibernate 的作者在 hibernate.org 中,明确指出在实践中发现 dbcp  BUG, 在某些种情会产生很多空连接不能释放,所以抛弃了对 dbcp 的支持。至于 c3p0 ,有评论说它的算法不是最优的,因为网上查资料得知:有网友做了一个实验,在同一项目中分别用了几个常用的连接池,然后测试其性能,发现c3p0 占用资源 比较 大,效率也不高。所以,基于上述原因, proxool 不少行家推荐使用,而且暂时来说,是负面评价是最少的一个。在三星中也有项目是用 proxool 的。 从性能和出错率来说, proxool 稍微比前两种好些。 C3P0 ,稳定性似乎不错,在这方面似乎有很好的口碑。至于 性能 ,应该不是最好的,算是中规中矩的类型。 
 Proxool 的口碑似乎很好,不大见到负面的评价,从官方资料上来看,有许多有用的特性和特点,也是许多人推荐的。

 

 

4 . JNDI 连接池 ,数据源已经由应用服务配置好 ( 如 Web 服务器 ) , Hibernate 需要做的只是通过 JNDI 名查找到此数据源。应用服务器将连接池对外显示为 JNDI 绑定数据源,它是 javax.jdbc.Datasource 类的一个实例。只要配置一个 Hibernate 文件,如: 

hibernate.connection.datasource=java:/comp/env/jdbc/schoolproject //JNDI 名 

hibernate.transaction.factory_class = net.sf.hibernate.transaction.JTATransactionFactory 

hibernate.transaction.manager_loopup_class = 

org.hibernate.transaction.JBossTransactionManagerLookup 

hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect

同样我们可以把上面的代码配置到 Spring 中:

1 dbcp

< bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" >

          < property name = "driverClassName" value = "com.mysql.jdbc.Driver" />

              < property name = "url" value = "jdbc:mysql://127.0.0.1/test" />

              < property name = "username" value = "root" />

              < property name = "password" value = "root" />

              < property name = "maxActive" value = "80" />

              < property name = "maxIdle" value = "20" />

              < property name = "maxWait" value = "3000" />

</ bean >

3.      c3p0

<!-- close() 方法,确保在 spring 容器关闭时数据源能够成功释放 -->

       < bean id = "dataSource" class ="com.mchange.v2.c3p0.ComboPooledDataSource" >

              < property name = "driverClass" value = "com.mysql.jdbc.Driver" />

              < property name = "jdbcUrl" value = "jdbc:mysql://127.0.0.1/test" />

              < property name = "user" value = "root" />

              < property name = "password" value = "root" />

             

              <!-- 当连接池中的连接用完时, c3p0 一次性创建连接的数目 -->

              < property name = "acquireIncrement" value = "5" />

             

              <!-- 定义从数据库获取新连接失败后重复尝试获取连接的次数,默认为 30 -->

              < property name = "acquireRetryAttempts" value = "30" />

             

              <!-- 定义两次连接中间隔的时间,单位毫秒,默认为 1000 -->

              < property name = "acquireRetryDelay" value = "1000" />

              < property name = "idleConnectionTestPeriod" value = "3000" />

             

              <!-- 当连接池用完时客户端调用 getConnection() 后等待获取新连接的时间,

              超时后将抛出 SQLException ,如设为 0 则无限期等待。单位毫秒,默认为 0    -->

              < property name = "checkoutTimeout"   value = "3000" />

              < property name = "maxPoolSize" value = "80" />

              < property name = "minPoolSize" value = "1" />

             

              <!-- JDBC 的标准参数,用以控制数据源内加载的 PreparedStatement 数量。

              但由于预缓存的 Statement  于单个 Connection 而不是整个连接池。

              所以设置这个参数需要考虑到多方面的因素,如果 maxStatements 

              maxStatementsPerConnection 均为 0 ,则缓存被关闭。默认为 0 

                -->

              < property name = "maxStatements" value = "6000" />

              < property name = "initialPoolSize" value = "5" />

             

</ bean >

注:其他参数的意义;

  C3P0 拥有比 DBCP 更丰富的配置属性,通过这些属性,可以对数据源进行各种有效的控制:  
    acquireIncrement :当连接池中的连接用完时, C3P0 一次性创建新连接的数目;  
    acquireRetryAttempts :定义在从数据库获取新连接失败后重复尝试获取的次数,默认为 30 ;  
    acquireRetryDelay :两次连接中间隔时间,单位毫秒,默认为 1000 ;  
    autoCommitOnClose :连接关闭时默认将所有未提交的操作回滚。默认为 false ;  
    automaticTestTable :  C3P0 将建一张名为 Test 的空表,并使用其自带的查询语句进行测试。如果定义了这个参数,那么属性 preferredTestQuery 将被忽略。你   不能在这张 Test 表上进行任何操作,它将中为 C3P0 测试所用,默认为 null ;  
    breakAfterAcquireFailure :获取连接失败将会引起所有等待获取连接的线程抛出异常。但是数据源仍有效保留,并在下次调     用 getConnection() 的时候继续尝试获取连接。如果设为 true ,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。默认为  false ;  
    checkoutTimeout :当连接池用完时客户端调用 getConnection() 后等待获取新连接的时间,超时后将抛出 SQLException ,如设为 0 则无限期等待。单位毫秒,默认为 0;  
    connectionTesterClassName :   通过实现 ConnectionTester 或QueryConnectionTester 的类来测试连接,类名需设置为全限定名。默认为 com.mchange.v2.C3P0.impl.DefaultConnectionTester ;  
    idleConnectionTestPeriod :隔多少秒检查所有连接池中的空闲连接,默认为 0 表示不检查;  
    initialPoolSize :初始化时创建的连接数,应在 minPoolSize 与 maxPoolSize 之间取值。默认为 3 ;  
    maxIdleTime :最大空闲时间,超过空闲时间的连接将被丢弃。为 0 或负数则永不丢弃。默认为 0 ;  
    maxPoolSize :连接池中保留的最大连接数。默认为 15 ;  
    maxStatements : JDBC 的标准参数,用以控制数据源内加载的PreparedStatement 数量。但由于预缓存的 Statement 属   于单个 Connection 而不是整个连接池。所以设置这个参数需要考虑到多方面的因素,如果 maxStatements 与 maxStatementsPerConnection 均为 0 ,则缓存被关闭。默认为 0 ;  
    maxStatementsPerConnection :连接池内单个连接所拥有的最大缓存 Statement数。默认为 0 ;  
    numHelperThreads : C3P0 是异步操作的,缓慢的 JDBC 操作通过帮助进程完成。扩展这些操作可以有效的提升性能,通过多线程实现多个操作同时被执行。默认为 3 ;  
    preferredTestQuery :定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个参数能显著提高测试速度。测试的表必须在初始数据源的时候就存在。默认为 null ;  
    propertyCycle :   用户修改系统配置参数执行前最多等待的秒数。默认为 300 ;  
    testConnectionOnCheckout :因性能消耗大请只在需要的时候使用它。如果设为true 那么在每个 connection 提交的时候都   将校验其有效性。建议使用idleConnectionTestPeriod 或 automaticTestTable 
等方法来提升连接测试的性能。默认为 false ;  
    testConnectionOnCheckin :如果设为 true 那么在取得连接的同时将校验连接的有效性。默认为 false 。  

4.      proxool

< bean id = "dataSource" class = "org.logicalcobwebs.proxool.ProxoolDataSource" >

       < property name = "driver" value = "com.mysql.jdbc.Driver" />

       <!-- 用户名,密码写在 url 中,属性之间用 &amp; (此处为转义字符)隔开 -->

       < property name = "driverUrl" value = "jdbc:mysql://127.0.0.1/test?user=root&amp;password=root&amp;

                                   useUnicode=true&amp;characterEncoding=gbk&amp;autoReconnect=true&amp;

                                   failOverReadOnly=false" />       

                                  

              <!--  此处用户名可不写,但属性必须存在 -->                   

       < property name = "user" value = "" />

      

       <!-- 此处密码可不写,但密码属性必须存在 -->

       < property name = "password" value = "" />

      

       <!-- 数据源的别名   -->

          < property name = "alias" value = "test" />

             

              <!-- proxool 自动侦察各个连接状态的时间间隔 ( 毫秒 ), 侦察到空闲的连接就马上回收 , 超时的销毁 默认 30 秒)

                -->

          < property name = "houseKeepingSleepTime" value = "30000" />

         

          <!--   最少保持的空闲连接数 (默认 2 个)

           -->

          < property name = "prototypeCount" value = "2" />

         

          <!-- 最大连接数 (默认 5 个) -->

          < property name = "maximumConnectionCount" value = "5" />

         

          <!-- 最小连接数 (默认 2 个) -->

          < property name = "minimumConnectionCount" value = "2" />

         

          < property name = "trace" value = "true" />

          < property name = "verbose" value = "true" />

             

</ bean >

 

Spring 的数据源实现类  
    Spring 本身也提供了一个简单的数据源实现类 DriverManagerDataSource  ,它位于 org.springframework.jdbc.datasource 包中。这个类实现了 javax.sql.DataSource接口,但   它并没有提供池化连接的机制,每次调用 getConnection() 获取新连接时,只是简单地创建一个新的连接。因此,这个数据源类比较适合在单元测试   或简单的独立应用中使用,因为它不需要额外的依赖类。  
      下面,我们来看一下 DriverManagerDataSource 的简单使用:当然,我们也可以通过配置的方式直接使用 DriverManagerDataSource 。

通过配置文件:

读配置文件的方式引用属性:  

view plain copy to clipboard print ?

1.       <bean   id = "propertyConfigurer"          

2.       class ="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >           

3.            <property   name = "location"   value = "/WEB-INF/jdbc.properties" />           

4.       </bean>           

5.       <bean   id = "dataSource"   class ="org.apache.commons.dbcp.BasicDataSource"            

6.                destroy-method = "close" >           

7.            <property   name = "driverClassName"   value = "${jdbc.driverClassName}"  />           

8.            <property   name = "url"   value = "${jdbc.url}"   />           

9.            <property   name = "username"   value = "${jdbc.username}"   />           

10.        <property   name = "password"   value = "${jdbc.password}"   />           

11.   </bean>       

 
     在 jdbc.properties 属性文件中定义属性值:  
   jdbc.driverClassName= com.mysql.jdbc.Driver 
    jdbc.url= jdbc:mysql://localhost:3309/sampledb 
    jdbc.username=root 
    jdbc.password=1234 

通过 jndi

< bean id = "dataSource" class = "org.springframework.jndi.JndiObjectFactoryBean" >

                 < property name = "jndiName" value = "java:comp/env/jdbc/bbt" />

           </ bean >



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 长鸡眼脚背肿了怎么办 脚上反复长鸡眼怎么办 脚底长鸡眼很痒怎么办 小脚趾上长鸡眼怎么办 6岁宝宝不爱学习怎么办 上班站久了腿肿怎么办 站时间长了腿肿怎么办 孩子做作业老是粗心大意怎么办 高中孩子没学习兴趣怎么办 初三孩子失去学习兴趣怎么办 初二对学习兴趣不大怎么办 脸上痒发红发肿怎么办 孩子作业拖拉爱丢三落四怎么办 腿肌肉按摩肿了怎么办 孩子上一年级成绩差怎么办 小孩脖子拧筋了怎么办 小孩塑料玩具拧不出来怎么办 一年级孩子做数学题粗心怎么办 手和脚有点肿怎么办 手破了之后肿了怎么办 手指肿了有脓怎么办 宝宝手指红肿有脓怎么办 孩子一听做作业就烦气怎么办 虎皮鹦鹉脚瘸了怎么办 虎皮鹦鹉脚受伤了怎么办 虎皮鹦鹉脚流血了怎么办 虎皮鹦鹉被风扇打到脚怎么办 虎皮鹦鹉脚脱臼了怎么办 孩子作业做得慢怎么办 员工给公司造成损失怎么办 小孩有写不完的作业家长怎么办 一年级孩子作业太粗心怎么办 孩子最近不好好做作业怎么办 工作压力大害怕做不好怎么办 孩子的数算不对怎么办? 孩子计算老是出错怎么办呢 孩子经常计算错误能怎么办 孩子老出现计算错误怎么办 孩子做作业马虎该怎么办 黑笔写错了纸破了怎么办 幼儿园报名写错怎么办名字