Как лучше рассчитать время, необходимое для вызова базы данных? - PullRequest
2 голосов
/ 09 июля 2019

В моем коде из многих мест DAO делает вызовы из базы данных. Я хотел бы знать, что является хорошим способом сделать это.

Я могу поместить журналы 1-й с текущей отметкой времени перед вызовом и 2-й принять разницу после того, как вызов завершен, но таким образом, я должен сделать изменения повсюду.

1 Ответ

4 голосов
/ 09 июля 2019

Вы можете просто ввести обертку блока кода, которая будет измерять прошедшее время:

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.

Как заметил Андрей, он не будет работать для функций, возвращающих какой-либо асинхронный эффект, например 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
}
...