`
longding
  • 浏览: 2516 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

Spring配置数据源几种方式

 
阅读更多
配置Spring数据源的几种方式

配置一个数据源
     Spring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCP,其二是 C3P0。可以在Spring配置文件中利用这两者中任何一个配置数据源。

DBCP数据源
     DBCP类包位于 /lib/jakarta-commons/commons-dbcp.jar,DBCP是一个依赖 Jakarta commons-pool对象池机制的数据库连接池,所以在类路径下还必须包括/lib/jakarta- commons/commons-pool.jar。下面是使用DBCP配置MySql数据源的配置片断:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"           
        destroy-method="close">           
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />          
    <property name="url" value="jdbc:mysql://localhost:3309/sampledb" />          
    <property name="username" value="root" />          
    <property name="password" value="1234" />          
</bean> 

BasicDataSource提供了close()方法关闭数据源,所以必须设定destroy-method=”close”属性, 以便Spring容器关闭时,数据源能够正常关闭。除以上必须的数据源属性外,还有一些常用的属性:
     defaultAutoCommit:设置从数据源中返回的连接是否采用自动提交机制,默认值为 true;
     defaultReadOnly:设置数据源是否仅能执行只读操作, 默认值为 false;
     maxActive:最大连接数据库连接数,设置为0时,表示没有限制;
     maxIdle:最大等待连接中的数量,设置为0时,表示没有限制;
     maxWait:最大等待秒数,单位为毫秒, 超过时间会报出错误信息;
     validationQuery:用于验证连接是否成功的查询SQL语句,SQL语句必须至少要返回一行数据, 如你可以简单地设置为:“select count(*) from user”;
     removeAbandoned:是否自我中断,默认是 false ;
     removeAbandonedTimeout:几秒后数据连接会自动断开,在removeAbandoned为true,提供该值;
     logAbandoned:是否记录中断事件, 默认为 false;

C3P0数据源
     C3P0是一个开放源代码的JDBC数据源实现项目,它在lib目录中与Hibernate一起发布,实现了JDBC3和JDBC2扩展规范说明的 Connection 和Statement 池。C3P0类包位于/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一个 oracle数据源:
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"           
            destroy-method="close">          
        <property name="driverClass" value=" oracle.jdbc.driver.OracleDriver "/>          
        <property name="jdbcUrl" value=" jdbc:oracle:thin:@localhost:1521:ora9i"/>
        <property name="user" value="admin"/>          
        <property name="password" value="1234"/>          
    </bean>      

ComboPooledDataSource和BasicDataSource一样提供了一个用于关闭数据源的close()方法,这样我们就可以保证Spring容器关闭时数据源能够成功释放。
     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。
读配置文件的方式引用属性:
<bean id="propertyConfigurer"         
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">   
    <property name="location" value="/WEB-INF/jdbc.properties"/>          
</bean>          
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"           
        destroy-method="close">          
    <property name="driverClassName" value="${jdbc.driverClassName}" />          
    <property name="url" value="${jdbc.url}" />          
    <property name="username" value="${jdbc.username}" />          
    <property name="password" value="${jdbc.password}" />          
</bean>    

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

     提示 经常有开发者在${xxx}的前后不小心键入一些空格,这些空格字符将和变量合并后作为属性的值。如:的属性配置项,在前后都有空格,被解析后,username的值为“ 1234 ”,这将造成最终的错误,因此需要特别小心。

获取JNDI数据源
     如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上,我们可能更希望使用应用服务器本身提供的数据源。应用服务器的数据源 使用JNDI开放调用者使用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBean类。下面是一个简单的配置:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">          
    <property name="jndiName" value="java:comp/env/jdbc/bbt"/>          
</bean>    


通过jndiName指定引用的JNDI数据源名称。
     Spring 2.0为获取J2EE资源提供了一个jee命名空间,通过jee命名空间,可以有效地简化J2EE资源的引用。下面是使用jee命名空间引用JNDI数据源的配置:
<beans xmlns=http://www.springframework.org/schema/beans        
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance        
xmlns:jee=http://www.springframework.org/schema/jee        
xsi:schemaLocation="http://www.springframework.org/schema/beans         
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd         
http://www.springframework.org/schema/jee        
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">          
    <jee:jndi-lookup id="dataSource" jndi-name=" java:comp/env/jdbc/bbt"/>          
</beans> 


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


小结
     不管采用何种持久化技术,都需要定义数据源。Spring附带了两个数据源的实现类包,你可以自行选择进行定义。在实际部署时,我们可能会直接采用应用服务器本身提供的数据源,这时,则可以通过JndiObjectFactoryBean或jee命名空间引用JNDI中的数据源。

DBCP与C3PO配置的区别:
C3PO :
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">      
        <property name="driverClass">      
            <value>oracle.jdbc.driver.OracleDrivervalue>      
        </property>      
        <property name="jdbcUrl">                 
            <value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseNamevalue>      
        </property>      
        <property name="user">      
            <value>testAdminvalue>      
        </property>      
        <property name="password">      
            <value>123456value>      
        </property>      
    </bean>      

DBCP:
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">      
        <property name="driverClassName">      
            <value>oracle.jdbc.driver.OracleDrivervalue>      
        </property>      
        <property name="url">                 
            <value>jdbc:oracle:thin:@10.10.10.6:1521:DataBaseNamevalue>      
         </property>      
        <property name="username">      
            <value>testAdminvalue>      
        </property>      
        <property name="password">      
            <value>123456value>      
        </property>      
    </bean>  

转自:http://blog.csdn.net/zcywell/article/details/7175478
分享到:
评论

相关推荐

    spring 整合 mybatis 中数据源的几种配置方式(总结篇)

    因为spring 整合mybatis的过程中, 有好几种整合方式,尤其是数据源那块,经常看到不一样的配置方式,总感觉有点乱,所以今天有空总结下,感兴趣的朋友跟随脚本之家小编一起学习吧

    Spring中配置数据源的几种方式

    今天小编就为大家分享一篇关于Spring中配置数据源的几种方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    ssh配置文件详解配置strts,spring,hibernate

    1、 配置数据源 2、 配置会话工厂(依赖注入上面的数据源,还要注入hbm映射文件[注意正确的位置]、hibernate属性文件) 3、 配置事务管理器(依赖注入上面的会话工厂) 4、 Spring中声明事务管理器(根据需要又可...

    高级开发spring面试题和答案.pdf

    @transaction多个数据源事务怎么指定数据源 传播特性有几种?7种; 某一个事务嵌套另一个事务的时候怎么办? REQUIRED_NEW和REQUIRED区别 Spring的事务是如何回滚的,实现原理; 抽象类和接口的区别,什么时候用...

    Spring in Action(第2版)中文版

    5.2配置数据源 5.2.1使用jndi数据源 5.2.2使用数据源连接池 5.2.3基于jdbc驱动的数据源 5.3在spring里使用jdbc 5.3.1处理失控的jdbc代码 5.3.2使用jdbc模板 5.3.3使用spring对jdbc的dao支持类 5.4在spring里...

    springmybatis

    查询出列表,也就是返回list, 在我们这个例子中也就是 List&lt;User&gt; , 这种方式返回数据,需要在User.xml 里面配置返回的类型 resultMap, 注意不是 resultType, 而这个resultMap 所对应的应该是我们自己配置的 ...

    Spring in Action(第二版 中文高清版).part2

    5.2 配置数据源 5.2.1 使用JNDI数据源 5.2.2 使用数据源连接池 5.2.3 基于JDBC驱动的数据源 5.3 在Spring里使用JDBC 5.3.1 处理失控的JDBC代码 5.3.2 使用JDBC模板 5.3.3 使用Spring对JDBC的DAO支持类 5.4...

    Spring in Action(第二版 中文高清版).part1

    5.2 配置数据源 5.2.1 使用JNDI数据源 5.2.2 使用数据源连接池 5.2.3 基于JDBC驱动的数据源 5.3 在Spring里使用JDBC 5.3.1 处理失控的JDBC代码 5.3.2 使用JDBC模板 5.3.3 使用Spring对JDBC的DAO支持类 5.4...

    springboot 多数据源的实现(最简单的整合方式)

    主要介绍了springboot 多数据源的实现(最简单的整合方式),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    ssh(structs,spring,hibernate)框架中的上传下载

    Spring针对几个著名的Web服务器的数据源提供了相应的JDBC抽取器:  •WebLogic:WebLogicNativeJdbcExtractor  •WebSphere:WebSphereNativeJdbcExtractor  •JBoss:JBossNativeJdbcExtractor  在定义了JDBC...

    basic-spring-rest

    后端模块候选人持续性包含数据库配置(内存中的H2)以及Spring数据实体和存储库。候选人服务由控制器和服务业务逻辑组成。 使用Spring Boot将模块打包为具有所有依赖项(带有嵌入式Tomcat服务器)的胖子罐。 有几种...

    千方百计笔试题大全

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    java面试宝典

    70、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 17 71、启动一个线程是用run()还是start()? 17 72、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 18 73...

    DBKING使用指南

    可以通过配置方式指定数据源,也可以通过硬代码方式指定数据源,甚至通过第三方获取数据库连接的方式都是可以的。 目前工具在Oracle 11g、Microsoft SQLServer 2012、MySQL 5.x、DB2 10.x、Sybase 15.x、...

    J2EE开发全程实录(JAVA项目开发)

    6.2.2 几种Remoting实现的比较... 75 6.3 改造HttpInvoker 75 6.3.1 服务文件的分模块化... 82 6.3.2 本地服务加载器... 85 6.4 Remoting Session实现... 87 6.4.1 实现思路... 88 6.4.2 Session Id的生成... 88 ...

    java面试题

    多线程几种实现方法,同步? 答:多线程有两种实现方法,一种是继承Thread类或者实现Runnable接口。同步就是在方法返回类型后面加上synchronized。 c#中的委托,事件是不是委托? 答:委托就是将方法作为一个参数...

    Java面试宝典2020修订版V1.0.1.doc

    34、Java创建对象有几种方式 22 35、写出验证Email的正则表达式 22 39、说出十种常见的异常 22 40什么是检查性异常和非检查性异常? 23 41、Java的异常处理机制是什么? 23 42、一个静态方法,里面可不可以用this和...

    JAVA上百实例源码以及开源项目源代码

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

Global site tag (gtag.js) - Google Analytics