blob: 8a43e13c5605d1278c46f45a69a6977b364c0019 [file] [log] [blame]
// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (c) 2012-2014 Monty Program Ab
// Copyright (c) 2015-2021 MariaDB Corporation Ab
package org.mariadb.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;
@State(Scope.Benchmark)
@Warmup(iterations = 10, timeUnit = TimeUnit.SECONDS, time = 1)
@Measurement(iterations = 10, timeUnit = TimeUnit.SECONDS, time = 1)
@Fork(value = 5)
@Threads(value = 1) // detecting CPU count
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
public class Common {
// conf
public static final String host = System.getProperty("TEST_HOST", "localhost");
public static final int port = Integer.parseInt(System.getProperty("TEST_PORT", "3306"));
public static final String username = System.getProperty("TEST_USERNAME", "root");
public static final String password = System.getProperty("TEST_PASSWORD", "");
public static final String database = System.getProperty("TEST_DATABASE", "testj");
public static final String other = System.getProperty("TEST_OTHER", "");
static {
new SetupData();
}
@State(Scope.Thread)
public static class MyState {
// connections
protected Connection connectionText;
protected Connection connectionTextRewrite;
protected Connection connectionBinary;
protected Connection connectionBinaryNoPipeline;
protected Connection connectionBinaryNoCache;
@Param({"mysql", "mariadb"})
String driver;
@Setup(Level.Trial)
public void createConnections() throws Exception {
String className;
switch (driver) {
case "mysql":
className = "com.mysql.cj.jdbc.Driver";
break;
case "mariadb":
className = "org.mariadb.jdbc.Driver";
break;
default:
throw new RuntimeException("wrong param");
}
try {
String jdbcBase =
"jdbc:%s://%s:%s/%s?user=%s&password=%s&sslMode=DISABLED&useServerPrepStmts=%s&cachePrepStmts=%s&serverTimezone=UTC%s";
String jdbcUrlText =
String.format(
jdbcBase, driver, host, port, database, username, password, false, false, other);
String jdbcUrlBinary =
String.format(
jdbcBase, driver, host, port, database, username, password, true, true, other);
connectionText =
((java.sql.Driver) Class.forName(className).getDeclaredConstructor().newInstance())
.connect(jdbcUrlText, new Properties());
String jdbcUrlTextRewrite =
String.format(
jdbcBase,
driver,
host,
port,
database,
username,
password,
false,
false,
"&rewriteBatchedStatements=true&useBulkStmts=false" + other);
connectionTextRewrite =
((java.sql.Driver) Class.forName(className).getDeclaredConstructor().newInstance())
.connect(jdbcUrlTextRewrite, new Properties());
connectionBinary =
((java.sql.Driver) Class.forName(className).getDeclaredConstructor().newInstance())
.connect(jdbcUrlBinary, new Properties());
String jdbcUrlBinaryNoCache =
String.format(
jdbcBase,
driver,
host,
port,
database,
username,
password,
true,
false,
"&prepStmtCacheSize=0" + other);
connectionBinaryNoCache =
((java.sql.Driver) Class.forName(className).getDeclaredConstructor().newInstance())
.connect(jdbcUrlBinaryNoCache, new Properties());
String jdbcUrlBinaryNoCacheNoPipeline =
String.format(
jdbcBase,
driver,
host,
port,
database,
username,
password,
true,
true,
"&prepStmtCacheSize=0&cachePrepStmts=false&disablePipeline=true" + other);
connectionBinaryNoPipeline =
((java.sql.Driver) Class.forName(className).getDeclaredConstructor().newInstance())
.connect(jdbcUrlBinaryNoCacheNoPipeline, new Properties());
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@TearDown(Level.Trial)
public void doTearDown() throws SQLException {
connectionText.close();
connectionBinary.close();
connectionTextRewrite.close();
connectionBinaryNoCache.close();
connectionBinaryNoPipeline.close();
}
}
public static class SetupData {
static {
try {
try (Connection conn =
DriverManager.getConnection(
String.format(
"jdbc:mariadb://%s:%s/%s?user=%s&password=%s",
host, port, database, username, password))) {
Statement stmt = conn.createStatement();
try {
stmt.executeQuery("INSTALL SONAME 'ha_blackhole'");
} catch (SQLException e) {
// eat
}
stmt.executeUpdate("DROP TABLE IF EXISTS testBlackHole");
stmt.executeUpdate("DROP TABLE IF EXISTS test100");
try {
stmt.executeUpdate(
"CREATE TABLE testBlackHole (id INT, t VARCHAR(256)) ENGINE = BLACKHOLE");
} catch (SQLException e) {
stmt.executeUpdate("CREATE TABLE testBlackHole (id INT, t VARCHAR(256))");
}
StringBuilder sb = new StringBuilder("CREATE TABLE test100 (i1 int");
StringBuilder sb2 = new StringBuilder("INSERT INTO test100 value (1");
for (int i = 2; i <= 100; i++) {
sb.append(",i").append(i).append(" int");
sb2.append(",").append(i);
}
sb.append(")");
sb2.append(")");
stmt.executeUpdate(sb.toString());
stmt.executeUpdate(sb2.toString());
stmt.execute("DROP TABLE IF EXISTS perfTestTextBatch");
try {
stmt.execute("INSTALL SONAME 'ha_blackhole'");
} catch (SQLException e) {
}
String createTable =
"CREATE TABLE perfTestTextBatch (id MEDIUMINT NOT NULL AUTO_INCREMENT,t0 text,"
+ " PRIMARY KEY (id)) COLLATE='utf8mb4_unicode_ci'";
try {
stmt.execute(createTable + " ENGINE = BLACKHOLE");
} catch (SQLException e) {
stmt.execute(createTable);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}