簡體   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