Db.scala 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package com.ibm.techempower
  2. import java.util.concurrent.ThreadLocalRandom.{ current => random }
  3. import scala.language.implicitConversions
  4. import scala.language.postfixOps
  5. import scala.collection.mutable.MutableList
  6. import com.ibm.plain.ignore
  7. import com.ibm.plain.rest.{ Form, Resource }
  8. import com.ibm.plain.json.{ Json => J }
  9. import com.ibm.plain.jdbc.withConnection
  10. import com.ibm.plain.jdbc.ConnectionHelper._
  11. final class Db
  12. extends DbResource {
  13. Get { get(None) }
  14. Get { form: Form => get(Some(form)) }
  15. }
  16. final class Update
  17. extends DbResource {
  18. Get { form: Form => update(form) }
  19. }
  20. sealed abstract class DbResource
  21. extends Resource {
  22. @inline protected[this] final def get(form: Option[Form]): J = {
  23. val output = new MutableList[J]
  24. val q = form match { case None => 1 case Some(f) => queries(f) }
  25. withConnection(datasource) { implicit connection =>
  26. for (i <- 1 to q) { for (j <- selectsql << next ! asJson) { output += j } }
  27. }
  28. form match { case None => output.head case _ => J(output.toList) }
  29. }
  30. @inline protected[this] final def update(form: Form): J = {
  31. val input = new MutableList[World]
  32. val output = new MutableList[J]
  33. val q = queries(form)
  34. withConnection(datasource) { implicit connection =>
  35. for (i <- 1 to q) { for (j <- selectsql << next ! asTuple) { input += j } }
  36. input.foreach {
  37. case (id, _) =>
  38. val randomNumber = next
  39. updatesql << randomNumber << id ++;
  40. output += asJson(id, randomNumber)
  41. }
  42. ignore(updatesql ++!)
  43. }
  44. J(output.toList)
  45. }
  46. @inline private[this] final def queries(form: Form) = try {
  47. form.get("queries").get.head.toInt match {
  48. case q if 1 > q => 1
  49. case q if 500 < q => 500
  50. case q => q
  51. }
  52. } catch {
  53. case _: Throwable => 1
  54. }
  55. @inline private[this] final def asJson = (r: RichResultSet) => J(Map("id" -> r.nextInt, "randomNumber" -> r.nextInt))
  56. @inline private[this] final def asJson(id: Int, randomNumber: Int) = J(Map("id" -> id, "randomNumber" -> randomNumber))
  57. @inline private[this] final def asTuple = (r: RichResultSet) => (r.nextInt, r.nextInt)
  58. @inline private[this] final def next = random.nextInt(1, 10001)
  59. private[this] final type World = (Int, Int)
  60. private[this] final val selectsql = "select id, randomNumber from World where id = ?"
  61. private[this] final val updatesql = "update World set randomNumber = ? where id = ?"
  62. private[this] final val datasource = "MysqlBenchmark"
  63. }