【问题标题】:What is the better way to calculate time required for Database call?计算数据库调用所需时间的更好方法是什么?
【发布时间】:2019-11-19 00:02:25
【问题描述】:

在我的代码中,DAO 从很多地方进行数据库调用。我想知道哪种方法比较好。

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

【问题讨论】:

    标签: scala playframework performance-testing


    【解决方案1】:

    你可以只引入代码块包装器,它会测量经过的时间:

    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
    }
    

    【讨论】:

    • body 启动异步任务时不会出现这种情况,例如R = Future[_]。这将仅测量Future 启动时间。例如。 def measure(db run query.result)
    • 使用aspectj怎么样,是的,那么如何使用呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2015-04-09
    相关资源
    最近更新 更多