此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

DataSource

Spring 通过 .A 是 JDBC 规范的一部分,是一个通用的连接工厂。它让一个 容器或框架隐藏连接池和事务管理问题 从应用程序代码。作为开发人员,您无需了解有关如何 连接到数据库。这是设置的管理员的责任 数据源。在开发和测试代码时,您很可能会同时担任这两个角色,但您 不必知道生产数据源的配置方式。DataSourceDataSourceSpring中文文档

使用 Spring 的 JDBC 层时,可以从 JNDI 获取数据源,也可以 使用第三方提供的连接池实现配置自己的连接池。 传统的选择是带有 Bean 样式类的 Apache Commons DBCP 和 C3P0; 对于现代 JDBC 连接池,请考虑使用 HikariCP 及其构建器样式的 API。DataSourceSpring中文文档

您应该使用 and 类 (包含在 Spring 发行版中)仅用于测试目的!这些变体没有 提供池化,并在发出多个连接请求时表现不佳。DriverManagerDataSourceSimpleDriverDataSource

以下部分使用 Spring 的实现。 稍后将介绍其他几种变体。DriverManagerDataSourceDataSourceSpring中文文档

要配置:DriverManagerDataSourceSpring中文文档

  1. 获取连接,就像通常获取 JDBC 一样 连接。DriverManagerDataSourceSpring中文文档

  2. 指定 JDBC 驱动程序的完全限定类名,以便可以加载驱动程序类。DriverManagerSpring中文文档

  3. 提供因 JDBC 驱动程序而异的 URL。(请参阅驱动程序的文档 以获得正确的值。Spring中文文档

  4. 提供用户名和密码以连接到数据库。Spring中文文档

以下示例演示如何在 Java 中配置 a:DriverManagerDataSourceSpring中文文档

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 配置:Spring中文文档

<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 的基本连接和配置。 要了解有助于控制池化功能的更多选项,请参阅产品 相应连接池实现的文档。Spring中文文档

以下示例显示了 DBCP 配置:Spring中文文档

<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 配置:Spring中文文档

<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 获取连接并在必要时关闭连接的方法。 它支持具有 but 的线程绑定 JDBC 也与 和 .DataSourceUtilsstaticConnectionDataSourceTransactionManagerJtaTransactionManagerJpaTransactionManagerSpring中文文档

请注意,这意味着连接访问,使用它 在每个 JDBC 操作的背后,隐式参与正在进行的事务。JdbcTemplateDataSourceUtilsSpring中文文档

实施SmartDataSource

该接口应由可以提供 连接到关系数据库。它扩展了接口,让 使用它的类查询在给定后是否应关闭连接 操作。当您知道需要重用连接时,这种用法是有效的。SmartDataSourceDataSourceSpring中文文档

扩展AbstractDataSource

AbstractDataSource是 Spring 实现的基类。它实现所有实现通用的代码。 如果您编写自己的实现,则应扩展该类。abstractDataSourceDataSourceAbstractDataSourceDataSourceSpring中文文档

SingleConnectionDataSource

该类是接口的实现,用于包装每次使用后未关闭的单个接口。 这不支持多线程。SingleConnectionDataSourceSmartDataSourceConnectionSpring中文文档

如果任何客户端代码在假定池连接时调用(如使用 持久性工具),则应将该属性设置为 。此设置 返回包装物理连接的 Close-suppressing 代理。请注意,您可以 不再将其转换为本机 Oracle 或类似对象。closesuppressClosetrueConnectionSpring中文文档

SingleConnectionDataSource主要是一个测试类。它通常可以轻松进行测试 应用程序服务器外部的代码,以及简单的 JNDI 环境。 与 相反,它始终重用相同的连接, 避免过度创建物理连接。DriverManagerDataSourceSpring中文文档

DriverManagerDataSource

该类是标准接口的实现,它通过 Bean 属性配置普通 JDBC 驱动程序,并且每次都返回一个新的。DriverManagerDataSourceDataSourceConnectionSpring中文文档

此实现对于 Jakarta EE 之外的测试和独立环境非常有用 容器,可以作为 Spring IoC 容器中的 Bean 或结合使用 具有简单的 JNDI 环境。假设池调用 关闭连接,以便任何可感知的持久性代码都应正常工作。然而 使用 JavaBean 样式的连接池(例如 )非常简单,即使在测试中也是如此 环境中,几乎总是最好使用这样的连接池而不是 .DataSourceConnection.close()DataSourcecommons-dbcpDriverManagerDataSourceSpring中文文档

TransactionAwareDataSourceProxy

TransactionAwareDataSourceProxy是目标的代理。代理包装 目标,以增加对 Spring 管理事务的认识。在这方面,它 类似于 Jakarta EE 服务器提供的事务性 JNDI。DataSourceDataSourceDataSourceSpring中文文档

很少需要使用此类,除非已经存在的代码必须 调用并传递了一个标准的JDBC接口实现。在这种情况下, 您仍然可以使用此代码,同时拥有此代码 参与 Spring 管理事务。通常最好写你的 通过使用更高级别的资源管理抽象(例如 或 )来拥有新代码。DataSourceJdbcTemplateDataSourceUtils

有关更多详细信息,请参阅 TransactionAwareDataSourceProxy javadoc。Spring中文文档

很少需要使用此类,除非已经存在的代码必须 调用并传递了一个标准的JDBC接口实现。在这种情况下, 您仍然可以使用此代码,同时拥有此代码 参与 Spring 管理事务。通常最好写你的 通过使用更高级别的资源管理抽象(例如 或 )来拥有新代码。DataSourceJdbcTemplateDataSourceUtils

DataSourceTransactionManager / JdbcTransactionManager

该类是单个 JDBC 的实现。它将 JDBC 从指定的线程绑定到当前正在执行的线程,可能会 允许每个 .DataSourceTransactionManagerPlatformTransactionManagerDataSourceConnectionDataSourceConnectionDataSourceSpring中文文档

需要应用程序代码来检索 JDBC,而不是 Java EE 的标准。它会引发未经检查的异常 而不是检查.所有框架类(如 )都使用 这种策略是隐含的。如果不与事务管理器一起使用,则查找策略 行为完全相同,因此可以在任何情况下使用。ConnectionDataSourceUtils.getConnection(DataSource)DataSource.getConnectionorg.springframework.daoSQLExceptionsJdbcTemplateDataSource.getConnectionSpring中文文档

该类支持保存点 (), 自定义隔离级别,以及根据需要应用的超时 JDBC 语句 查询超时。若要支持后者,应用程序代码必须使用 或 为每个创建的语句调用该方法。DataSourceTransactionManagerPROPAGATION_NESTEDJdbcTemplateDataSourceUtils.applyTransactionTimeout(..)Spring中文文档

您可以使用代替 单一资源案例,因为它不需要容器来支持 JTA 事务 协调者。在这些事务管理器之间切换只是一个配置问题, 前提是您坚持所需的连接查找模式。请注意,JTA 不支持 保存点或自定义隔离级别,并具有不同的超时机制,但除此之外 在 JDBC 资源和 JDBC 提交/回滚管理方面公开类似的行为。DataSourceTransactionManagerJtaTransactionManagerSpring中文文档

对于实际资源连接的 JTA 式延迟检索,Spring 提供了 目标连接池的对应代理类:请参阅 LazyConnectionDataSourceProxy。 这对于没有实际语句的潜在空事务特别有用 执行(在这种情况下从不获取实际资源),并且在前面 路由,表示采用事务同步的只读标志 和/或隔离级别考虑在内(例如)。DataSourceDataSourceIsolationLevelDataSourceRouterSpring中文文档

LazyConnectionDataSourceProxy还为只读连接提供特殊支持 在只读事务期间使用的池,避免了切换 JDBC 的开销 提取时每个事务的开头和结尾处的 Connection 只读标志 它来自主连接池(根据 JDBC 驱动程序,这可能很昂贵)。Spring中文文档

从 5.3 开始,Spring 提供了一个扩展变体,它增加了 提交/回滚时的异常转换功能(与 一致)。 Where will only throw(类似于 JTA),将数据库锁定失败等转换为 相应的子类。请注意,应用程序代码需要 为此类例外做好准备,而不是完全期望. 在这种情况下,建议选择。JdbcTransactionManagerJdbcTemplateDataSourceTransactionManagerTransactionSystemExceptionJdbcTransactionManagerDataAccessExceptionTransactionSystemExceptionJdbcTransactionManager

就异常行为而言,大致等同于 和 ,作为直接 彼此的伴侣/替代。 另一方面 等同于并可以作为那里的直接替代品。JdbcTransactionManagerJpaTransactionManagerR2dbcTransactionManagerDataSourceTransactionManagerJtaTransactionManagerSpring中文文档

从 5.3 开始,Spring 提供了一个扩展变体,它增加了 提交/回滚时的异常转换功能(与 一致)。 Where will only throw(类似于 JTA),将数据库锁定失败等转换为 相应的子类。请注意,应用程序代码需要 为此类例外做好准备,而不是完全期望. 在这种情况下,建议选择。JdbcTransactionManagerJdbcTemplateDataSourceTransactionManagerTransactionSystemExceptionJdbcTransactionManagerDataAccessExceptionTransactionSystemExceptionJdbcTransactionManager