10.2.5 使用 profile 选择数据源
我们已经看到了多种在 Spring 中配置数据源的方法,我相信你已经找到了一两种适合你的应用程序的配置方式。实际上,我们很可能面临这样一种需求,那就是在某种环境下需要其中一种数据源,而在另外的环境中需要不同的数据源。
例如,对于开发期来说,<jdbc:embedded-database> 元素是很合适的,而在 QA 环境中,你可能希望使用 DBCP 的 BasicDataSource,在生产部署环境下,可能需要使 用 <jee:jndi-lookup>。
我们在第 3 章所讨论的 Spring 的 bean profile 特性恰好用在这里,所需要做的就是将每个数据源配置在不同的 profile 中,如下所示:
package com.habuma.spittr.config;
import org.apache.commons.dbcp.BasicDataSource;
import javax.sql.Datasource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration?
import org.springframework.context.annotation.Profile;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.jndi.JndiObjectFactoryBean;
@Configuration
public class DataSourceConfiguration {
@Profile("development")
@Bean
public DataSource embeddedDataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("classpath:schema.sql")
.addScript("classpath:test-data.sql")
.build();
}
@Profile("qa")
@Bean
public DataSource Data() {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("org.h2.Driver");
ds.setUrl("jdbc:h2:tcp://localhost/-/spitter")
ds.setUsername("sa");
ds.setPassword("");
ds.setlnitialSize(5);
ds.setMaxActive(10);
return ds;
}
@Profile ("production")
@Bean
public DataSource dataSource() {
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiName("jdbc/SpittrDS");
jndiObjectFactoryBean.setResourceRef(true);
jndiObjectFactoryBean.setProxylnterface(javax.sql.Datasource.class);
return (Datasource) jndiObjectFactoryBean.getObject();
}
}通过使用 profile 功能,会在运行时选择数据源,这取决于哪一个 profile 处于激活状态。如程序清单 10.2 配置所示,当且仅当 development profile 处于激活状态时,会创建嵌入式数据库,当且仅当 qa profile 处于激活状态时,会创建 DBCP BasicDataSource,当且仅当 production profile 处于激活状态 时,会从 JNDI 获取数据源。
为了内容的完整性,如下的程序清单展现了如何使用 Spring XML 代替 Java 配置,实现相同的 profile 配置。
现在我们已经通过数据源建立了与数据库的连接,接下来要实际访问数据库了。就像我在前面所提到的,Spring 为我们提供了多种使用数据库的方式包括 JDBC、Hibernate 以及 Java 持久化 API(Java Persistence API,JPA)。在下一节,我们将会看到如何使用 Spring 对 JDBC 的支持为应用程序构建持久层。如果你喜欢使用 Hibernate 或 JPA,那可以直接跳到下一章。
Last updated
Was this helpful?