【发布时间】:2017-07-11 03:31:15
【问题描述】:
为了拥有一个可升级的最新数据库,我使用了默认PlaySpec 的扩展,灵感来自this SO question:
trait ResetDbSpec extends PlaySpec with BeforeAndAfterAll {
lazy val appBuilder = new GuiceApplicationBuilder()
lazy val injector = appBuilder.injector()
lazy val databaseApi = injector.instanceOf[DBApi]
override def beforeAll() = {
Evolutions.applyEvolutions(databaseApi.database("default"))
}
override def afterAll() = {
Evolutions.cleanupEvolutions(databaseApi.database("default"))
databaseApi.database("default").shutdown()
}
}
它在套件启动时应用数据库演变,并在套件结束时恢复它们。然后测试看起来像
class ProjectsSpec extends ResetDbSpec with OneAppPerSuite { ...
在添加更多这样的测试后,我遇到了一个点,即当我单独运行它们时,一些测试成功,但由于以下错误而失败:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:数据源拒绝建立连接,来自服务器的消息:“连接太多”
从上面的代码可以看出,我尝试添加这一行
databaseApi.database("default").shutdown()
在afterAll() 中缓解这种情况,但没有效果。我试图不并行运行测试,但也没有效果。我在哪里打开数据库连接而不关闭它们,我应该在哪里调用shutdown()?
注意我使用 Play 2.5.10 和 Slick 3.1。
【问题讨论】:
-
应用程序是否试图在池中保持比数据库允许打开更多的连接数?
-
@MichaelZajac 我该如何验证?
-
将
lazy val databaseApi更改为def databaseApi有帮助吗?否则,您可以检查playframework.com/documentation/2.5.x/SettingsJDBC 来调整最大池大小。此外,就像@MichaelZajac 所说,您可以检查本地数据库配置以查看它允许多少连接。 -
@Eric
def databaseApi没有帮助。我正在阅读有关如何使用 Slick 设置池大小的信息,但它相当令人困惑 :( 它说要查看一些 JDBCforConfig东西“但其中大部分都被忽略了”,然后增加线程数或队列大小。@ 987654323@. 我应该选择后者吗? -
我在 slick.dbs.default 中设置了
numThreads=200和queueSize=500,但是没有效果。我也试过maxConnections=5000。编辑:在“slick.dbs.default.db”中,“connectionTimeout”属性有效果(等待更长时间),所以我把所有东西都移到了那里,但它仍然不起作用。
标签: scala testing playframework playframework-2.5 play-slick