我有一个使用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="*****"
答案 0 :(得分:0)
getConnection
要么从底层数据源(JdbcDataSource
我推测)池中获取连接,要么创建一个新池。我看到你的配置中没有指定池,所以我认为它总是会为你创建一个新池。因此,如果您未在测试中关闭连接 - getConnection
将无济于事 - 它将尝试创建一个新连接或从池中获取随机连接(如果启用了池)。
所以解决方案是配置连接池:
使用连接池时(始终建议使用连接池) 生产环境)连接池的最小大小 也应该设置为至少相同的大小。最大的大小 连接池可以设置得比阻塞应用程序高得多。 超出线程池大小的任何连接都只会被使用 何时需要其他连接以保持数据库会话打开 (例如,在等待异步计算的结果时) 在交易的中间),但没有积极做任何工作 数据库。
所以您只需在配置中设置最大可用连接数:
connectionPool = 5
或者您可以共享相同的连接(您可能必须确保顺序性):
object SharedConnectionForAllTests{
val connection = db.getConnection()
def close() = connection.close()
}
最好用Spring / Guice注入它,这样你就可以方便地管理连接的生命周期。