Scala Play 2.5带有Slick 3和Spec2

时间:2017-03-30 22:59:27

标签: postgresql scala playframework slick

我有一个使用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 个答案:

答案 0 :(得分:0)

DbApi的

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

所以解决方案是配置连接池:

  

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

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

connectionPool = 5

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

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

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