[JAVA] Benchen durch Ändern der Eigenschaften mit MySQL Connector / J Teil 3: Vorbereiteter Anweisungscache

Der gestrige MySQL Casual Adventskalender 2017 war @ soudai1025s [Warum lesen Sie nicht den SHOW ENGINE INNODB STATUS](http: / /soudai.hatenablog.com/entry/2017/12/20/030013).

Es ist eine Fortsetzung von.

Dieses Mal werden wir überprüfen, ob die Leistung verbessert werden kann, indem die Cache-Funktion der vorbereiteten Anweisung aktiviert wird.

1. Zu überprüfende Eigenschaften

Von

Untersuchen der Leistungsänderung beim Ändern von der Standardeinstellung.

Wie im obigen Artikel erwähnt, wird hier auch der empfohlene Wert von HikariCP (Highspeed-Verbindungspooling) angezeigt.

Dieses Mal habe ich den in [Teil 1] verwendeten Code geändert (https://qiita.com/hmatsu47/items/0a3b48c86abdcd2cc884) (eine neue Tabelle wird vorbereitet).

In Form von werden die folgenden drei Muster verglichen und verifiziert.

2. Überprüfungsergebnis

Das Ergebnis der Überprüfung jeder erforderlichen Zeit wird angezeigt.

Überprüfungsmuster Benötigte Zeit(ms)
Nur die in Teil 2 verwendeten Eigenschaften 38,057
In Teil 2 + verwendete EigenschaftencachePrepStmts=true&prepStmtCacheSize=50&prepStmtCacheSqlLimit=2048 39,907
In Teil 2 + verwendete EigenschaftencachePrepStmts=true&prepStmtCacheSize=100&prepStmtCacheSqlLimit=2048 30,027

Ich fand heraus.

3. Zusammenfassung

Um ehrlich zu sein, war ich überrascht, dass auf Kundenbasis vorbereitete Anweisungen einen Caching-Effekt haben würden. Ich möchte den Quellcode einmal überprüfen und sehen, welche Art von Verarbeitung er macht.

Wenn jedoch die Anzahl der täglich verwendeten vorbereiteten Anweisungen sogar ein Cache-Limit überschreitet, kann der Effekt Null werden (in einigen Fällen negativ) (der Cache-Algorithmus ist nicht sehr gut). (Vielleicht) finde ich, dass es ziemlich schwierig ist, es zu benutzen.

Zumindest ** empfiehlt HikariCP 250, also lassen Sie es bei 250 **, da dies aufgrund des Wachstums der Anwendung zu unerwarteten Problemen führen kann. Es ist daher besser, sie zu stoppen.

Der morgige MySQL Casual Adventskalender 2017 wird @ huatos Docker-Compose 'versuchen, um auf einfache Weise eine Testumgebung für die Gruppenreplikation zu erstellen. .

4. Bestätigungscode usw.

Die Basis ist die in [Teil 1] verwendete (https://qiita.com/hmatsu47/items/0a3b48c86abdcd2cc884). Folgendes wird hinzugefügt / geändert.

DbInsert.Java (Code aus Zeile 66 hinzugefügt)



	private static final int		PSMT_ALL_COLUMN	= 70;
	private static final int		PSMT_STORE_COLUMN	= 10;
	private static final String 	PSMT_MEMO			= "1234567890";

	public void psmtInsert(int totalline, int commitline, String option) {

		try (
			Connection 			con		= new DbConnection().getConnectionForTest(JDBC_URL + option);
		) {
			con.setAutoCommit(false);

			for (int i = 0; i < totalline; i++) {
				StringBuilder	sb_pfx	= new StringBuilder("INSERT INTO psmt_test.psmt_test (");
				StringBuilder	sb_sfx	= new StringBuilder(" VALUES (");
				for (int j = 1; j <= PSMT_STORE_COLUMN; j++) {
					sb_pfx.append("memo" + (Integer.toString((i % PSMT_ALL_COLUMN) + j) + ((j == PSMT_STORE_COLUMN) ? ")" : ", ")));
					sb_sfx.append("?" + ((j == PSMT_STORE_COLUMN) ? ")" : ", "));
				}
				try (
					PreparedStatement	psmt	= con.prepareStatement(sb_pfx.toString() + sb_sfx.toString());
				) {
					for (int j = 1; j <= PSMT_STORE_COLUMN; j++) {
						psmt.setString(j, PSMT_MEMO);
					}
					psmt.execute();
					if (((i + 1) % commitline == 0) || ((i + 1) == totalline)) {
						con.commit();
					}
				} catch (SQLException e) {
					throw e;				}
			}
		} catch (ClassNotFoundException e) {
			System.out.println("[Error] Driver not found.");
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println("[Error] Invalid DB access.");
			e.printStackTrace();
		}
	}

PsmtInsert.Java (Neuzugang)


package site.hmatsu47.conjtest;

public class PsmtInsert extends Thread {

	private int 	totalline	= 0;
	private int 	commitline	= 0;
	private String option;
	private String title;

	public PsmtInsert(int totalline, int commitline, String option, String title) {
		this.totalline	= totalline;
		this.commitline	= commitline;
		this.option		= option;
		this.title		= title;
	}

	public void run() {
		long	starttime	= System.nanoTime();

		new DbInsert().psmtInsert(totalline, commitline, option);

		long	endtime	= System.nanoTime();

		System.out.println("[Psmt]   " + title + " : " + String.valueOf((endtime - starttime) / (1000 * 1000)) + " msec.");
	}
}

Main.Java (ändern)


package site.hmatsu47.conjtest;

public class Main {

	private static final int		DEFAULT_SIMPLE_THREAD	= 0;
	private static final int		DEFAULT_BATCH_THREAD		= 1;
	private static final int		DEFAULT_TOTAL_LINE		= 1000000;
	private static final int		DEFAULT_BATCH_LINE		= 100;
	private static final int		DEFAULT_COMMITL_LINE		= 1000;
	private static final String	DEFAULT_JDBC_OPTION		= "";
	private static final int		DEFAULT_PSMT_THREAD		= 0;

	public static void main(String args[]) {
		try {
			final int		simplethread	= (args.length < 1 ? DEFAULT_SIMPLE_THREAD : Integer.valueOf(args[0]).intValue());
			final int		batchthread	= (args.length < 2 ? DEFAULT_BATCH_THREAD : Integer.valueOf(args[1]).intValue());
			final int		totalline		= (args.length < 3 ? DEFAULT_TOTAL_LINE : Integer.valueOf(args[2]).intValue());
			final int		batchline		= (args.length < 4 ? DEFAULT_BATCH_LINE : Integer.valueOf(args[3]).intValue());
			final int		commitline		= (args.length < 5 ? DEFAULT_COMMITL_LINE : Integer.valueOf(args[4]).intValue());
			final String	option			= (args.length < 6 ? DEFAULT_JDBC_OPTION : args[5]);
			final int		psmtthread		= (args.length < 7 ? DEFAULT_PSMT_THREAD : Integer.valueOf(args[6]).intValue());

			for (int i = 1; i <= simplethread; i++) {
				SimpleInsert si = new SimpleInsert(totalline, commitline, option, String.valueOf(i));
				si.start();
				Thread.sleep(1000);
			}

			for (int i = 1; i <= batchthread; i++) {
				BatchInsert bi = new BatchInsert(totalline, batchline, commitline, option, String.valueOf(i));
				bi.start();
				Thread.sleep(1000);
			}

			for (int i = 1; i <= psmtthread; i++) {
				PsmtInsert pi = new PsmtInsert(totalline, commitline, option, String.valueOf(i));
				pi.start();
				Thread.sleep(1000);
			}
		}
		catch (Exception e) {
			System.out.println("[Error]");
			e.printStackTrace();
		}
	}
}

Zusätzliche DB / Tabellendefinition


CREATE DATABASE psmt_test;
CREATE TABLE psmt_test.psmt_test
  (id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
   memo1 VARCHAR(10),
   memo2 VARCHAR(10),
   memo3 VARCHAR(10),
   memo4 VARCHAR(10),
   memo5 VARCHAR(10),
   memo6 VARCHAR(10),
   memo7 VARCHAR(10),
   memo8 VARCHAR(10),
   memo9 VARCHAR(10),
   memo10 VARCHAR(10),
   memo11 VARCHAR(10),
   memo12 VARCHAR(10),
   memo13 VARCHAR(10),
   memo14 VARCHAR(10),
   memo15 VARCHAR(10),
   memo16 VARCHAR(10),
   memo17 VARCHAR(10),
   memo18 VARCHAR(10),
   memo19 VARCHAR(10),
   memo20 VARCHAR(10),
   memo21 VARCHAR(10),
   memo22 VARCHAR(10),
   memo23 VARCHAR(10),
   memo24 VARCHAR(10),
   memo25 VARCHAR(10),
   memo26 VARCHAR(10),
   memo27 VARCHAR(10),
   memo28 VARCHAR(10),
   memo29 VARCHAR(10),
   memo30 VARCHAR(10),
   memo31 VARCHAR(10),
   memo32 VARCHAR(10),
   memo33 VARCHAR(10),
   memo34 VARCHAR(10),
   memo35 VARCHAR(10),
   memo36 VARCHAR(10),
   memo37 VARCHAR(10),
   memo38 VARCHAR(10),
   memo39 VARCHAR(10),
   memo40 VARCHAR(10),
   memo41 VARCHAR(10),
   memo42 VARCHAR(10),
   memo43 VARCHAR(10),
   memo44 VARCHAR(10),
   memo45 VARCHAR(10),
   memo46 VARCHAR(10),
   memo47 VARCHAR(10),
   memo48 VARCHAR(10),
   memo49 VARCHAR(10),
   memo50 VARCHAR(10),
   memo51 VARCHAR(10),
   memo52 VARCHAR(10),
   memo53 VARCHAR(10),
   memo54 VARCHAR(10),
   memo55 VARCHAR(10),
   memo56 VARCHAR(10),
   memo57 VARCHAR(10),
   memo58 VARCHAR(10),
   memo59 VARCHAR(10),
   memo60 VARCHAR(10),
   memo61 VARCHAR(10),
   memo62 VARCHAR(10),
   memo63 VARCHAR(10),
   memo64 VARCHAR(10),
   memo65 VARCHAR(10),
   memo66 VARCHAR(10),
   memo67 VARCHAR(10),
   memo68 VARCHAR(10),
   memo69 VARCHAR(10),
   memo70 VARCHAR(10),
   memo71 VARCHAR(10),
   memo72 VARCHAR(10),
   memo73 VARCHAR(10),
   memo74 VARCHAR(10),
   memo75 VARCHAR(10),
   memo76 VARCHAR(10),
   memo77 VARCHAR(10),
   memo78 VARCHAR(10),
   memo79 VARCHAR(10),
   memo80 VARCHAR(10)
  );

Recommended Posts

Benchen durch Ändern der Eigenschaften mit MySQL Connector / J Teil 3: Vorbereiteter Anweisungscache
Benchen durch Ändern der Eigenschaften mit MySQL Connector / J Teil 1: Batch
Benchmark durch Ändern der Eigenschaften mit MySQL Connector / J Teil 2: Stoppen Sie unnötige Gespräche
Benchen durch Ändern der Eigenschaften mit MySQL Connector / J Teil 1: Batch
Versuchen Sie es mit GloVe mit Deeplearning4j
JDBC-Verbindung mit MySQL 8.x * Hinweise *
Versuchen Sie es mit Redis mit Java (jar)
[Trainieren! ] Java-Datenbankverknüpfung (Connector / J 8.0.20)
Benchmark durch Ändern der Eigenschaften mit MySQL Connector / J Teil 2: Stoppen Sie unnötige Gespräche
Benchen durch Ändern der Eigenschaften mit MySQL Connector / J Teil 3: Vorbereiteter Anweisungscache
Interaktion mit einer MySQL-Datenbank mithilfe der ORM-Funktion (Object-Relational Mapping) von Apache Cayenne