Browse Source

Using the latest Rapidoid with asynchronous JDBC and Hikari pool. (#2655)

* Using the latest Rapidoid with asynchronous JDBC and Hikari pool.

* Fixed JDBC password configuration.
Nikolche Mihajlovski 8 years ago
parent
commit
bca9f8dc5f

+ 12 - 2
frameworks/Java/rapidoid/pom.xml

@@ -15,14 +15,24 @@
 	<dependencies>
 		<dependency>
 			<groupId>org.rapidoid</groupId>
-			<artifactId>rapidoid-quick</artifactId>
-			<version>5.2.6</version>
+			<artifactId>rapidoid-web</artifactId>
+			<version>5.3.4</version>
+		</dependency>
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>5.1.38</version>
 		</dependency>
 		<dependency>
 			<groupId>org.postgresql</groupId>
 			<artifactId>postgresql</artifactId>
 			<version>9.4.1211</version>
 		</dependency>
+		<dependency>
+			<groupId>com.zaxxer</groupId>
+			<artifactId>HikariCP</artifactId>
+			<version>2.6.1</version>
+		</dependency>
 	</dependencies>
 
 	<build>

+ 2 - 2
frameworks/Java/rapidoid/setup-http-fast.sh

@@ -7,6 +7,6 @@ mvn clean compile assembly:single
 cd target
 
 java -server \
-  -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts -cp \
-  rapidoid-1.0-jar-with-dependencies.jar \
+  -Xms1g -Xmx1g -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts \
+  -cp rapidoid-1.0-jar-with-dependencies.jar \
   lowlevel.Main profiles=production dbhost="$DBHOST" &

+ 2 - 2
frameworks/Java/rapidoid/setup-mysql.sh

@@ -7,6 +7,6 @@ mvn clean compile assembly:single
 cd target
 
 java -server \
-  -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts -cp \
-  rapidoid-1.0-jar-with-dependencies.jar \
+  -Xms512m -Xmx2g -XX:+UseParallelGC -XX:+AggressiveOpts \
+  -cp rapidoid-1.0-jar-with-dependencies.jar \
   highlevel.Main profiles=mysql,production dbhost="$DBHOST" &

+ 2 - 2
frameworks/Java/rapidoid/setup-postgresql.sh

@@ -7,6 +7,6 @@ mvn clean compile assembly:single
 cd target
 
 java -server \
-  -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts -cp \
-  rapidoid-1.0-jar-with-dependencies.jar \
+  -Xms512m -Xmx2g -XX:+UseParallelGC -XX:+AggressiveOpts \
+  -cp rapidoid-1.0-jar-with-dependencies.jar \
   highlevel.Main profiles=postgres,production dbhost="$DBHOST" &

+ 5 - 2
frameworks/Java/rapidoid/source_code

@@ -7,5 +7,8 @@
 ./rapidoid/src/main/java/lowlevel
 ./rapidoid/src/main/java/lowlevel/Main.java
 ./rapidoid/src/main/java/lowlevel/PlaintextAndJsonServer.java
-./rapidoid/src/main/java/resources
-./rapidoid/src/main/java/resources/fortunes.html
+./rapidoid/src/main/resources
+./rapidoid/src/main/resources/fortunes.html
+./rapidoid/src/main/resources/config-postgres.yml
+./rapidoid/src/main/resources/config-mysql.yml
+./rapidoid/src/main/resources/config.yml

+ 6 - 10
frameworks/Java/rapidoid/src/main/java/common/Helper.java

@@ -5,15 +5,11 @@ public class Helper {
 	// most of this configuration was copied from the other projects
 	public static final String MYSQL_CONFIG = "useSSL=false&jdbcCompliantTruncation=false" +
 		"&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true" +
-		"&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048" +
-		"&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useServerPrepStmts=true&enableQueryTimeouts=false" +
-		"&useUnbufferedIO=false&useReadAheadInput=false&maintainTimeStats=false&cacheRSMetadata=true";
+		"&alwaysSendSetIsolation=false&cacheServerConfiguration=true" +
+		"&zeroDateTimeBehavior=convertToNull&traceProtocol=false&enableQueryTimeouts=false" +
+		"&useUnbufferedIO=false&useReadAheadInput=false&maintainTimeStats=false" +
+		"&cacheRSMetadata=true&useServerPrepStmts=true";
 
-	// most of this configuration was copied from the other projects
-	public static final String POSTGRES_CONFIG = "jdbcCompliantTruncation=false" +
-		"&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true" +
-		"&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048" +
-		"&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useServerPrepStmts=true&enableQueryTimeouts=false" +
-		"&useUnbufferedIO=false&useReadAheadInput=false&maintainTimeStats=false&cacheRSMetadata=true";
+	public static final String POSTGRES_CONFIG = "";
 
-}
+}

