Scala Play 2.5 与 Slick 3 和 Spec2

Posted

技术标签:

【中文标题】Scala Play 2.5 与 Slick 3 和 Spec2【英文标题】:Scala Play 2.5 with Slick 3 and Spec2 【发布时间】:2017-03-30 22:59:27 【问题描述】:

我有一个使用 Slick 的播放应用程序,我想使用 Spec2 进行测试,但我不断收到错误 org.postgresql.util.PSQLException: FATAL: sorry, too many clients already。我试图通过使用关闭数据库连接

val mockApp = new GuiceApplicationBuilder()
val db = mockApp.injector.instanceOf[DBApi].database("default")

...

override def afterAll = 
  db.getConnection().close()
  db.shutdown()

但错误仍然存​​在。光滑的配置是

slick.dbs.default.driver="slick.driver.PostgresDriver$"
slick.dbs.default.db.driver="org.postgresql.Driver"
slick.dbs.default.db.url="jdbc:postgresql://db:5432/hygge_db"
slick.dbs.default.db.user="*****"
slick.dbs.default.db.password="*****"

【问题讨论】:

【参考方案1】:

getConnection 的 DbApi 要么从底层数据源的(JdbcDataSource 我推测)池中获取连接,要么创建一个新的。我看到您的配置中没有指定池,所以我认为它总是为您创建一个新池。因此,如果您没有在测试中关闭连接 - getConnection 将无济于事 - 它只会尝试创建一个新连接或从池中获取随机连接(如果启用了池)。

所以解决办法是要么配置连接池:

使用连接池时(在 生产环境)连接池的最小大小 也应设置为至少相同的大小。的最大尺寸 连接池可以设置得比阻塞应用程序高得多。 任何超出线程池大小的连接都只会被使用 当需要其他连接来保持数据库会话打开时 (例如,在等待异步计算的结果时 交易的中间)但没有积极地做任何工作 数据库。

所以您可以在配置中设置最大可用连接数:

connectionPool = 5

或者您可以共享相同的连接(然后您可能必须确保顺序性):

object SharedConnectionForAllTests 
  val connection = db.getConnection()
  def close() = connection.close()

当然最好用 Spring/Guice 注入它,这样你就可以方便地管理连接的生命周期。

【讨论】:

添加一个共享连接对象成功了,slick 为你管理你的连接池,但是我创建了多个 guice 注入器,每个都创建了自己的连接池,它压倒了数据库。谢谢!

以上是关于Scala Play 2.5 与 Slick 3 和 Spec2的主要内容,如果未能解决你的问题,请参考以下文章

Scala + Play Framework + Slick - Json 作为模型字段

Scala Play Framework Slick 会话不起作用

如何使用 Play with Scala 和 Slick 从数据库中获取记录

SQLite 与 Slick and Play

使用 Play with Scala 和 Slick 在不同文件上的表之间建立一对多关系

未解决的依赖关系:com.typesafe.play#play-slick_2.10;0.6.0.1:未找到