一般需要在不同的環境(日常環境、性能測試環境、預發環境和生產環境等等)中配置不同的數據源,例如,在開發時非常適合使用嵌入式數據源、在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)。