此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10! |
用DataSource
Spring 通过 .A 是
JDBC 规范的一部分,是一个通用的连接工厂。它让一个
容器或框架隐藏连接池和事务管理问题
从应用程序代码。作为开发人员,您无需了解有关如何
连接到数据库。这是设置的管理员的责任
数据源。在开发和测试代码时,您很可能会同时担任这两个角色,但您
不必知道生产数据源的配置方式。DataSource
DataSource
使用 Spring 的 JDBC 层时,可以从 JNDI 获取数据源,也可以
使用第三方提供的连接池实现配置自己的连接池。
传统的选择是带有 Bean 样式类的 Apache Commons DBCP 和 C3P0;
对于现代 JDBC 连接池,请考虑使用 HikariCP 及其构建器样式的 API。DataSource
您应该使用 and 类
(包含在 Spring 发行版中)仅用于测试目的!这些变体没有
提供池化,并在发出多个连接请求时表现不佳。DriverManagerDataSource SimpleDriverDataSource |
以下部分使用 Spring 的实现。
稍后将介绍其他几种变体。DriverManagerDataSource
DataSource
要配置:DriverManagerDataSource
-
获取连接,就像通常获取 JDBC 一样 连接。
DriverManagerDataSource
-
指定 JDBC 驱动程序的完全限定类名,以便可以加载驱动程序类。
DriverManager
-
提供因 JDBC 驱动程序而异的 URL。(请参阅驱动程序的文档 以获得正确的值。
-
提供用户名和密码以连接到数据库。
以下示例演示如何配置:DriverManagerDataSource
-
Java
-
Kotlin
-
Xml
@Bean
DriverManagerDataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:hsql://localhost:");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
@Bean
fun dataSource() = DriverManagerDataSource().apply {
setDriverClassName("org.hsqldb.jdbcDriver")
url = "jdbc:hsqldb:hsql://localhost:"
username = "sa"
password = ""
}
<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 配置:
-
Java
-
Kotlin
-
Xml
@Bean(destroyMethod = "close")
BasicDataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:hsql://localhost:");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
@Bean(destroyMethod = "close")
fun dataSource() = BasicDataSource().apply {
driverClassName = "org.hsqldb.jdbcDriver"
url = "jdbc:hsqldb:hsql://localhost:"
username = "sa"
password = ""
}
<bean id="dataSource" class="org.apache.commons.dbcp2.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 配置:
-
Java
-
Kotlin
-
Xml
@Bean(destroyMethod = "close")
ComboPooledDataSource dataSource() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("org.hsqldb.jdbcDriver");
dataSource.setJdbcUrl("jdbc:hsqldb:hsql://localhost:");
dataSource.setUser("sa");
dataSource.setPassword("");
return dataSource;
}
@Bean(destroyMethod = "close")
fun dataSource() = ComboPooledDataSource().apply {
driverClass = "org.hsqldb.jdbcDriver"
jdbcUrl = "jdbc:hsqldb:hsql://localhost:"
user = "sa"
password = ""
}
<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 发行版中)仅用于测试目的!这些变体没有
提供池化,并在发出多个连接请求时表现不佳。DriverManagerDataSource SimpleDriverDataSource |
用DataSourceUtils
该类是一个方便且功能强大的帮助程序类,它提供了从 JNDI 获取连接并在必要时关闭连接的方法。
它支持具有 but 的线程绑定 JDBC
也与 和 .DataSourceUtils
static
Connection
DataSourceTransactionManager
JtaTransactionManager
JpaTransactionManager
请注意,这意味着连接访问,使用它
在每个 JDBC 操作的背后,隐式参与正在进行的事务。JdbcTemplate
DataSourceUtils
实施SmartDataSource
该接口应由可以提供
连接到关系数据库。它扩展了接口,让
使用它的类查询在给定后是否应关闭连接
操作。当您知道需要重用连接时,这种用法是有效的。SmartDataSource
DataSource
扩展AbstractDataSource
AbstractDataSource
是 Spring 实现的基类。它实现所有实现通用的代码。
如果您编写自己的实现,则应扩展该类。abstract
DataSource
DataSource
AbstractDataSource
DataSource
用SingleConnectionDataSource
该类是接口的实现,用于包装每次使用后未关闭的单个接口。
这不支持多线程。SingleConnectionDataSource
SmartDataSource
Connection
如果任何客户端代码在假定池连接时调用(如使用
持久性工具),则应将该属性设置为 。此设置
返回包装物理连接的 Close-suppressing 代理。请注意,您可以
不再将其转换为本机 Oracle 或类似对象。close
suppressClose
true
Connection
SingleConnectionDataSource
主要是一个测试类。它通常可以轻松进行测试
应用程序服务器外部的代码,以及简单的 JNDI 环境。
与 相反,它始终重用相同的连接,
避免过度创建物理连接。DriverManagerDataSource
用DriverManagerDataSource
该类是标准接口的实现,它通过 Bean 属性配置普通 JDBC 驱动程序,并且每次都返回一个新的。DriverManagerDataSource
DataSource
Connection
此实现对于 Jakarta EE 之外的测试和独立环境非常有用
容器,可以作为 Spring IoC 容器中的 Bean 或结合使用
具有简单的 JNDI 环境。假设池调用
关闭连接,以便任何可感知的持久性代码都应正常工作。然而
使用 JavaBean 样式的连接池(例如 )非常简单,即使在测试中也是如此
环境中,几乎总是最好使用这样的连接池而不是 .DataSource
Connection.close()
DataSource
commons-dbcp
DriverManagerDataSource
用TransactionAwareDataSourceProxy
TransactionAwareDataSourceProxy
是目标的代理。代理包装
目标,以增加对 Spring 管理事务的认识。在这方面,它
类似于 Jakarta EE 服务器提供的事务性 JNDI。DataSource
DataSource
DataSource
很少需要使用此类,除非已经存在的代码必须
调用并传递了一个标准的JDBC接口实现。在这种情况下,
您仍然可以使用此代码,同时拥有此代码
参与 Spring 管理事务。通常最好写你的
通过使用更高级别的资源管理抽象(例如 或 )来拥有新代码。DataSource JdbcTemplate DataSourceUtils |
有关更多详细信息,请参阅 TransactionAwareDataSourceProxy
javadoc。
很少需要使用此类,除非已经存在的代码必须
调用并传递了一个标准的JDBC接口实现。在这种情况下,
您仍然可以使用此代码,同时拥有此代码
参与 Spring 管理事务。通常最好写你的
通过使用更高级别的资源管理抽象(例如 或 )来拥有新代码。DataSource JdbcTemplate DataSourceUtils |
用DataSourceTransactionManager
/ JdbcTransactionManager
该类是单个 JDBC 的实现。它将 JDBC 从指定的线程绑定到当前正在执行的线程,可能会
允许每个 .DataSourceTransactionManager
PlatformTransactionManager
DataSource
Connection
DataSource
Connection
DataSource
需要应用程序代码来检索 JDBC,而不是 Java EE 的标准。它会引发未经检查的异常
而不是检查.所有框架类(如 )都使用
这种策略是隐含的。如果不与事务管理器一起使用,则查找策略
行为完全相同,因此可以在任何情况下使用。Connection
DataSourceUtils.getConnection(DataSource)
DataSource.getConnection
org.springframework.dao
SQLExceptions
JdbcTemplate
DataSource.getConnection
该类支持保存点 (),
自定义隔离级别,以及根据需要应用的超时 JDBC 语句
查询超时。若要支持后者,应用程序代码必须使用 或
为每个创建的语句调用该方法。DataSourceTransactionManager
PROPAGATION_NESTED
JdbcTemplate
DataSourceUtils.applyTransactionTimeout(..)
您可以使用代替
单一资源案例,因为它不需要容器来支持 JTA 事务
协调者。在这些事务管理器之间切换只是一个配置问题,
前提是您坚持所需的连接查找模式。请注意,JTA 不支持
保存点或自定义隔离级别,并具有不同的超时机制,但除此之外
在 JDBC 资源和 JDBC 提交/回滚管理方面公开类似的行为。DataSourceTransactionManager
JtaTransactionManager
对于实际资源连接的 JTA 式延迟检索,Spring 提供了
目标连接池的对应代理类:请参阅 LazyConnectionDataSourceProxy
。
这对于没有实际语句的潜在空事务特别有用
执行(在这种情况下从不获取实际资源),并且在前面
路由,表示采用事务同步的只读标志
和/或隔离级别考虑在内(例如)。DataSource
DataSource
IsolationLevelDataSourceRouter
LazyConnectionDataSourceProxy
还为只读连接提供特殊支持
在只读事务期间使用的池,避免了切换 JDBC 的开销
提取时每个事务的开头和结尾处的 Connection 只读标志
它来自主连接池(根据 JDBC 驱动程序,这可能很昂贵)。
从 5.3 开始,Spring 提供了一个扩展变体,它增加了
提交/回滚时的异常转换功能(与 一致)。
Where will only throw(类似于 JTA),将数据库锁定失败等转换为
相应的子类。请注意,应用程序代码需要
为此类例外做好准备,而不是完全期望.
在这种情况下,建议选择。JdbcTransactionManager JdbcTemplate DataSourceTransactionManager TransactionSystemException JdbcTransactionManager DataAccessException TransactionSystemException JdbcTransactionManager |
就异常行为而言,大致等同于 和 ,作为直接
彼此的伴侣/替代。 另一方面
等同于并可以作为那里的直接替代品。JdbcTransactionManager
JpaTransactionManager
R2dbcTransactionManager
DataSourceTransactionManager
JtaTransactionManager
从 5.3 开始,Spring 提供了一个扩展变体,它增加了
提交/回滚时的异常转换功能(与 一致)。
Where will only throw(类似于 JTA),将数据库锁定失败等转换为
相应的子类。请注意,应用程序代码需要
为此类例外做好准备,而不是完全期望.
在这种情况下,建议选择。JdbcTransactionManager JdbcTemplate DataSourceTransactionManager TransactionSystemException JdbcTransactionManager DataAccessException TransactionSystemException JdbcTransactionManager |