Slick和bonecp:org.postgresql.util.PSQLException:致命:对不
在我开发应用程序的本地时,我使用sbt run启动我的play2应用程序
我喜欢如何更改代码,然后重新加载浏览器以查看我的更改. 大约10次代码更改后,我得到一个postgresql太多的连接错误(见下文). 我的数据库连接使用下面的DatabaseAccess.scala类. 我猜测每次重新加载它都会创建一堆连接到postgresql.在我的全球目前正在做的事情: override def onStart(app: Application) { Logger.info("Global.onStart") DatabaseAccess.loadConfiguration() } 在生产中我也担心如果我在短时间内进行多次部署,或者启动/停止我的服务,我也可能遇到这个问题. 如何确保所有连接都被破坏?我知道我可以在onStart或OnStop上放一些东西,但我不确定如何清除以前可能存在的连接. (假设这不是一个bug) 我确实创建了一个我在onStop上调用的release()方法,但这似乎不起作用: def release() { configs = Map[String,BoneCPConfig]() dataSources = Map[String,BoneCPDataSource]() databases = dataSources.map { case(key,value) => (key,Database.forDataSource(value)) } } 我所做的只是重新启动变量,所以我想这不是我真正需要做的. 我的数据访问模式如下: def getById(userId: Int): Option[User] = { db.withSession { implicit session => return userDao.getById(userId) } } 我的数据库访问类看起来像: https://github.com/TechEmpower/FrameworkBenchmarks/blob/master/unfiltered/src/main/scala/DatabaseAccess.scala 我的application.conf连接如下所示: #postgresql db.default.driver="org.postgresql.Driver" db.default.url = "jdbc:postgresql://localhost/testweb_development" db.default.user = "testdbuser" db.default.password = "" db.default.minConnections = 4 db.default.maxConnections = 24 db.default.maxThreads = 2 在大约10次代码更改之后开发本地时,并且做了很好的部分类重新加载我得到了这个错误: play.api.Application$$anon$1: Execution exception[[SQLException: Unable to open a test connection to the given database. JDBC url = jdbc:postgresql://localhost/testweb_development,username = testdbuser. Terminating connection pool (set lazyInit to true if you expect to start your database after your app). Original Exception: ------ org.postgresql.util.PSQLException: FATAL: sorry,too many clients already at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:291) at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:108) at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66) at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125) at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30) at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22) at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:30) at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24) at org.postgresql.Driver.makeConnection(Driver.java:393) at org.postgresql.Driver.connect(Driver.java:267) at java.sql.DriverManager.getConnection(DriverManager.java:582) at java.sql.DriverManager.getConnection(DriverManager.java:185) at com.jolbox.bonecp.BoneCP.obtainRawInternalConnection(BoneCP.java:363) at com.jolbox.bonecp.BoneCP.<init>(BoneCP.java:416) at com.jolbox.bonecp.BoneCPDataSource.getConnection(BoneCPDataSource.java:120) at scala.slick.jdbc.JdbcBackend$DatabaseFactoryDef$$anon$4.createConnection(JdbcBackend.scala:47) at scala.slick.jdbc.JdbcBackend$BaseSession.conn$lzycompute(JdbcBackend.scala:302) at scala.slick.jdbc.JdbcBackend$BaseSession.conn(JdbcBackend.scala:302) at scala.slick.jdbc.JdbcBackend$BaseSession.close(JdbcBackend.scala:316) at scala.slick.backend.DatabaseComponent$DatabaseDef$class.withSession(DatabaseComponent.scala:31) at scala.slick.jdbc.JdbcBackend$DatabaseFactoryDef$$anon$4.withSession(JdbcBackend.scala:46) at com.exampleapp.services.UserServiceImpl.getById(UserService.scala:37) at controllers.UsersController$$anonfun$show$1.apply(UsersController.scala:84) at controllers.UsersController$$anonfun$show$1.apply(UsersController.scala:76) at play.api.mvc.ActionBuilder$$anonfun$apply$10.apply(Action.scala:221) at play.api.mvc.ActionBuilder$$anonfun$apply$10.apply(Action.scala:220) at controllers.ActionWithContext$.invokeBlock(BaseController.scala:42) at play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:309) at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:109) at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:109) at play.utils.Threads$.withContextClassLoader(Threads.scala:18) at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:108) at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:107) at scala.Option.map(Option.scala:145) at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:107) at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:100) at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:481) at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:481) at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:517) at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:517) at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(Iteratee.scala:493) at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(Iteratee.scala:493) at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:42) at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386) at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 环境 I am running scala 2.10.3,play 2.2.3 I am launching my app using sbt run. Postgresql driver version: 9.1-901.jdbc4 slick version: 2.0.1 bonecp version: 0.8.0.RELEASE 解决方法
Slick自动处理会话关闭.从文档:
问题是Bonecp的dataSource连接未关闭,如this gist所示,您需要使用dataSource.close()手动关闭它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |