| // 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(); |
| } |
| } |
| } |
| } |