[英]Slick Connection Pool on per requests
如何使用光滑的连接池?
例如 :
使用此配置:
database {
dataSourceClass = org.postgresql.ds.PGSimpleDataSource
driver = org.postgresql.Driver
properties = {
url = "jdbc:postgresql://172.17.0.2/sampleDB"
user = "user"
password = "userpass"
}
minConnections = 10
maxConnections = 20
numThreads = 10
}
我只有一个客户端,并且此客户端带有Web浏览器,要求从API中获取所有人。
现在光滑生成到数据库的10个连接。
第二步,客户端刷新浏览器并滑动生成新的数据库10连接,而无需使用以前的连接。
然后在浏览器中进行新的刷新并生成另一个与数据库的10连接。 (现在我只有一个客户端就可以在数据库上建立约30个连接!)
为什么呢 这很正常 ?
为什么maxConnections不起作用?
请求后我必须关闭连接吗?
还是忘记了一些配置?
更新资料
这是我的示例API:
trait PersonsApi extends DatabaseConfig with JsonMapper {
val getAllPersons = (path("persons") & get) {
complete(db.run(PersonDao.findAll))
}
val getPersonById = (path("persons" / IntNumber) & get) {
num => complete(db.run(PersonDao.findById(num)))
}
val personsApi =
getAllPersons ~
getPersonById
}
这是我的示例实体类(DAO模式):
class PersonTable(tag: Tag) extends Table[Person](tag, "persons") {
def id = column[Long]("id", O.AutoInc, O.PrimaryKey)
def name = column[String]("name")
def family = column[String]("family")
override def * : ProvenShape[Person] = (id.?, name, family) <> (Person.tupled, Person.unapply)
}
object PersonDao extends BaseDao {
def findAll = personTable.result
def findById(id: Long) = personTable.filter(_.id === id).result
}
此DatabaseConfig接口:
trait DatabaseConfig extends Config {
val driver = slick.driver.PostgresDriver
import driver.api._
def db = Database.forConfig("database")
}
注意 :我不使用play框架。
您的配置似乎很好。 如果没有来自应用程序的进一步代码示例,这是很难说的,但是我敢打赌,您是在对应用程序的每个请求上创建数据库的。
只要确保此代码:
Database.forConfig("database")
通过以下方式执行一次:
将其作为Singleton
注入依赖项或
通过使用play-slick
及其处理Slick
配置的方式(如果您使用的是Play
,即使您提到了Web请求,我也无法从您的问题中说出这一点)。
编辑(问题更新后):我们有一个答案。 每次调用db
方法时,都会创建新的Database
对象(连同连接池一起创建)。 就像我上面建议的那样移动它(每个应用程序生命周期创建一次)。 最简单的方法(不一定是最好的方法)是更改此行:
def db = Database.forConfig("database")
对此:
lazy val db = Database.forConfig("database")
上面的方法可以立即解决您的问题(假设您的应用程序中PersonsApi
创建了一个PersonsApi
实例。
其他解决方案(也许更好)将是创建如下所示的内容:
object DatabaseConfig extends Config {
val driver = slick.driver.PostgresDriver
import driver.api._
lazy val db = Database.forConfig("database")
}
然后将您的API更改为此:
trait PersonsApi extends JsonMapper {
val getAllPersons = (path("persons") & get) {
complete(DatabaseConfig.db.run(PersonDao.findAll))
}
val getPersonById = (path("persons" / IntNumber) & get) {
num => complete(DatabaseConfig.db.run(PersonDao.findById(num)))
}
val personsApi =
getAllPersons ~
getPersonById
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.