§Play Slick 迁移指南
本指南介绍如何从 Play Slick 迁移到支持新 Slick 3.0 API 的版本。
假设您已经将项目迁移到使用 Play 2.5(请参阅 Play 2.5 迁移指南),您已经阅读了 Slick 文档,并且已准备好将 Play 应用程序迁移到使用新的 Slick 数据库 I/O Actions API。
§构建变更
在您的 sbt 构建中更新 Play Slick 依赖项,以匹配 设置 部分中提供的版本。
§已移除 H2 数据库依赖项
以前的 Play Slick 版本捆绑了 H2 数据库库。现在不再是这种情况。因此,如果您想使用 H2,则需要将其显式添加到项目的依赖项中。
"com.h2database" % "h2" % "${H2_VERSION}" // replace `${H2_VERSION}` with an actual version number
§Evolutions 支持在单独的模块中
对 数据库演变 的支持曾经包含在 Play Slick 中。现在不再是这种情况。因此,如果您正在使用演变,则现在需要添加一个额外的依赖项到 play-slick-evolutions
,如 此处 所述。
如果您没有使用演变,则现在可以安全地从 application.conf
中删除 evolutionplugin=disabled
。
§数据库配置
在 Play Slick 的过去版本中(使用 Slick 2.1 或更早版本),您配置 Slick 数据源的方式与配置 Play JDBC 数据源的方式相同。现在情况不再如此,以下配置将被 Play Slick **忽略**。
db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"
db.default.user=sa
db.default.password=""
此更改有几个原因。首先,以上配置不是有效的 Slick 配置。其次,从 Slick 3 开始,您不仅要配置数据源,还要配置连接池和线程池。因此,Play Slick 使用完全不同的路径来配置 Slick 数据库是有意义的。Slick 配置的默认路径现在是 slick.dbs
。
以下是您迁移上述配置的方式
slick.dbs.default.profile="slick.jdbc.H2Profile$" # You must provide the required Slick profile!
slick.dbs.default.db.driver=org.h2.Driver
slick.dbs.default.db.url="jdbc:h2:mem:play"
slick.dbs.default.db.user=sa
slick.dbs.default.db.password=""
**注意**:如果您的数据库配置包含连接池设置,请注意您需要迁移这些设置。但是,这可能有点棘手,因为 Play 2.3 默认连接池曾经是 BoneCP,而 Slick 3 默认连接池是 HikariCP。阅读 此处 以了解如何配置连接池。
§自动 Slick 驱动程序检测
Play Slick 以前会自动从数据源配置中推断所需的 Slick 驱动程序。此功能已被删除,因此您必须为每个 Slick 数据库配置在您的 **application.conf
** 中提供要使用的 Slick 驱动程序。
删除此方便功能的原因是,我们希望只接受有效的 Slick 配置。此外,并非总是可以从数据库配置中自动检测到正确的 Slick 驱动程序(如果可以,那么 Slick 已经提供了这样的功能)。
因此,您需要进行以下更改
- 每个 Slick 数据库配置都必须提供 Slick 驱动程序(请参阅 此处 以了解如何迁移数据库配置的示例)。
- 删除对
import play.api.db.slick.Config.driver.simple._
的所有导入。 - 阅读 此处 以了解如何查找 Slick 驱动程序和数据库实例(这些实例是使用新的 Slick 3 数据库 I/O 操作 API 所需的)。
§DBAction
和 DBSessionRequest
已被删除
Play Slick 以前提供了一个 DBAction
,它对以下方面很有用
- 将 Slick
Session
方便地传递到您的 Action 方法中。 - 在单独的线程池中执行操作的主体,以及对数据库的任何阻塞调用。
- 限制线程池中排队的阻塞请求数量(有助于限制应用程序的延迟)
DBAction
在使用 Slick 2.1 时确实很方便。但是,随着新的 Slick 3 版本的发布,我们不再需要它。原因是 Slick 3 带有一个新的异步 API(又名数据库 I/O 操作 API),它不需要用户操作 Session
或 Connection
。这使得 DBSessionRequest
和 DBAction
以及它的亲密朋友 CurrentDBAction
和 PredicatedDBAction
完全过时,这就是它们被移除的原因。
话虽如此,迁移你的代码应该像将所有 DBAction
及其朋友的出现更改为标准的 Play Action.async
一样简单。点击 这里 查看示例。
§线程池
Play Slick 以前提供一个单独的线程池来执行需要访问数据库的控制器的操作。Slick 3 已经完全做到了这一点,因此 Play Slick 不再需要创建和管理额外的线程池。因此,以下配置参数实际上已经过时,应该从你的 applications.conf 中删除
db.$dbName.maxQueriesPerRequest
slick.db.execution.context
参数 db.$dbName.maxQueriesPerRequest
用于限制线程池中排队的任务数量。在 Slick 3 中,你可以通过调整配置参数 numThreads
和 queueSize
来获得类似的结果。阅读 Slick ScalaDoc 的 Database.forConfig(确保在文档中展开 forConfig
行)。
虽然参数 slick.db.execution.context
用于命名 Play Slick 创建的线程池。在 Slick 3 中,每个线程池都使用 Slick 数据库配置路径命名,例如,如果在你的 application.conf
中,你为名为 default
的数据库提供了 Slick 配置,那么 Slick 将创建一个名为 default
的线程池来执行默认数据库上的数据库操作。请注意,线程池使用的名称不可配置。
§Profile
已被移除
特征 Profile
已被移除,你可以使用 HasDatabaseConfigProvider
或 HasDatabaseConfig
来获得类似的结果。
要使用的特征取决于你选择检索 Slick 数据库和驱动程序(即 DatabaseConfig
的实例)的方法。如果你决定使用依赖注入,那么 HasDatabaseConfigProvider
将非常适合你。否则,请使用 HasDatabaseConfig
。
阅读 这里,了解如何使用依赖注入与全局查找来检索 DatabaseConfig
的实例。
§Database
已被移除
Database
对象已被移除。要检索 Slick 数据库和驱动程序(即 DatabaseConfig
的实例),请阅读 此处。
§Config
已被移除
Config
对象以及 SlickConfig
和 DefaultSlickConfig
已被移除。这些抽象不再需要。如果您以前调用 Config.driver
或 Config.datasource
来检索 Slick 驱动程序和数据库,您现在应该使用 DatabaseConfigProvider
。有关详细信息,请阅读 此处。
§SlickPlayIteratees
已被移除
如果您以前使用 SlickPlayIteratees.enumerateSlickQuery
从数据库流式传输数据,您会很高兴知道这样做变得容易多了。Slick 3 实现了 reactive-streams SPI (服务提供者接口),Play 2.5 提供了一个实用程序类,可以方便地将响应式流转换为 Play 枚举器。
在 Slick 中,您可以通过在 Slick 数据库实例上调用 stream
方法(而不是急切的 run
)来获取响应式流。要将流转换为枚举器,只需调用 play.api.libs.streams.Streams.publisherToEnumerator
,并将流作为参数传递。
有关完整示例,请查看 此示例项目。
§DDL 支持已被移除
以前版本的 Play Slick 包含一个 DDL 插件,该插件将读取您的 Slick 表定义,并在重新加载时自动创建架构更新。虽然这是一个有趣且有用的功能,但底层实现很脆弱,并且依赖于您的表可以通过模块(即 Scala object
)访问的假设。这种编码模式之所以可能,是因为 Play Slick 允许导入通过顶级导入提供的 Slick 驱动程序。但是,由于对 自动检测 Slick 驱动程序 的支持已被移除,您将不再为 Slick 驱动程序声明顶级导入。这意味着 Slick 表将不再可以通过模块访问。这一事实打破了 DDL 插件初始实现中所做的假设,这也是该功能被移除的原因。
上述结果是您负责创建和管理项目的数据库架构。因此,每当您在代码中更改 Slick 表时,请确保也更新数据库架构。如果您发现手动保持数据库架构和代码中相关表定义同步很繁琐,您可能需要查看 Slick 中提供的代码生成功能。
下一步: Play Slick 高级主题
发现文档中的错误?此页面的源代码可以在 这里 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区进行交流。