2017-11-08 16 views
2

저는 scobra (cats)를 사용하여 scalatra 응용 프로그램에서 postgresql 데이터베이스에 연결했습니다. 최근에 나는 앱이 모든 거래에 대해 새로운 연결 풀을 생성하고 있음을 확인했습니다. 나는 결국 그것을 해결했다. 아래에서 볼 수 있겠지만,이 접근법은 'managing connections' section of the book of doobie에서 취한 것과는 상당히 다르다. 나는 누군가가 그것이 합당한 지 또는 연결 풀을 설정하는 좋은 방법이 있는지를 확인할 수 있기를 희망했다. 여기 Doobie와 히카리 연결 풀을 올바르게 처리하는 방법

내가 처음에 가지고 무엇 -이 작동하지만 모든 연결에 새로운 연결 풀을 생성합니다

import com.zaxxer.hikari.HikariDataSource 
import doobie.hikari.hikaritransactor.HikariTransactor 
import doobie.imports._ 

val pgTransactor = HikariTransactor[IOLite](
    "org.postgresql.Driver", 
    s"jdbc:postgresql://${postgresDBHost}:${postgresDBPort}/${postgresDBName}", 
    postgresDBUser, 
    postgresDBPassword 
) 
// every query goes via this function 
def doTransaction[A](update: ConnectionIO[A]): Option[A] = { 
    val io = for { 
     xa <- pgTransactor 
     res <- update.transact(xa) ensuring xa.shutdown 
    } yield res 
    io.unsafePerformIO 
} 

내 초기 가정 문제가 모든 요청에 ​​ensuring xa.shutdown을 가지고 있지만, 신속하게 연결 결과 제거 된 것이 었습니다 남아 있지 않을 때까지 다 써 버린다. 나는 HikariDataSource를 작성하여 원하는 동작을 가지고,

val pgTransactor: HikariTransactor[IOLite] = HikariTransactor[IOLite](
    "org.postgresql.Driver", 
    s"jdbc:postgresql://${postgresDBHost}:${postgresDBPort}/${postgresDBName}", 
    postgresDBUser, 
    postgresDBPassword 
).unsafePerformIO 

def doTransaction[A](update: ConnectionIO[A]): Option[A] = { 
    val io = update.transact(pgTransactor) 
    io.unsafePerformIO 
} 

을 마지막으로 : -

이 문제를 해결하기 위해 시도했다가 ensuring xa.shutdown을 제거하기 위해 나를 사용 가능하지만, 여전히 연결 풀 반복적으로 열려있는 결과와 폐쇄

val dataSource = new HikariDataSource() 
dataSource.setJdbcUrl(s"jdbc:postgresql://${postgresDBHost}:${postgresDBPort}/${postgresDBName}") 
dataSource.setUsername(postgresDBUser) 
dataSource.setPassword(postgresDBPassword) 

val pgTransactor: HikariTransactor[IOLite] = HikariTransactor[IOLite](dataSource) 

def doTransaction[A](update: ConnectionIO[A], operationDescription: String): Option[A] = { 
    val io = update.transact(pgTransactor) 
    io.unsafePerformIO 
} 

답변

1

당신은 같은 것을 할 수 있습니다 :

012 객체 다음 HikariTransactor 생성자로 전달

및 리포지토리에 전달하십시오. .transactSlick.transactionally과 같은 트랜잭션 경계를 적용합니다. 예컨대 :

def interactWithDb = { 
    val q: ConnectionIO[Int] = sql"""...""" 
    q.transact(xa).unsafePerformIO 
} 
0

예, 라두에서 응답이 문제에 가져옵니다. HikariTransactor (밑에있는 HikariDataSource)은 내부 상태를 가지므로 부작용이 있습니다. 프로그램이 시작될 때 한 번 해보고 필요에 따라 전달하려고합니다. 솔루션이 작동하므로 부작용을 메모하십시오.

또한 언급했듯이 나는 모니터링하지 않습니다 ... 거터 채널을 사용해 보거나 질문이 있으면 문제를 열어보십시오. :-)