|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
初始化数据来源
这org.springframework.jdbc.datasource.init包支持初始化
现存数据来源.嵌入式数据库支持提供了一种创建选项
并且初始化一个数据来源为了一个应用。不过,有时你可能需要初始化
一个运行在某服务器上的实例。
使用Spring XML初始化数据库
如果你想初始化一个数据库,并且可以提供一个引用数据来源豆子,你可以用初始化数据库标签在春季-JDBCNamespace:
<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>
前述示例对数据库运行了两个指定的脚本。第一
脚本创建模式,第二个脚本则用测试数据集填充表。剧本
位置也可以是带有通配符的图案,类似于Ant通常用于资源的风格
在春季(例如,classpath*:/com/foo/**/sql/*-data.sql).如果你使用
模式中,脚本按其URL或文件名的词汇顺序运行。
数据库初始化器的默认行为是无条件运行所提供的 脚本。这可能并不总是你想要的——比如,如果你跑步 脚本对应已经有测试数据的数据库。可能性 通过遵循常见模式(如前所述)可以减少意外删除数据的概率 先创建表格,然后插入数据。第一步失败 表格已经存在了。
然而,为了更好地控制现有数据的创建和删除,XML 命名空间提供了一些额外的选项。第一种是用于切换 初始化开启和关闭。你可以根据环境设置(比如拉取 来自系统属性或环境豆的布尔值)。以下示例从系统性质中获得一个值:
<jdbc:initialize-database data-source="dataSource"
enabled="#{systemProperties.INITIALIZE_DATABASE}"> (1)
<jdbc:script location="..."/>
</jdbc:initialize-database>
| 1 | 得到启用来自一个称为INITIALIZE_DATABASE. |
控制现有数据的第二种选择是更加宽容 失败。为此,你可以控制初始化器忽略某些 脚本运行的SQL错误,如下示例所示:
<jdbc:initialize-database data-source="dataSource" ignore-failures="DROPS">
<jdbc:script location="..."/>
</jdbc:initialize-database>
在前面的例子中,我们说的是我们期望脚本有时会被运行
对应一个空数据库,确实有一些落脚本中的陈述
因此,会失败。所以SQL 失败了落陈述会被忽略,但其他失败
将导致例外。如果你的SQL方言不支持,这很有用落。。。如果
存在(或类似情况)但你想无条件移除所有测试数据
重现它。在这种情况下,第一个文字通常是一组落语句
接着是一组创造语句。
这忽略失败选项可设为没有(默认),滴(忽略失败
滴落),或都(忽略所有失败)。
如果字符未分隔,每个语句应用新行或加一行
剧本里完全没有。你可以全局控制,或者逐个脚本控制,比如
以下示例展示了:;;
<jdbc:initialize-database data-source="dataSource" separator="@@"> (1)
<jdbc:script location="classpath:com/myapp/sql/db-schema.sql" separator=";"/> (2)
<jdbc:script location="classpath:com/myapp/sql/db-test-data-1.sql"/>
<jdbc:script location="classpath:com/myapp/sql/db-test-data-2.sql"/>
</jdbc:initialize-database>
| 1 | 将分隔符脚本设置为 。@@ |
| 2 | 将分隔符设为db-schema.sql自。; |
在这个例子中,两者测试数据脚本用作语句分隔符,仅
这@@db-schema.sql使用。该配置指定了默认分隔符
是,并且覆盖了该默认值;@@db-schema脚本。
如果你需要比XML命名空间更多的控制,可以使用数据源初始化器直接定义它,作为你应用中的一个组件。
依赖数据库的其他组件初始化
一大类应用程序(那些直到 Spring 上下文之后才使用数据库的应用) STARTED)可以直接使用数据库初始化器,无需更多 并发症。如果你的申请不是这些,可能需要仔细阅读剩下的部分 本节。
数据库初始化器依赖于数据来源实例并运行脚本
其初始化回调中提供(类似于初始化方法在 XML 豆中
定义,a@PostConstruct在组件中的方法,或afterPropertiesSet()在实现初始化Bean).如果其他豆子依赖于
同一个数据源,并且在初始化回调中使用该数据源,在那里
可能是因为数据尚未初始化。一个常见的例子
这是一个缓存,会迅速初始化并从应用程序数据库加载数据
启动。
要解决这个问题,你有两个选择:更改缓存初始化策略 或确保数据库初始化器先被初始化。
如果应用在你控制之中,改变缓存初始化策略可能很容易。 关于如何实现这一点,有一些建议包括:
-
让缓存在首次使用时懒惰初始化,这样可以提升应用启动效率 时间。
-
让缓存或一个独立组件初始化缓存实现
生命周期或SmartLifecycle.当应用上下文开始时,你可以 自动启动SmartLifecycle通过将其设置自动启动旗帜,你可以 手动启动生命周期通过呼叫ConfigurableApplicationContext.start()关于包围语境。 -
使用Spring
ApplicationEvent或类似的定制观察者机制来触发 缓存初始化。ContextRefreshedEvent当 时,总是由上下文发布 它在所有豆子初始化后即可使用,因此通常非常有用 钩子(这就是SmartLifecycle默认情况下是有效的)。
确保数据库初始化器先被初始化也很容易。关于如何实现这一点,有一些建议包括:
-
依赖Spring的默认行为
豆子工厂,也就是豆子是 初始化顺序为注册顺序。你可以通过采用公共资源来轻松安排 一组<import/>XML配置中的元素,可以对你的排序 应用程序模块并确保数据库和数据库初始化是 排在前面。 -
将
数据来源以及使用并控制其 启动顺序是把它们分开处理应用上下文实例(例如, 父上下文包含数据来源,子上下文包含业务 组件)。这种结构在 Spring Web 应用中很常见,但也可以有更多 通用。