Spring笔记(十四)—— Spring JDBC 访问数据库之控制数据库连接

DataSource

Spring 通过 DataSource 获取数据库连接,DataSource 是 JDBC 规范的一部分,是一个通用连接工厂。它允许容器或框架从应用程序代码中隐藏连接池和事务管理问题。当使用 Spring 的 JDBC 层时,从 JNDI 获取数据源,或者使用第三方提供的连接池实现配置自己的数据源,最受欢迎的实现是 Apache Jakarta Commons DBCP 和 C3P0。

通过获得与 DriverManagerDataSource 的连接来获取 JDBC 连接,指定 JDBC 驱动程序的完全限定类名,以便 DriverManager 可以加载驱动程序类,接着提供在 JDBC 驱动程序的 URL,然后提供用户名和密码以连接到数据库。

如下为在 Java 代码中配置 DriverManagerDataSource 的示例:

1
2
3
4
5
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:hsql://localhost:");
dataSource.setUsername("sa");
dataSource.setPassword("");

相关连的 XML 配置:

1
2
3
4
5
6
7
8
<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 配置:

1
2
3
4
5
6
7
8
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<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"/>

C3P0 配置:

1
2
3
4
5
6
7
8
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<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>
<context:property-placeholder location="jdbc.properties"/>

DataSourceUtils

DataSourceUtils 类是一个便捷且强大的帮助类,它提供了从 JNDI 获取连接的静态方法,并在必要时关闭连接,它支持线程绑定连接,例如:DataSourceTransactionManager。

SmartDataSource

SmartDataSource 接口应由可以提供与关系数据库连接的类实现,它扩展了 DataSource 接口,允许使用它来查询在给定操作之后是否应该关闭连接。

AbstractDataSource

AbstractDataSource 是 Spring DataSource 实现的一个抽象基类,如果需要自定义 DataSource 实现,即可继承 AbstractDataSource 类。

SingleConnectionDataSource

SingleConnectionDataSource 类是 SmartDataSource(封装了每次使用后未关闭的单个连接) 接口的实现。它能够与简单的 JNDI 环境结合,轻松地在应用程序服务器之外测试代码,与 DriverManagerDataSource 相反,它一直重复使用同一个连接,避免过多创建物理连接。

DriverManagerDataSource

DriverManagerDataSource 类是标准 DataSource 接口的实现,它通过 bean 属性配置简单的 JDBC 驱动程序,并且每次都返回一个新的连接。

TransactionAwareDataSourceProxy

TransactionAwareDataSourceProxy 是目标 DataSource 的代理,它包装目标 DataSource 以增强对 Spring 管理事务的认识。在这方面,它类似于由 Java EE 服务器提供的事务 JNDI DataSource。

DataSourceTransactionManager

DataSourceTransactionManager 类是单个 JDBC 数据源的 PlatformTransactionManager 实现。它将 JDBC 连接从指定的数据源绑定到当前正在执行的线程,从而潜在地允许每个数据源一个线程连接。需要应用程序代码来通过 DataSourceUtils.getConnection(DataSource) 而不是 Java EE 的标准 DataSource.getConnection 来检索 JDBC 连接。它抛出 unchecked 的 org.springframework.dao 异常,而不是 checked SQLExceptions。
DataSourceTransactionManager 类支持自定义隔离级别,并且用于作为 JDBC 语句查询超时应用的超时。为了支持后者,应用程序代码必须对每个创建的语句使用 JdbcTemplate 或调用 DataSourceUtils.applyTransactionTimeout(..) 方法。

NativeJdbcExtractor

使用 NativeJdbcExtractor 配置自己的 JdbcTemplate 或 OracleLobHandler 访问与标准 JDBC API 不同的供应商特定的 JDBC 方法。

初始化 DataSource

使用 Spring XML 初始化数据库,提供一个指向 DataSource bean 的引用,在 spring-jdbc 命名空间中使用 initialize-database 标签:

1
2
3
4
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="classpath:com/foo/sql/db-schema.sql"/>
<jdbc:script location="classpath:com/foo/sql/db-test-data.sql"/>
</jdbc:initialize-database>

然而,为了获得对现有数据的创建和删除的更多控制,XML 命名空间提供了一些附加选项。第一个是用于开启和关闭初始化的标志,这可以根据环境进行设置(例如,从系统属性或环境 bean 中提取布尔值),例如:

1
2
3
<jdbc:initialize-database data-source="dataSource" enabled="#{systemProperties.INITIALIZE_DATABASE}">
<jdbc:script location="..."/>
</jdbc:initialize-database>

第二个选项是更能容忍故障,可以控制初始化程序的能力来忽略执行 SQL 脚本产生的某一错误,例如:

1
2
3
<jdbc:initialize-database data-source="dataSource" ignore-failures="DROPS">
<jdbc:script location="..."/>
</jdbc:initialize-database>

参考资料:

Spring 3.x 企业应用开发实战
Spring Framework Reference Documentation

热评文章