数据库连接不稳定时的未来sql执行行为

时间:2015-07-20 12:11:02

标签: scala concurrency callback future c3p0

我遇到了执行SQL查询的期货问题。

虽然数据库连接是好的,但是在连接池的会话中异步执行sql查询。 TypeSafe Slick帮助我从池中获取会话。

当数据库连接崩溃时,新即将到来的期货无法执行查询并等待。我没有看到关于完成的任何回调。

当数据库连接再次良好时,所有先前的期货仍在等待。重新连接后只有新的未来可以执行他们的工作。

请告知如何告诉已经调用的数据库重新连接的等待期货并继续他们的工作,或者对完全失败进行回调。

我对c3p0 ComboPooledDataSource的配置:

val ds = new ComboPooledDataSource
ds.setDriverClass("oracle.jdbc.OracleDriver")
ds.setJdbcUrl(jdbcUrl)
ds.setInitialPoolSize(20)
ds.setMinPoolSize(1)
ds.setMaxPoolSize(40)
ds.setAcquireIncrement(5)
ds.setMaxIdleTime(3600)

//Connection testing
ds.setTestConnectionOnCheckout(false)
ds.setTestConnectionOnCheckin(false)
ds.setIdleConnectionTestPeriod(10)

//Connection recovery
ds.setBreakAfterAcquireFailure(false)
ds.setAcquireRetryAttempts(30)
ds.setAcquireRetryDelay(10000)

val databasePool = Database.forDataSource(ds)

// Typesafe Slick session handling
def withClient[T](body: Session => T) = {
  databasePool.withSession(body)
}

期货在这里创造:

class RewardActivatorHelper {

  private implicit val ec = new ExecutionContext {
    val threadPool = Executors.newFixedThreadPool(1000)
    def execute(runnable: Runnable) {threadPool.submit(runnable)}
    def reportFailure(t: Throwable) {throw t}
  }

  case class FutureResult(spStart:Long, spFinish:Long)
  def activateReward(msg:Msg, time:Long):Unit = {
  msg.users.foreach {
    user =>
      val future:Future[FutureResult] = Future {
        val (spStart, spFinish) = OracleClient.rewardActivate(user)
        FutureResult(spStart, spFinish)
    }

    future.onComplete {
      case Success(futureResult:FutureResult) =>
        //do something

      case Failure(e:Throwable) => log.error(e.getMessage())     
    }
  }
}

1 个答案:

答案 0 :(得分:0)

setTestConnectionOnCheckout解决问题( true