فهرست منبع

Added connection pooling to finagle test. Also added additional finagle test using FuturePools for the database connection service

Falmarri 12 سال پیش
والد
کامیت
90f7e160e8
5فایلهای تغییر یافته به همراه65 افزوده شده و 20 حذف شده
  1. BIN
      finagle/.cache
  2. 7 4
      finagle/.classpath
  3. 10 0
      finagle/benchmark_config
  4. 7 7
      finagle/build.sbt
  5. 41 9
      finagle/src/main/scala/com/falmarri/finagle/Finagle.scala

BIN
finagle/.cache


+ 7 - 4
finagle/.classpath

@@ -1,8 +1,8 @@
 <classpath>
-  <classpathentry output="target/scala-2.10.0/classes" path="src/main/scala" kind="src"></classpathentry>
-  <classpathentry output="target/scala-2.10.0/classes" path="src/main/java" kind="src"></classpathentry>
-  <classpathentry output="target/scala-2.10.0/test-classes" path="src/test/scala" kind="src"></classpathentry>
-  <classpathentry output="target/scala-2.10.0/test-classes" path="src/test/java" kind="src"></classpathentry>
+  <classpathentry output="target/scala-2.10/classes" path="src/main/scala" kind="src"></classpathentry>
+  <classpathentry output="target/scala-2.10/classes" path="src/main/java" kind="src"></classpathentry>
+  <classpathentry output="target/scala-2.10/test-classes" path="src/test/scala" kind="src"></classpathentry>
+  <classpathentry output="target/scala-2.10/test-classes" path="src/test/java" kind="src"></classpathentry>
   <classpathentry kind="con" path="org.scala-ide.sdt.launching.SCALA_CONTAINER"></classpathentry>
   <classpathentry path="/home/dknapp/.ivy2/cache/com.twitter/finagle-http_2.10/jars/finagle-http_2.10-6.2.1.jar" kind="lib"></classpathentry>
   <classpathentry path="/home/dknapp/.ivy2/cache/com.twitter/finagle-core_2.10/jars/finagle-core_2.10-6.2.1.jar" kind="lib"></classpathentry>
@@ -26,6 +26,9 @@
   <classpathentry path="/home/dknapp/.ivy2/cache/org.scala-lang/scala-reflect/jars/scala-reflect-2.10.0.jar" kind="lib"></classpathentry>
   <classpathentry path="/home/dknapp/.ivy2/cache/com.typesafe.slick/slick_2.10/jars/slick_2.10-1.0.0.jar" kind="lib"></classpathentry>
   <classpathentry path="/home/dknapp/.ivy2/cache/org.slf4j/slf4j-api/jars/slf4j-api-1.6.4.jar" kind="lib"></classpathentry>
+  <classpathentry path="/home/dknapp/.ivy2/cache/mysql/mysql-connector-java/jars/mysql-connector-java-5.1.24.jar" kind="lib"></classpathentry>
+  <classpathentry path="/home/dknapp/.ivy2/cache/commons-dbcp/commons-dbcp/jars/commons-dbcp-1.4.jar" kind="lib"></classpathentry>
+  <classpathentry path="/home/dknapp/.ivy2/cache/commons-pool/commons-pool/jars/commons-pool-1.5.4.jar" kind="lib"></classpathentry>
   <classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"></classpathentry>
   <classpathentry path="bin" kind="output"></classpathentry>
 </classpath>

+ 10 - 0
finagle/benchmark_config

@@ -9,6 +9,16 @@
             "port": 8080,
             "sort": 42
             }
+        },
+        {
+        "future-pool" : {
+            "setup_file" : "setup.py",
+            "json_url" : "/json",
+            "db_url" : "/pooling",
+            "query_url" : "/pooling?queries=",
+            "port": 8080,
+            "sort": 43
+            }
         }
         ]
 

+ 7 - 7
finagle/build.sbt

@@ -6,10 +6,10 @@ scalaVersion := "2.10.0"
 
 version := "1.0"
 
