繁体   English   中英

根据请求分配连接池

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM