Spring DataSource

转载:http://my.oschina.net/xiaomaoandhong/blog/60938

何为DataSource

DataSource 接口是 JDBC 2.0 API 中的新增内容,它提供了连接到数据源的另一种方法。
作为 DriverManager 工具的替代项,DataSource 对象是获取连接的首选方法
实现 DataSource 接口的对象通常在基于JNDI API 的命名服务中注册。

不管通过何种持久化技术,都必须通过数据连接访问数据库,在传统的应用中数据连接可以通过DriverManager获的,
在Spring中,数据连接一般是通过数据源获得的。在以往的应用中,数据源一般是 Web应用服务器提供的。
在Spring中,你不但可以通过JNDI获取应用服务器的数据源,也可以直接在Spring容器中配置数据源,
此外,你还可以 通过代码的方式创建一个数据源,以便进行无依赖的单元测试。

DataSource API定义: 

package javax.sql;
  
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Wrapper;
  
public interface DataSource  extendsCommonDataSource,Wrapper {
  
  Connection getConnection()throws SQLException;
    
  Connection getConnection(String username, String password) 
    throwsSQLException;
}

在Spring中配置Datasource

1、JDBC

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

<!-- 配置Spring DriverManagerDatasource数据源从中获取connection,引入数据库驱动 -->
    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>classpath:jdbc.properties</value>
        </property>
    </bean>
  
    <bean id="dataSource"destroy-method="close"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <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>


DriverManagerDataSource extends AbstractDriverBasedDataSource extends AbstractDataSource implements DataSource

DriverManagerDataSource.java 
package org.springframework.jdbc.datasource;
  
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
  
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
  
  
public class DriverManagerDataSource extendsAbstractDriverBasedDataSource {
  
    publicDriverManagerDataSource() {
    }
  
    publicDriverManagerDataSource(String url) {
        setUrl(url);
    }
  
    publicDriverManagerDataSource(String url, String username, String password) {
        setUrl(url);
        setUsername(username);
        setPassword(password);
    }
  
    publicDriverManagerDataSource(String url, Properties conProps) {
        setUrl(url);
        setConnectionProperties(conProps);
    }
  
    publicDriverManagerDataSource(String driverClassName, String url, String username, String password) {
        setDriverClassName(driverClassName);
        setUrl(url);
        setUsername(username);
        setPassword(password);
    }
  
    publicvoid setDriverClassName(String driverClassName) {
        Assert.hasText(driverClassName,"Property 'driverClassName' must not be empty");
        String driverClassNameToUse = driverClassName.trim();
        try{
            Class.forName(driverClassNameToUse,true, ClassUtils.getDefaultClassLoader());
        }
        catch(ClassNotFoundException ex) {
            IllegalStateException ise =
                    newIllegalStateException("Could not load JDBC driver class ["+ driverClassNameToUse + "]");
            ise.initCause(ex);
            throwise;
        }
        if(logger.isInfoEnabled()) {
            logger.info("Loaded JDBC driver: "+ driverClassNameToUse);
        }
    }
  
    protectedConnection getConnectionFromDriver(Properties props) throws SQLException {
        String url = getUrl();
        if(logger.isDebugEnabled()) {
            logger.debug("Creating new JDBC DriverManager Connection to ["+ url + "]");
        }
        returngetConnectionFromDriverManager(url, props);
    }
  
    protectedConnection getConnectionFromDriverManager(String url, Properties props)throws SQLException {
        returnDriverManager.getConnection(url, props);
    }
  
}

DriverManagerDataSource建立连接是只要有连接就新建一个connection,根本没有连接池的作用。

Spring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCP,其二是 C3P0。

2、DBCP

DBCP类包位于 /lib/jakarta-commons/commons-dbcp.jar,DBCP是一个依赖 Jakarta commons-pool对象池机制的数据库连接池,
所以在类路径下还必须包括/lib/jakarta- commons/commons-pool.jar。

<!-- 配置Spring dbcp Datasource数据源从中获取connection,引入commons-dbcp、commons-pool包,数据库驱动 -->
    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>classpath:jdbc.properties</value>
        </property>
    </bean>
  
    <bean id="dataSource"destroy-method="close"
        class="org.apache.commons.dbcp.BasicDataSource">
<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>

BasicDataSource.java 

public class BasicDataSource implementsDataSource {
      
    static{
        // Attempt to prevent deadlocks - see DBCP - 272
        DriverManager.getDrivers();
    }
    .
    .
    .
}

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

3、C3P0

C3P0是一个开放源代码的JDBC数据源实现项目,C3P0类包位于Spring中lib/c3p0/c3p0-0.9.1.2.jar。

<!-- 配置Spring ComboPooledDataSource数据源从中获取connection,引入c3p0-0.9.1.2.jar,数据库驱动 -->
    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>classpath:jdbc.properties</value>
        </property>
    </bean>
  
    <bean id="dataSource"destroy-method="close"
        class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass"value="${jdbc.driverClassName}"/>
        <property name="jdbcUrl"value="${jdbc.url}"/>
        <property name="user"value="${jdbc.username}"/>
        <property name="password"value="${jdbc.password}"/>
    </bean>

通过查看ComboPooledDataSource的源码我们发现此处的属性设置和上面不同,分别为driverClass、jdbcUrl、user。

4、JNDI(Java Naming and Directory Interface)

如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上或Jboss、Tomcat等,我们可能更希望使用应用服务器本身提供的数据源。
应用服务器的数据源使用JNDI使用,Spring为此专门提供引用JNDI资源的org\springframework\jndi\JndiObjectFactoryBean类。

以tomcat6为例:
1、在tomcat目录下conf\context.xml中的<Context>标签中加入 

<Resource name="jndi" 
        auth="Container" 
        type="javax.sql.DataSource" 
        password="mysql5" 
        username="root" 
        driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/spring" 
        maxActive="5" 
        maxIdle="2" 
        maxWait="3000"
/>

2、修改项目的web.xml文件加入 
<resource-ref>
    <res-ref-name>jndi</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

3、在spring配置文件中配置Datasource 
<!-- 从Tomcat配置的JNDI服务获取数据源-->
    <bean id="dataSource" 
        class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName"value="java:comp/env/jndi"/>
    </bean>

我们也可以采用下面的方式,但是要加入以下命名空间
xmlns:jee="http://www.springframework.org/schema/jee"

xsi:schemaLocation="http://www.springframework.org/schema/jee
                                
http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">

<!-- Spring 2.0为获取J2EE资源提供了一个jee命名空间,通过jee命名空间,可以有效地简化J2EE资源的引用。 -->
    <jee:jndi-lookup id="dataSource"jndi-name="java:comp/env/jndi"/>


相关链接:http://hi.baidu.com/282518588/item/f8562799787c0338326eeb4f

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值