控制数据库连接
用DataSource
Spring 通过 .A 是
是 JDBC 规范的一部分,是一个通用的连接工厂。它允许
容器或框架隐藏连接池和事务管理问题
从应用程序代码中。作为开发人员,您无需了解有关如何
连接到数据库。这是设置
数据源。在开发和测试代码时,您很可能会同时担任这两个角色,但您
不必知道生产数据源的配置方式。DataSource
DataSource
当您使用 Spring 的 JDBC 层时,您可以从 JNDI 获取数据源,或者您可以
使用第三方提供的 Connection Pool 实现配置您自己的 Integration。
传统的选择是 Apache Commons DBCP 和带有 bean 样式类的 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"/>
用DataSourceUtils
该类是一个方便而强大的帮助程序类,它提供了从 JNDI 获取连接并在必要时关闭连接的方法。
它支持线程绑定的 JDBC,但
也与 和 。DataSourceUtils
static
Connection
DataSourceTransactionManager
JtaTransactionManager
JpaTransactionManager
请注意,这意味着连接访问,使用它
在每个 JDBC 操作背后,隐式地参与正在进行的事务。JdbcTemplate
DataSourceUtils
实施SmartDataSource
该接口应由可以提供
连接到关系数据库。它扩展了接口,让
使用它的类查询是否应在给定的
操作。当您知道需要重用连接时,这种用法非常有效。SmartDataSource
DataSource
扩展AbstractDataSource
AbstractDataSource
是 Spring 实现的基类。它实现所有实现通用的代码。
如果您编写自己的 implementation ,则应扩展该类。abstract
DataSource
DataSource
AbstractDataSource
DataSource
用SingleConnectionDataSource
该类是接口的实现,它包装了每次使用后未关闭的 single。
这不支持多线程。SingleConnectionDataSource
SmartDataSource
Connection
如果任何客户端代码在假设池连接的情况下调用(如使用
持久性工具),则应将该属性设置为 。此设置
返回包装物理连接的关闭抑制代理。请注意,您可以
不再将此强制转换为本机 Oracle 或类似对象。close
suppressClose
true
Connection
SingleConnectionDataSource
主要是一个测试类。它通常可以轻松测试
与简单的 JNDI 环境相结合。
与 相反,它始终重用相同的连接,
避免过度创建物理连接。DriverManagerDataSource
用DriverManagerDataSource
该类是标准接口的实现,该接口通过 Bean 属性配置普通 JDBC 驱动程序,并每次返回一个新的驱动程序。DriverManagerDataSource
DataSource
Connection
此实现对于 Jakarta EE 之外的测试和独立环境非常有用
容器,作为 Spring IoC 容器中的 Bean 或结合使用
使用简单的 JNDI 环境。池假设调用
关闭连接,以便任何 -aware 持久性代码都应该可以正常工作。然而
使用 JavaBean 风格的连接池(例如 )非常简单,即使在测试中也是如此
环境中,则使用这样的连接池几乎总是比 更可取。DataSource
Connection.close()
DataSource
commons-dbcp
DriverManagerDataSource
用TransactionAwareDataSourceProxy
TransactionAwareDataSourceProxy
是目标 的代理。代理会包装
target 来增加对 Spring 管理的事务的感知。在这方面,它
类似于 Jakarta EE 服务器提供的事务性 JNDI 。DataSource
DataSource
DataSource
很少需要使用此类,除非必须为现有代码
调用并传递标准 JDBC 接口实现。在这种情况下,
您仍然可以让此代码可用,同时拥有此代码
参与 Spring 管理的事务。通常最好编写
通过使用更高级别的资源管理抽象(如 OR)来拥有新代码。DataSource JdbcTemplate DataSourceUtils |
有关更多详细信息,请参见 TransactionAwareDataSourceProxy
javadoc。
用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
该类支持 savepoints ()、
自定义隔离级别和超时,作为适当的 JDBC 语句应用
查询超时。为了支持后者,应用程序代码必须使用 或
为每个 created 语句调用 method。DataSourceTransactionManager
PROPAGATION_NESTED
JdbcTemplate
DataSourceUtils.applyTransactionTimeout(..)
您可以在
single-resource 的情况下,因为它不需要容器支持 JTA 事务
协调者。在这些事务管理器之间切换只是一个配置问题,
前提是您坚持使用所需的连接查找模式。请注意,JTA 不支持
SavePoint 或自定义隔离级别,并且具有不同的超时机制,但其他情况
在 JDBC 资源和 JDBC 提交/回滚管理方面公开了类似的行为。DataSourceTransactionManager
JtaTransactionManager
对于实际资源连接的 JTA 样式的惰性检索, Spring 提供了一个
目标连接池对应的代理类:参见 LazyConnectionDataSourceProxy
。
这对于没有实际语句的潜在空交易特别有用
执行(在这种情况下,从不获取实际资源),并且还在
一个路由,表示采用事务同步的只读标志
和/或隔离级别(例如,)。DataSource
DataSource
IsolationLevelDataSourceRouter
LazyConnectionDataSourceProxy
还为只读连接提供特殊支持
pool 在只读事务期间使用,避免了切换 JDBC 的开销
获取时,每个事务的开头和结尾处都有 Connection 的只读标志
它来自主连接池(这可能会很昂贵,具体取决于 JDBC 驱动程序)。
从 5.3 开始, Spring 提供了一个扩展的变体,它添加了
提交/回滚时的异常转换功能(与 一致)。
Where 只会抛出(类似于 JTA),将数据库锁定失败等转换为
相应的子类。请注意,应用程序代码需要
为此类异常做好准备,而不是完全期望 .
在这种情况下,是推荐的选择。JdbcTransactionManager JdbcTemplate DataSourceTransactionManager TransactionSystemException JdbcTransactionManager DataAccessException TransactionSystemException JdbcTransactionManager |
就异常行为而言, 大致等同于 和 ,作为立即
companion / replacement 彼此。 另一方面
等同于并且可以作为那里的直接替换。JdbcTransactionManager
JpaTransactionManager
R2dbcTransactionManager
DataSourceTransactionManager
JtaTransactionManager