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 从数据库中获取记录