+ 24 - 6
frameworks/Java/rapidoid/src/main/java/highlevel/FortunesHandler.java

@@ -4,16 +4,22 @@ import common.Fortune;
 import org.rapidoid.http.Req;
 import org.rapidoid.http.ReqRespHandler;
 import org.rapidoid.http.Resp;
+import org.rapidoid.jdbc.JdbcClient;
+import org.rapidoid.lambda.Mapper;
 import org.rapidoid.render.Template;
 import org.rapidoid.render.Templates;
-import org.rapidoid.sql.JdbcClient;
 
+import java.sql.ResultSet;
 import java.util.Collections;
 import java.util.List;
 
 public class FortunesHandler implements ReqRespHandler {
 
-	private final Template fortunesTmpl = Templates.load("fortunes.html");
+	private static final String SQL = "SELECT id, message FROM fortune";
+
+	private static final Mapper<ResultSet, Fortune> resultMapper = rs -> new Fortune(rs.getInt(1), rs.getString(2));
+
+	private static final Template template = Templates.load("fortunes.html");
 
 	private final JdbcClient jdbc;
 
@@ -23,14 +29,26 @@ public class FortunesHandler implements ReqRespHandler {
 
 	@Override
 	public Object execute(Req req, Resp resp) throws Exception {
+		req.async();
+
+		jdbc.execute(resultMapper, (List<Fortune> fortunes, Throwable err) -> {
+
+			if (err == null) {
+				fortunes.add(new Fortune(0, "Additional fortune added at request time."));
+
+				Collections.sort(fortunes);
+
+				resp.result(template.renderToBytes(fortunes));
 
-		List<Fortune> fortunes = jdbc.query(Fortune.class, "SELECT * FROM fortune");
+			} else {
+				resp.result(err);
+			}
 
-		fortunes.add(new Fortune(0, "Additional fortune added at request time."));
+			resp.done();
 
-		Collections.sort(fortunes);
+		}, SQL);
 
-		return fortunesTmpl.renderToBytes(fortunes);
+		return req;
 	}
 
 }

+ 13 - 19
frameworks/Java/rapidoid/src/main/java/highlevel/Main.java

@@ -2,24 +2,20 @@ package highlevel;
 
 import common.Helper;
 import common.Message;
-import org.rapidoid.commons.Env;
+import org.rapidoid.commons.Err;
 import org.rapidoid.config.Conf;
+import org.rapidoid.env.Env;
 import org.rapidoid.http.MediaType;
+import org.rapidoid.jdbc.JDBC;
+import org.rapidoid.jdbc.JdbcClient;
 import org.rapidoid.log.Log;
 import org.rapidoid.setup.App;
 import org.rapidoid.setup.On;
-import org.rapidoid.sql.JDBC;
-import org.rapidoid.sql.JdbcClient;
 
 public class Main {
 
 	public static void main(String[] args) {
-
-		App.args(args);
-
-		Conf.C3P0.set("maxPoolSize", 256);
-		Conf.C3P0.set("maxIdleTimeExcessConnections", 256);
-		Conf.C3P0.set("maxStatementsPerConnection", 3);
+		App.run(args);
 
 		Conf.HTTP.set("maxPipeline", 128);
 		Conf.HTTP.set("timeout", 0);
@@ -43,21 +39,19 @@ public class Main {
 		String dbHost = Conf.ROOT.entry("dbhost").or("localhost");
 		Log.info("Database hostname is: " + dbHost);
 
-		String dbUrl;
+		JdbcClient jdbc = JDBC.api();
 
 		if (Env.hasProfile("mysql")) {
-			dbUrl = "jdbc:mysql://" + dbHost + ":3306/hello_world?" + Helper.MYSQL_CONFIG;
+			jdbc.url("jdbc:mysql://" + dbHost + ":3306/hello_world?" + Helper.MYSQL_CONFIG);
+
+		} else if (Env.hasProfile("postgres")) {
+			jdbc.url("jdbc:postgresql://" + dbHost + ":5432/hello_world?" + Helper.POSTGRES_CONFIG);
+
 		} else {
-			dbUrl = "jdbc:postgresql://" + dbHost + ":5432/hello_world?" + Helper.POSTGRES_CONFIG;
+			throw Err.notExpected();
 		}
 
-		JdbcClient mysqlJdbc = JDBC.newApi()
-			.url(dbUrl)
-			.username("benchmarkdbuser")
-			.password("benchmarkdbpass")
-			.pooled();
-
-		On.get("/fortunes").html(new FortunesHandler(mysqlJdbc));
+		On.get("/fortunes").managed(false).html(new FortunesHandler(jdbc));
 	}
 
 }

+ 2 - 2
frameworks/Java/rapidoid/src/main/java/lowlevel/Main.java

@@ -5,8 +5,8 @@ import org.rapidoid.setup.App;
 
 public class Main {
 
-	public static void main(String[] args) throws Exception {
-		App.args(args);
+	public static void main(String[] args) {
+		App.run(args);
 
 		Conf.HTTP.set("maxPipeline", 128);
 		Conf.HTTP.set("timeout", 0);

+ 2 - 1
frameworks/Java/rapidoid/src/main/java/lowlevel/PlaintextAndJsonServer.java

@@ -4,6 +4,7 @@ import common.Message;
 import org.rapidoid.buffer.Buf;
 import org.rapidoid.http.AbstractHttpServer;
 import org.rapidoid.http.HttpStatus;
+import org.rapidoid.http.HttpUtils;
 import org.rapidoid.http.MediaType;
 import org.rapidoid.net.abstracts.Channel;
 import org.rapidoid.net.impl.RapidoidHelper;
@@ -28,7 +29,7 @@ public class PlaintextAndJsonServer extends AbstractHttpServer {
 				return ok(ctx, data.isKeepAlive.value, HELLO_WORLD, MediaType.TEXT_PLAIN);
 
 			} else if (matches(buf, data.path, URI_JSON)) {
-				return serializeToJson(ctx, data.isKeepAlive.value, new Message("Hello, World!"));
+				return serializeToJson(HttpUtils.noReq(), ctx, data.isKeepAlive.value, new Message("Hello, World!"));
 			}
 		}
 

+ 9 - 0
frameworks/Java/rapidoid/src/main/resources/config-mysql.yml

@@ -0,0 +1,9 @@
+jdbc:
+  driver: com.mysql.jdbc.Driver
+  username: benchmarkdbuser
+  password: benchmarkdbpass
+  workers: 128
+
+hikari:
+  maximumPoolSize: 128
+  minimumIdle: 128

+ 8 - 0
frameworks/Java/rapidoid/src/main/resources/config-postgres.yml

@@ -0,0 +1,8 @@
+jdbc:
+  username: benchmarkdbuser
+  password: benchmarkdbpass
+  workers: 256
+
+hikari:
+  maximumPoolSize: 256
+  minimumIdle: 256

+ 2 - 0
frameworks/Java/rapidoid/src/main/resources/config.yml

@@ -0,0 +1,2 @@
+net:
+  bufSizeKB: 16