计算数据库调用所需时间的更好方法是什么?

时间:2019-07-09 12:17:16

标签: scala playframework performance-testing

在我的代码中,DAO在很多地方都在进行数据库调用。我想知道哪种方法可以做到这一点。

我可以在调用之前将带有当前时间戳的日志放在第一行,而在调用完成之后将其放在第二时间戳,但是通过这种方式,我必须在整个地方进行更改。

1 个答案:

答案 0 :(得分:4)

您只需引入代码块包装器即可测量经过时间:

def measure[R](body: => R): R = {
    val start = System.currentTimeMillis()
    val result = body
    val end = System.currentTimeMillis()
    println(s"Task took: ${end - start} ms.") // replace with proper logging
    result
}

然后您可以像这样使用它:

def doStuff() = measure {
    doJdbcCall();
    val result = doSomethingElse();
    result
}

val result = measure(doJdbcCall)

您仍然必须修改代码库,但是所有计算时差的逻辑都将隐藏在measure方法下。

正如Andrij所注意到的,它不适用于返回任何异步效果的函数,例如Future,但是我们可以准备重载方法来处理标准库Future

def measure[R](f: Future[R]): Future[R] = {
    val start = System.currentTimeMillis()
    f.onComplete{
      case _ => 
        val end = System.currentTimeMillis()
        println(s"Task took: ${end - start} ms.") // replace with proper logging
    }
    f
}