spring: 使用profiles選擇數據源(結合嵌入式數據源EmbeddedDatabaseBuilder)

一般需要在不同的環境(日常環境、性能測試環境、預發環境和生產環境等等)中配置不同的數據源,例如,在開發時非常適合使用嵌入式數據源、在QA環境中比較適合使用DBCP的BasicDataSource、在生產環境中則適合使用<jee:jndi-lookup>元素,即使用JNDI查詢數據源。

在Spring實戰3:裝配bean的進階知識一文中我們探討過Spring的bean-profiles特性,這裏就需要給不同的數據源配置不同的profiles,Java配置文件的內容如下所示:

package org.test.spittr.config;

import org.apache.commons.dbcp2.BasicDataSource;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Profile;

import org.springframework.jdbc.datasource.DriverManagerDataSource;

import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;

import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;

import org.springframework.jndi.JndiObjectFactoryBean;

import javax.sql.DataSource;

 

@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 BasicDataSource basicDataSource() {

        BasicDataSource ds = new BasicDataSource();

        ds.setDriverClassName("org.h2.Driver");

        ds.setUrl("jdbc:h2:tcp://localhost/~/spitter");

        ds.setUsername("sa");

        ds.setPassword("");

        ds.setInitialSize(5); //初始大小

        ds.setMaxTotal(10); //數據庫連接池大小

        return ds;

    }

 

    @Profile("production")

    @Bean

    public DataSource dataSource() {

        JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();

        jndiObjectFactoryBean.setJndiName("/jdbc/SpittrDS");

        jndiObjectFactoryBean.setResourceRef(true);

        jndiObjectFactoryBean.setProxyInterface(javax.sql.DataSource.class);

        return (DataSource)jndiObjectFactoryBean.getObject();

    }

}

 

 

利用@Profile註解,Spring應用可以運行時再根據激活的profile選擇指定的數據源。在上述代碼中,當development對應的profile被激活時,應用會使用嵌入式數據源;當qa對應的profile被激活時,應用會使用DBCP的BasicDataSource;當production對應的profile被激活時,應用會使用從JNDI中獲取的數據源。

上述代碼對應的XML形式的配置代碼如下所示:

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:p="http://www.springframework.org/schema/p"

       xmlns:jee="http://www.springframework.org/schema/jee" xmlns:jdbc="http://www.springframework.org/schema/jdbc"

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

       <beans profile="qa">

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

                 p:driverClassName="org.h2.Driver"

                 p:url="jdbc:h2:tcp://localhost/~/spitter"

                 p:username="sa"

                 p:password=""

                 p:initialSize="5" />

       </beans>

 

       <beans profile="production">

            <jee:jndi-lookup id="dataSource"

                    jndi-name="/jdbc/SpittrDS"

                    resource-ref="true"/>

       </beans>

 

       <beans profile="development">

            <jdbc:embedded-database id="dataSource" type="H2">

                <jdbc:script location="classpath*:schema.sql" />

                <jdbc:script location="classpath*:test-data.sql" />

            </jdbc:embedded-database>

       </beans>

</beans>

 

 

 建立好數據庫連接後,就可以執行訪問數據庫的任務了。正如之前提到的,Spring對很多持久化技術提供了支持,包括JDBC、Hibernate和Java Persistence API(API)。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章