Spring数据源配置
什么是数据源
数据源(DataSource)是SUN公司制定的用于获取数据库连接的规范接口。它存在于 javax.sql包中,用来代替 DriverManager 的方式来获取连接。
DataSource 与 DriverManager 获取连接的不同:
a)、DriverManager是由SUN公司实现的,它只供了最基本的获取连接的方式;
b)、DataSource是一个接口,不光SUN可以实现,很多第三方的中间件也可以实现
DataSource一般有如下三种实现方式:
a)、标准实现 -- 提供最基本的连接,也就是DriverManager的方式;
b)、连接池的实现 -- 提供了连接池,是一种可以缓存及管理多个数据库连接的“容器”;
c)、分布事务的实现 -- 提供了连接池,而且这个池中的连接是支持分布式事务的(Distribute Transaction)
Spring提供了4种配置数据源的方式:
- Spring自带的数据源(org.springframework.jdbc.datasource.DriverManagerDataSource)
- DBCP数据源
- C3P0数据源
- JNDI数据源
配置DriverManagerDataSource
<bean id="dataSource" 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>
<context:property-placeholder location="jdbc.properties"/>
配置DBCP数据源
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:DEV" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
BasicDataSource提供了close()方法关闭数据源,所以必须设定destroy-method=”close”属性, 以便Spring容器关闭时,数据源能够正常关闭
配置C3P0数据源
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value=" oracle.jdbc.driver.OracleDriver "/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:DEV"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</bean>
ComboPooledDataSource和BasicDataSource一样提供了一个用于关闭数据源的close()方法,这样我们就可以保证Spring容器关闭时数据源能够成功释放
配置JNDI数据源
<beans xmlns=http://www.springframework.org/schema/beans
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:jee=http://www.springframework.org/schema/jee
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/orclight"/>
</bean>
<jee:jndi-lookup id="dataSource" jndi-name=" java:comp/env/jdbc/orclight"/>
</beans>
如果在 <jee:jndi-lookup>
元素里面添加resource-ref=true
,这样给定的jndi-name
将会自动添加java:comp/env/
前缀
位于 jee 命名空间下的 jee:jndi-lookup 元素可以用于检索 JNDI 中的任何对象(包括数据源)并将其作为 Spring 的 bean。其中 jndi-name 属性用于指定 JNDI 中资源的名称,如果只设置了 jndi-name 属性,那么就会根据指定的名称查找数据源
嵌入式数据库
<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="classpath:schema.sql" encoding="UTF-8"/>
<jdbc:script location="classpath:data.sql" encoding="UTF-8"/>
</jdbc:embedded-database>
<jdbc:embedded-database>
的type
属性设置为H2
,表明嵌入式数据库应该是H2
数据库,在 <jdbc:embedded-database>
中,我们可以不配置也可以配置多个<jdbc:script>
元素来搭建数据库
根据环境装配bean
<beans xmlns=http://www.springframework.org/schema/beans
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:jee=http://www.springframework.org/schema/jee
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">
<beans profile="dev">
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/orclight"/>
</bean>
<jee:jndi-lookup id="dataSource" jndi-name=" java:comp/env/jdbc/orclight"/>
</beans>
<beans profile="other">
<bean id="dataSource" 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>
<context:property-placeholder location="jdbc.properties"/>
</beans>
</beans>
配置好profile之后,下一步则是激活profile,通过设置spring.profiles.active和spring.profiles.default属性,前者优先级会高于后者,且只会存在一个值
有多种方式可以设置该属性:
-
作为DispatcherServlet的初始化参数
-
作为WEB应用上下文参数
-
作为JNDI条目
-
作为环境变量
-
作为JVM的系统属性
-
在集成测试类上,使用@ActiveProfiles注解(需要spring集成测试环境)
- 作为DispatcherServlet的初始化参数
<servlet>
<servlet-name>scdp-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
- 作为WEB应用上下文参数
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</context-param>
参考
Spring数据源
根据环境装配你的bean——Spring中profile的应用
spring中配置数据源DBCP:basicDataSource和spring提供的DriverManagerDataSource的区别