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