Spring DataSource
来源:互联网 发布:免费自动拨号软件 编辑:程序博客网 时间:2024/06/10 05:30
转载:http://my.oschina.net/xiaomaoandhong/blog/60938
何为DataSource
DataSource 接口是 JDBC 2.0 API 中的新增内容,它提供了连接到数据源的另一种方法。
作为 DriverManager
工具的替代项,DataSource
对象是获取连接的首选方法。
实现 DataSource 接口的对象通常在基于JNDI API 的命名服务中注册。
不管通过何种持久化技术,都必须通过数据连接访问数据库,在传统的应用中数据连接可以通过DriverManager获的,
在Spring中,数据连接一般是通过数据源获得的。在以往的应用中,数据源一般是 Web应用服务器提供的。
在Spring中,你不但可以通过JNDI获取应用服务器的数据源,也可以直接在Spring容器中配置数据源,
此外,你还可以 通过代码的方式创建一个数据源,以便进行无依赖的单元测试。
DataSource API定义:
package
javax.sql;
import
java.sql.Connection;
import
java.sql.SQLException;
import
java.sql.Wrapper;
public
interface
DataSource
extends
CommonDataSource,Wrapper {
Connection getConnection()
throws
SQLException;
Connection getConnection(String username, String password)
throws
SQLException;
}
在Spring中配置Datasource
1、JDBC
Spring本身也提供了一个简单的数据源实现类DriverManagerDataSource ,
它位于org.springframework.jdbc.datasource包中。这个类实现了javax.sql.DataSource接口,
但它并没有提供池化连接的机制,每次调用getConnection()获取新连接时,只是简单地创建一个新的连接。
因此,这个数据源类比较适合在单元测试 或简单的独立应用中使用,因为它不需要额外的依赖类。
<!-- 配置Spring DriverManagerDatasource数据源从中获取connection,引入数据库驱动 -->
<bean
class
=
"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
>
<property name=
"locations"
>
<value>classpath:jdbc.properties</value>
</property>
</bean>
<bean id=
"dataSource"
destroy-method=
"close"
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>
DriverManagerDataSource.java
package
org.springframework.jdbc.datasource;
import
java.sql.Connection;
import
java.sql.DriverManager;
import
java.sql.SQLException;
import
java.util.Properties;
import
org.springframework.util.Assert;
import
org.springframework.util.ClassUtils;
public
class
DriverManagerDataSource
extends
AbstractDriverBasedDataSource {
public
DriverManagerDataSource() {
}
public
DriverManagerDataSource(String url) {
setUrl(url);
}
public
DriverManagerDataSource(String url, String username, String password) {
setUrl(url);
setUsername(username);
setPassword(password);
}
public
DriverManagerDataSource(String url, Properties conProps) {
setUrl(url);
setConnectionProperties(conProps);
}
public
DriverManagerDataSource(String driverClassName, String url, String username, String password) {
setDriverClassName(driverClassName);
setUrl(url);
setUsername(username);
setPassword(password);
}
public
void
setDriverClassName(String driverClassName) {
Assert.hasText(driverClassName,
"Property 'driverClassName' must not be empty"
);
String driverClassNameToUse = driverClassName.trim();
try
{
Class.forName(driverClassNameToUse,
true
, ClassUtils.getDefaultClassLoader());
}
catch
(ClassNotFoundException ex) {
IllegalStateException ise =
new
IllegalStateException(
"Could not load JDBC driver class ["
+ driverClassNameToUse +
"]"
);
ise.initCause(ex);
throw
ise;
}
if
(logger.isInfoEnabled()) {
logger.info(
"Loaded JDBC driver: "
+ driverClassNameToUse);
}
}
protected
Connection getConnectionFromDriver(Properties props)
throws
SQLException {
String url = getUrl();
if
(logger.isDebugEnabled()) {
logger.debug(
"Creating new JDBC DriverManager Connection to ["
+ url +
"]"
);
}
return
getConnectionFromDriverManager(url, props);
}
protected
Connection getConnectionFromDriverManager(String url, Properties props)
throws
SQLException {
return
DriverManager.getConnection(url, props);
}
}
DriverManagerDataSource建立连接是只要有连接就新建一个connection,根本没有连接池的作用。
Spring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCP,其二是 C3P0。
2、DBCP
DBCP类包位于 /lib/jakarta-commons/commons-dbcp.jar,DBCP是一个依赖 Jakarta commons-pool对象池机制的数据库连接池,
所以在类路径下还必须包括/lib/jakarta- commons/commons-pool.jar。
<!-- 配置Spring dbcp Datasource数据源从中获取connection,引入commons-dbcp、commons-pool包,数据库驱动 -->
<bean
class
=
"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
>
<property name=
"locations"
>
<value>classpath:jdbc.properties</value>
</property>
</bean>
<bean id=
"dataSource"
destroy-method=
"close"
class
=
"org.apache.commons.dbcp.BasicDataSource"
>
<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>
BasicDataSource.java
public
class
BasicDataSource
implements
DataSource {
static
{
// Attempt to prevent deadlocks - see DBCP - 272
DriverManager.getDrivers();
}
.
.
.
}
BasicDataSource提供了close()方法关闭数据源,所以必须设定destroy-method=”close”属性,
以便Spring容器关闭时,数据源能够正常关闭。除以上必须的数据源属性外,还有一些常用的属性:
defaultAutoCommit:设置从数据源中返回的连接是否采用自动提交机制,默认值为 true;
defaultReadOnly:设置数据源是否仅能执行只读操作, 默认值为 false;
maxActive:最大连接数据库连接数,设置为0时,表示没有限制;
maxIdle:最大等待连接中的数量,设置为0时,表示没有限制;
maxWait:最大等待秒数,单位为毫秒, 超过时间会报出错误信息;
validationQuery:用于验证连接是否成功的查询SQL语句,SQL语句必须至少要返回一行数据;
removeAbandoned:是否自我中断,默认是 false ;
removeAbandonedTimeout:几秒后数据连接会自动断开,在removeAbandoned为true,提供该值;
logAbandoned:是否记录中断事件, 默认为 false;
3、C3P0
C3P0是一个开放源代码的JDBC数据源实现项目,C3P0类包位于Spring中lib/c3p0/c3p0-0.9.1.2.jar。
<!-- 配置Spring ComboPooledDataSource数据源从中获取connection,引入c3p0-
0.9
.
1.2
.jar,数据库驱动 -->
<bean
class
=
"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
>
<property name=
"locations"
>
<value>classpath:jdbc.properties</value>
</property>
</bean>
<bean id=
"dataSource"
destroy-method=
"close"
class
=
"com.mchange.v2.c3p0.ComboPooledDataSource"
>
<property name=
"driverClass"
value=
"${jdbc.driverClassName}"
/>
<property name=
"jdbcUrl"
value=
"${jdbc.url}"
/>
<property name=
"user"
value=
"${jdbc.username}"
/>
<property name=
"password"
value=
"${jdbc.password}"
/>
</bean>
通过查看ComboPooledDataSource的源码我们发现此处的属性设置和上面不同,分别为driverClass、jdbcUrl、user。
4、JNDI(Java Naming and Directory Interface)
如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上或Jboss、Tomcat等,我们可能更希望使用应用服务器本身提供的数据源。
应用服务器的数据源使用JNDI使用,Spring为此专门提供引用JNDI资源的org\springframework\jndi\JndiObjectFactoryBean类。
以tomcat6为例:
1、在tomcat目录下conf\context.xml中的<Context>标签中加入
<Resource name=
"jndi"
auth=
"Container"
type=
"javax.sql.DataSource"
password=
"mysql5"
username=
"root"
driverClassName=
"com.mysql.jdbc.Driver"
url=
"jdbc:mysql://localhost:3306/spring"
maxActive=
"5"
maxIdle=
"2"
maxWait=
"3000"
/>
2、修改项目的web.xml文件加入
<resource-ref>
<res-ref-name>jndi</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
3、在spring配置文件中配置Datasource
<!-- 从Tomcat配置的JNDI服务获取数据源-->
<bean id=
"dataSource"
class
=
"org.springframework.jndi.JndiObjectFactoryBean"
>
<property name=
"jndiName"
value=
"java:comp/env/jndi"
/>
</bean>
我们也可以采用下面的方式,但是要加入以下命名空间
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
<!-- Spring
2.0
为获取J2EE资源提供了一个jee命名空间,通过jee命名空间,可以有效地简化J2EE资源的引用。 -->
<jee:jndi-lookup id=
"dataSource"
jndi-name=
"java:comp/env/jndi"
/>
相关链接:http://hi.baidu.com/282518588/item/f8562799787c0338326eeb4f
- Spring DataSource
- spring DataSource
- Spring DataSource
- spring中的dataSource
- spring'datasource 配置
- Spring的dataSource配置
- spring中获取datasource
- Spring DataSource 配置
- spring datasource 配置
- Spring DataSource配置方式
- spring datasource 注入
- Spring之DataSource注入 .
- spring配置datasource
- Spring dataSource配置
- spring数据源(database-datasource)
- Spring jdbcTemplete datasource
- 在 spring 配置datasource
- spring+datasource @Annotation方式
- Android CheckBox应用实例
- 在LINUX下探测硬件信息命令大全
- OSCache配置
- 最长上升子序列
- 使用spring aop结合log4j做日志
- Spring DataSource
- openssl部署构建CA及签发证书
- VS项目里*.sln和*.suo文件的作用 .
- div边框设置
- POJ 1128 Frame Stacking (拓扑排序)
- blender导出bullet文件
- JAVA概述(3)搭建环境!
- 八大排序算法总结
- Windows Server 2012十大快捷键功能解析