-libraryDependencies += "com.twitter" % "finagle-http_2.10" % "6.+"
-
-libraryDependencies += "com.fasterxml.jackson.module" % "jackson-module-scala_2.10" % "2.+"
-
-libraryDependencies += "com.typesafe.slick" % "slick_2.10" % "1.0.0"
-
-libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.24"
+libraryDependencies ++= Seq(
+                "com.twitter" % "finagle-http_2.10" % "6.+",
+                "com.fasterxml.jackson.module" % "jackson-module-scala_2.10" % "2.+",
+                "com.typesafe.slick" % "slick_2.10" % "1.0.0",
+                "mysql" % "mysql-connector-java" % "5.1.24",
+                "commons-dbcp" % "commons-dbcp" % "1.+"
+                )

+ 41 - 9
finagle/src/main/scala/com/falmarri/finagle/Finagle.scala

@@ -16,9 +16,11 @@ import scala.reflect.macros.Context
 import java.io.StringWriter
 import org.jboss.netty.util.CharsetUtil.UTF_8
 import scala.slick.driver.MySQLDriver.simple._
-//import slick.session.Database.threadLocalSession
 import scala.util.Random
-
+import org.apache.commons.dbcp.BasicDataSource
+import javax.sql.DataSource
+import com.twitter.util.FuturePool
+import java.util.concurrent.Executors
 
 case class World(id: Int, randomNumber: Int)
 
@@ -43,9 +45,21 @@ object FinagleBenchmark extends App {
 //          writer.toString()
 //    }.tree)
 //  }
+  val dataSource: DataSource = {
+    val ds = new BasicDataSource
+    ds.setDriverClassName("com.mysql.jdbc.Driver")
+    ds.setUsername("root")
+    ds.setPassword("")
+    ds.setMaxActive(20);
+    ds.setMaxIdle(10);
+    ds.setInitialSize(20);
+    //ds.setValidationQuery("SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS")
+    //new java.io.File("target").mkdirs // ensure that folder for database exists
+    ds.setUrl("jdbc:mysql://" + System.getProperty("db.host", "localhost") + ":3306/hello_world")
+    ds
+  }
   
-  
-  val database = Database.forURL("jdbc:mysql://" + System.getProperty("db.host", "localhost") + ":3306/hello_world", user = "root", driver="com.mysql.jdbc.Driver")
+  val database = Database.forDataSource(dataSource)
   
   def serialize(value: Any) = {
     val writer = new StringWriter()
@@ -65,30 +79,48 @@ object FinagleBenchmark extends App {
     }
 
   }
+  
+  val diskIoFuturePool = FuturePool(Executors.newFixedThreadPool(8))
+ 
 
   val db = new Service[Request, Response] {
     def apply(req: Request): Future[Response] = {
-      
       val n = req.params.getIntOrElse("queries", 1)
       val resp = Response()
       database withSession {implicit session: Session =>
         val rand = new Random()
-
         val q = Query(Worlds).where(_.id inSet( for (i <- 0 to n) yield rand.nextInt(10000)))
-        
         resp.setContent(copiedBuffer(serialize(if (n == 1) q.first else q.list), UTF_8))
-        
         resp.setContentTypeJson
+        Future.value(resp)
       }
-      Future.value(resp)
     }
   }
+  
+  val poolingdb = new Service[Request, Response] {
+    def apply(req: Request): Future[Response] = {
+      val n = req.params.getIntOrElse("queries", 1)
+      val query = {
+	      val resp = Response()
+	      database withSession {implicit session: Session =>
+	        val rand = new Random()
+	        val q = Query(Worlds).where(_.id inSet( for (i <- 0 to n) yield rand.nextInt(10000)))
+	        resp.setContent(copiedBuffer(serialize(if (n == 1) q.first else q.list), UTF_8))
+	        resp.setContentTypeJson
+	        resp
+	      	}
+      	}
+      diskIoFuturePool(query)
+    }
+  }
+  
 
   val service =
     RoutingService byPath {
 
       case "/json" => json
       case "/db" => db
+      case "/pooling" => poolingdb
 
     }