用DataSource
Spring 通过 .A 是
是 JDBC 规范的一部分,是一个通用的连接工厂。它允许
容器或框架隐藏连接池和事务管理问题
从应用程序代码中。作为开发人员,您无需了解有关如何
连接到数据库。这是设置
数据源。在开发和测试代码时,您很可能会同时担任这两个角色,但您
不必知道生产数据源的配置方式。DataSourceDataSource
当您使用 Spring 的 JDBC 层时,您可以从 JNDI 获取数据源,或者您可以
使用第三方提供的 Connection Pool 实现配置您自己的 Integration。
传统的选择是 Apache Commons DBCP 和带有 bean 样式类的 C3P0;
对于现代 JDBC 连接池,请考虑使用 HikariCP 及其构建器风格的 API。DataSource
您应该使用 and 类
(包含在 Spring 发行版中)仅用于测试目的!这些变体不会
提供池化,并且在对一个连接发出多个请求时性能不佳。DriverManagerDataSourceSimpleDriverDataSource | 
以下部分使用 Spring 的实现。
稍后将介绍其他几种变体。DriverManagerDataSourceDataSource
要配置 :DriverManagerDataSource
- 
获取连接,就像通常获取 JDBC 一样 连接。
DriverManagerDataSource - 
指定 JDBC 驱动程序的完全限定类名,以便 可以加载驱动程序类。
DriverManager - 
提供在 JDBC 驱动程序之间变化的 URL。(请参阅驱动程序的文档 以获取正确的值。
 - 
提供用户名和密码以连接到数据库。
 
以下示例演示如何在 Java 中配置 a:DriverManagerDataSource
- 
Java
 - 
Kotlin
 
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:hsql://localhost:");
dataSource.setUsername("sa");
dataSource.setPassword("");
val dataSource = DriverManagerDataSource().apply {
	setDriverClassName("org.hsqldb.jdbcDriver")
	url = "jdbc:hsqldb:hsql://localhost:"
	username = "sa"
	password = ""
}
以下示例显示了相应的 XML 配置:
<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 和 C3P0 的基本连接和配置。 若要了解有助于控制池功能的更多选项,请参阅产品 有关相应连接池实现的文档。
以下示例显示了 DBCP 配置:
<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 配置:
<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"/>
您应该使用 and 类
(包含在 Spring 发行版中)仅用于测试目的!这些变体不会
提供池化,并且在对一个连接发出多个请求时性能不佳。DriverManagerDataSourceSimpleDriverDataSource | 
用DataSourceUtils
该类是一个方便而强大的帮助程序类,它提供了从 JNDI 获取连接并在必要时关闭连接的方法。
它支持线程绑定的 JDBC,但
也与 和 。DataSourceUtilsstaticConnectionDataSourceTransactionManagerJtaTransactionManagerJpaTransactionManager
请注意,这意味着连接访问,使用它
在每个 JDBC 操作背后,隐式地参与正在进行的事务。JdbcTemplateDataSourceUtils
实施SmartDataSource
该接口应由可以提供
连接到关系数据库。它扩展了接口,让
使用它的类查询是否应在给定的
操作。当您知道需要重用连接时,这种用法非常有效。SmartDataSourceDataSource
扩展AbstractDataSource
AbstractDataSource是 Spring 实现的基类。它实现所有实现通用的代码。
如果您编写自己的 implementation ,则应扩展该类。abstractDataSourceDataSourceAbstractDataSourceDataSource
用SingleConnectionDataSource
该类是接口的实现,它包装了每次使用后未关闭的 single。
这不支持多线程。SingleConnectionDataSourceSmartDataSourceConnection
如果任何客户端代码在假设池连接的情况下调用(如使用
持久性工具),则应将该属性设置为 。此设置
返回包装物理连接的关闭抑制代理。请注意,您可以
不再将此强制转换为本机 Oracle 或类似对象。closesuppressClosetrueConnection
SingleConnectionDataSource主要是一个测试类。它通常可以轻松测试
与简单的 JNDI 环境相结合。
与 相反,它始终重用相同的连接,
避免过度创建物理连接。DriverManagerDataSource
用DriverManagerDataSource
该类是标准接口的实现,该接口通过 Bean 属性配置普通 JDBC 驱动程序,并每次返回一个新的驱动程序。DriverManagerDataSourceDataSourceConnection
此实现对于 Jakarta EE 之外的测试和独立环境非常有用
容器,作为 Spring IoC 容器中的 Bean 或结合使用
使用简单的 JNDI 环境。池假设调用
关闭连接,以便任何 -aware 持久性代码都应该可以正常工作。然而
使用 JavaBean 风格的连接池(例如 )非常简单,即使在测试中也是如此
环境中,则使用这样的连接池几乎总是比 更可取。DataSourceConnection.close()DataSourcecommons-dbcpDriverManagerDataSource
用TransactionAwareDataSourceProxy
TransactionAwareDataSourceProxy是目标 的代理。代理会包装
target 来增加对 Spring 管理的事务的感知。在这方面,它
类似于 Jakarta EE 服务器提供的事务性 JNDI 。DataSourceDataSourceDataSource
很少需要使用此类,除非必须为现有代码
调用并传递标准 JDBC 接口实现。在这种情况下,
您仍然可以让此代码可用,同时拥有此代码
参与 Spring 管理的事务。通常最好编写
通过使用更高级别的资源管理抽象(如 OR)来拥有新代码。DataSourceJdbcTemplateDataSourceUtils | 
有关更多详细信息,请参见 TransactionAwareDataSourceProxy javadoc。
很少需要使用此类,除非必须为现有代码
调用并传递标准 JDBC 接口实现。在这种情况下,
您仍然可以让此代码可用,同时拥有此代码
参与 Spring 管理的事务。通常最好编写
通过使用更高级别的资源管理抽象(如 OR)来拥有新代码。DataSourceJdbcTemplateDataSourceUtils | 
用DataSourceTransactionManager / JdbcTransactionManager
该类是单个 JDBC 的实现。它将 JDBC 从指定的线程绑定到当前正在执行的线程,可能
允许每个 .DataSourceTransactionManagerPlatformTransactionManagerDataSourceConnectionDataSourceConnectionDataSource
需要应用程序代码来检索 JDBC,而不是 Java EE 的标准 .它抛出未经检查的异常
而不是选中 .所有框架类(例如 )都使用
这种策略是隐含的。如果不与事务管理器一起使用,则查找策略
的行为完全相同,因此可以在任何情况下使用。ConnectionDataSourceUtils.getConnection(DataSource)DataSource.getConnectionorg.springframework.daoSQLExceptionsJdbcTemplateDataSource.getConnection
该类支持 savepoints ()、
自定义隔离级别和超时,作为适当的 JDBC 语句应用
查询超时。为了支持后者,应用程序代码必须使用 或
为每个 created 语句调用 method。DataSourceTransactionManagerPROPAGATION_NESTEDJdbcTemplateDataSourceUtils.applyTransactionTimeout(..)
您可以在
single-resource 的情况下,因为它不需要容器支持 JTA 事务
协调者。在这些事务管理器之间切换只是一个配置问题,
前提是您坚持使用所需的连接查找模式。请注意,JTA 不支持
SavePoint 或自定义隔离级别,并且具有不同的超时机制,但其他情况
在 JDBC 资源和 JDBC 提交/回滚管理方面公开了类似的行为。DataSourceTransactionManagerJtaTransactionManager
对于实际资源连接的 JTA 样式的惰性检索, Spring 提供了一个
目标连接池对应的代理类:参见 LazyConnectionDataSourceProxy。
这对于没有实际语句的潜在空交易特别有用
执行(在这种情况下,从不获取实际资源),并且还在
一个路由,表示采用事务同步的只读标志
和/或隔离级别(例如 )。DataSourceDataSourceIsolationLevelDataSourceRouter
LazyConnectionDataSourceProxy还为只读连接提供特殊支持
pool 在只读事务期间使用,避免了切换 JDBC 的开销
获取时,每个事务的开头和结尾处都有 Connection 的只读标志
它来自主连接池(这可能会很昂贵,具体取决于 JDBC 驱动程序)。
从 5.3 开始, Spring 提供了一个扩展的变体,它添加了
提交/回滚时的异常转换功能(与 一致)。
Where 只会抛出(类似于 JTA),将数据库锁定失败等转换为
相应的子类。请注意,应用程序代码需要
为此类异常做好准备,而不是完全期望 .
在这种情况下,是推荐的选择。JdbcTransactionManagerJdbcTemplateDataSourceTransactionManagerTransactionSystemExceptionJdbcTransactionManagerDataAccessExceptionTransactionSystemExceptionJdbcTransactionManager | 
就异常行为而言, 大致等同于 和 ,作为立即
companion / replacement 彼此。 另一方面
等同于并且可以作为那里的直接替换。JdbcTransactionManagerJpaTransactionManagerR2dbcTransactionManagerDataSourceTransactionManagerJtaTransactionManager
从 5.3 开始, Spring 提供了一个扩展的变体,它添加了
提交/回滚时的异常转换功能(与 一致)。
Where 只会抛出(类似于 JTA),将数据库锁定失败等转换为
相应的子类。请注意,应用程序代码需要
为此类异常做好准备,而不是完全期望 .
在这种情况下,是推荐的选择。JdbcTransactionManagerJdbcTemplateDataSourceTransactionManagerTransactionSystemExceptionJdbcTransactionManagerDataAccessExceptionTransactionSystemExceptionJdbcTransactionManager |