Benchmark.scala 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package scalene.benchmark
  2. import com.fasterxml.jackson.databind.ObjectMapper
  3. import com.fasterxml.jackson.module.scala.DefaultScalaModule
  4. import scalene.actor.Pool
  5. import scalene.routing._
  6. import scalene.http.{Body, BodyFormatter, ContentType}
  7. import scalene.sql._
  8. import BasicConversions._
  9. object Main extends App {
  10. Class.forName("org.postgresql.Driver");
  11. trait JsonMessage
  12. case class JsonRouteMessage(message: String) extends JsonMessage
  13. case class DBRouteMessage(id: Int, randomnumber: Int) extends JsonMessage
  14. case class MultiDBRouteMessage(items: Array[DBRouteMessage]) extends JsonMessage
  15. implicit val messageFormatter = new BodyFormatter[JsonMessage] {
  16. val mapper: ObjectMapper = new ObjectMapper().registerModule(DefaultScalaModule)
  17. def apply(msg: JsonMessage) = {
  18. val obj = msg match {
  19. case MultiDBRouteMessage(items) => items
  20. case other => other
  21. }
  22. Body(mapper.writeValueAsBytes(obj), Some(ContentType.`application/json`))
  23. }
  24. }
  25. val settings = Settings.basic(
  26. serverName = "scalene",
  27. port = 8080,
  28. server = ServerSettings.Default
  29. )
  30. implicit val pool = new Pool
  31. val worldClient = MiniSQL.client(
  32. "world-client",
  33. "jdbc:postgresql://tfb-database:5432/hello_world",
  34. "benchmarkdbuser",
  35. "benchmarkdbpass"
  36. )
  37. val random = new java.util.Random
  38. def randomWorld(session: MiniSQLSession): Option[DBRouteMessage] = {
  39. val stmt = session.prepared("SELECT id, randomnumber FROM world WHERE id = (?)")
  40. stmt.setInt(1, math.abs(random.nextInt) % 10000 + 1)
  41. val rs = stmt.executeQuery()
  42. if (rs.next()) {
  43. Some(DBRouteMessage(rs.getInt(1), rs.getInt(2)))
  44. } else {
  45. None
  46. }
  47. }
  48. val dbRoute = GET / "db" to {_ =>
  49. worldClient.query{session =>
  50. randomWorld(session).map{_.ok}.getOrElse("N/A".notFound)
  51. }
  52. }
  53. val QueryNum = ![Int]
  54. .map{i => if (i < 1) 1 else if (i > 500) 500 else i}
  55. .recover{_ => 1}
  56. val multiRoute = GET / "queries" / QueryNum to {num =>
  57. worldClient.query{session =>
  58. MultiDBRouteMessage(Array.fill(num)(randomWorld(session).get)).ok
  59. }
  60. }
  61. val plainBody = Body.plain("Hello, World!")
  62. val routes = Routes(
  63. GET / "plaintext" to {_ => plainBody.ok},
  64. GET / "json" to {_ => JsonRouteMessage("Hello, World!").ok},
  65. dbRoute,
  66. multiRoute
  67. )
  68. Routing.start(settings, routes)
  69. }