`
韩悠悠
  • 浏览: 839942 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

spring的DataSource数据源分析

阅读更多

在是使用spring时候,常常配置数据源,

 

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

	<property name="driverClassName" value="org.apache.derby.jdbc.ClinetDriver">
	<property name="url" value="jdbc:derby://localhost:1527/news;create=true">
	<property name="username" value="admin">
	<property name="password" value="admin">
</bean>

 
在配置文件中共有四个需要注入的属性,在org.springframework.jdbc.datasource.DriverManagerDataSoruce这个类

中,共有5个属性

 

               private String driverClassName;

	private String url;

	private String username;

	private String password;

	private Properties connectionProperties;

 


其实用构造方法注入的方式也是可以的,因为spring除了生成setter方法外,也给我们提供了构造函数,

 

public DriverManagerDataSource(String driverClassName, String url, String username, String password)
			throws CannotGetJdbcConnectionException {
		setDriverClassName(driverClassName);
		setUrl(url);
		setUsername(username);
		setPassword(password);
}

 

 

其中的前四个是数据库连接的基本配置,而最后一个connectionProperties是通过配置文件properity读取数据库的连接配置,

看DriverManagerDataSoruce这个类是如何获取connection连接 就明白了

 

protected Connection getConnectionFromDriverManager(String url, Properties props)
	    throws SQLException {

		if (logger.isDebugEnabled()) {
			logger.debug("Creating new JDBC Connection to [" + url + "]");
		}
		return DriverManager.getConnection(url, props);
	}


	protected Connection getConnectionFromDriverManager(String username, String password)
	    throws SQLException {

		Properties props = new Properties(getConnectionProperties());
		if (username != null) {
			props.setProperty("user", username);
		}
		if (password != null) {
			props.setProperty("password", password);
		}
		return getConnectionFromDriverManager(getUrl(), props);
	}

 

其中DriverManagerDataSoruce这个类本身又继承至AbstractDataSource这个类,AbstractDataSource这个类继承至

javax.sql.DataSource类,在AbstractDataSource这个类中,什么也没做,只是一个简单的抽象类,并有几个简单的方

法,

 

public abstract class AbstractDataSource implements DataSource {

	protected final Log logger = LogFactory.getLog(getClass());

	/**
	 * Returns 0: means use default system timeout.
	 */
	public int getLoginTimeout() throws SQLException {
		return 0;
	}

	public void setLoginTimeout(int timeout) throws SQLException {
		throw new UnsupportedOperationException("setLoginTimeout");
	}

	/**
	 * LogWriter methods are unsupported.
	 */
	public PrintWriter getLogWriter() {
		throw new UnsupportedOperationException("getLogWriter");
	}

	/**
	 * LogWriter methods are unsupported.
	 */
	public void setLogWriter(PrintWriter pw) throws SQLException {
		throw new UnsupportedOperationException("setLogWriter");
	}

}

 返回来再看DriverManagerDataSource这个类,其实DriverManagerDataSource并不是一个有效的数据源实现,因为每

次被请求的时候都要为客户端打开一个新的连接。 spring提供了另一种实现是SingleConnectionDataSource,顾名思义,它只保留单一连接,总是重用该连接,永不关闭,这个显然不适合多线程环境。

 

public class SingleConnectionDataSource extends DriverManagerDataSource
  implements SmartDataSource, DisposableBean

SingleConnectionDataSource 本身又具有DriverManagerDataSource的所有属性,所以可以说

SingleConnectionDataSource 是DriverManagerDataSource的扩展和延伸,可以看到SingleConnectionDataSource 除

了继承DriverManagerDataSource外,本身又实现了俩个借口SmartDataSource和DisposableBean,下面先分别介绍这俩

个接口然后返回来介绍SingleConnectionDataSource 这个类.

SmartDataSource继承至javax.sql.DataSource这个接口,只是提供了一个方法
boolean shouldClose(Connection con);定义是否可以关闭连接。

DisposableBean接口也是定义了一个方法 void destroy() throws Exception;
方法的作用是在被调用BeanFactory时销毁一个连接,
返回看SingleConnectionDataSource类,先看这俩个接口是如何实现 。

 

/**
	 * This is a single Connection: Do not close it when returning to the "pool".
	 */
	public boolean shouldClose(Connection con) {
		synchronized (this.connectionMonitor) {
			return (con != this.connection && con != this.target);
		}
	}

 

看这个实现就明白,不用多说。在看另一个实现类

	public void destroy() {
		synchronized (this.connectionMonitor) {
			closeConnection();
		}
	}

 其中synchronized (this.connectionMonitor) 是同步的作用,防止死锁。
connectionMonitor的定义很简单

/** Synchronization monitor for the shared Connection */
private final Object connectionMonitor = new Object();

 

	/**
	 * Close the underlying shared Connection.
	 */
	private void closeConnection() {
		if (this.target != null) {
			try {
				this.target.close();
			}
			catch (Throwable ex) {
				logger.warn("Could not close shared JDBC Connection", ex);
			}
		}
	}

 

 

分享到:
评论

相关推荐

    spring mvc配置datasource数据源的三种方式

    spring mvc配置datasource数据源的三种方式,对spring的数据库连接源配置,有很大帮助,使你更加准确地了解数据源、连接池的实际使用方法

    spring boot多数据源配置

    在Spring Boot应用中,多数据源配置是一项关键的技术,它允许我们同时管理多个数据库,比如主库和从库,或者不同类型的数据库。本教程将详细阐述如何在Spring Boot项目中实现这一功能,从数据源配置、实体管理到...

    spring数据源配置

    数据源(DataSource)在Spring中的配置对于实现持久层操作至关重要。 #### 二、Spring中的数据源配置方式 Spring框架支持多种数据源的配置方式,包括但不限于基于XML的配置、基于注解的配置以及基于Java配置的方式...

    Spring获取数据源代码

    - **BasicDataSource**: Spring内置的`org.springframework.jdbc.datasource.BasicDataSource`是最常用的数据源实现,它基于Apache Commons DBCP库,提供连接池功能。 - **DataSourceTransactionManager**: 这是...

    java spring 多数据源

    在Java Spring框架中,多数据源的实现是一个重要的特性,特别是在大型企业级应用中,它允许应用程序连接到多个数据库,从而实现数据隔离、负载均衡或读写分离等高级功能。本教程将深入探讨如何在Spring中配置和管理...

    spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

    综上所述,"spring+druid+AtomikosDataSource"的组合为开发者提供了一套强大的工具,用于实现多数据源切换和分布式事务控制。在实际项目中,通过合理的配置和编码,可以构建出高效、健壮的分布式系统。在`mult-table...

    spring多数据源

    3. **配置多数据源**:在Spring的XML配置文件中,我们需要定义多个DataSource bean,分别代表不同的数据库连接。这些数据源可以是Apache Commons DBCP、HikariCP、Druid等连接池的实现。例如: ```xml &lt;!-- 配置...

    Spring动态切换datasource实现mysql多住多从

    Spring框架提供了强大的数据源管理能力,我们可以利用它来实现动态切换数据源。具体步骤如下: 1. **配置数据源**:首先,需要配置多个数据源。在Spring配置文件中,可以定义多个DataSource bean,每个bean代表一个...

    Spring Boot+Jpa多数据源配置Demo(支持不同数据库)

    在Spring Boot中,我们可以通过创建不同的`DataSource` bean来配置多个数据源。每个数据源通常会有一个对应的`JdbcTemplate`或`JpaEntityManagerFactory`。首先,我们需要在`application.yml`或`application....

    基于Spring多数据源实例

    5. **编程或声明式数据源切换**:在业务代码中,可以使用Spring的`@Resource`注解注入DataSource,然后根据需求手动切换,或者通过AOP和Spring的代理机制自动处理数据源的切换。 6. **测试与优化**:最后,对整个...

    Spring多数据源分布式事务管理

    在大型分布式系统中,往往需要处理多个数据源,这就涉及到了Spring多数据源的配置和管理。同时,为了保证数据的一致性,分布式事务的管理也是必不可少的。在这个场景下,Atomikos作为一款开源的JTA(Java ...

    spring动态数据源+mybatis分库分表

    在"spring-routing-datasource"这个文件中,可能包含了实现Spring动态数据源的示例代码,包括配置文件、路由数据源的实现以及与MyBatis的集成。通过研究这个例子,你可以更深入地理解如何在实际项目中部署和使用这种...

    mybatis spring 多数据源

    标题 "mybatis spring 多数据源" 涉及到的是在Java开发中,如何使用MyBatis和Spring框架来管理多个数据库连接。这通常在需要处理来自不同数据源的数据或者实现数据库读写分离的场景下应用。MyBatis是一个优秀的持久...

    Spring多数据源解决方案

    Spring多数据源解决方案是针对大型应用中数据分片和分布式数据库管理的需求而设计的一种策略。在这样的场景下,为了提高系统的可扩展性和性能,数据通常会被分散到多个数据库实例上。这种架构如图1所示,每个数据库...

    spring boot多数据源(AOP注解动态切换)

    在Spring Boot应用中,多数据源的配置与管理是一项重要的任务,特别是在大型系统中,可能需要连接到不同的数据库以满足不同业务的需求。本教程将详细讲解如何在Spring Boot项目中集成Druid连接池,并利用AOP注解实现...

    Spring Boot多数据源(JdbcTemplate)配置与使用

    在Spring Boot应用中,我们经常需要处理来自多个数据源的数据,比如在开发微服务架构时,每个服务可能对应一个特定的数据源。`JdbcTemplate`是Spring框架提供的一个用于简化数据库操作的工具,它使得数据库访问更为...

    Spring 数据源不同配置

    在Spring框架中,数据源(DataSource)的配置是应用程序与数据库交互的核心部分。Spring支持多种数据源配置方式,包括基本的JDBC数据源、连接池数据源以及事务管理策略等。下面将详细介绍Spring中常见的数据源配置...

    spring boot数据源切换demo

    在Spring Boot应用中,数据源切换是一个常见的需求,特别是在分布式系统或者微服务架构中,可能需要连接多个数据库来实现不同的业务功能。本示例“spring boot数据源切换demo”将展示如何在Spring Boot中集成MyBatis...

    dynamic-datasource-spring-boot-starter_多数据源_

    `dynamic-datasource-spring-boot-starter`项目正致力于解决这个问题,它是一个基于Spring Boot的启动器,用于实现动态数据源切换,提供灵活的数据源管理功能。 **动态数据源**指的是在一个应用中可以动态地选择...

    Spring配置多个数据源

    如果你需要一个默认的数据源,可以设置`@Primary`注解,这样在没有指定数据源的情况下,Spring会使用这个作为默认数据源。 3. **配置第二个数据源** 对于从数据库,配置方式与主数据源类似,只是bean名称和配置...

Global site tag (gtag.js) - Google Analytics