From 34c1bcb3282c1323f39fac4da4ea727229d31b7a Mon Sep 17 00:00:00 2001 From: Rana Alotaibi Date: Mon, 11 Dec 2023 20:48:35 -0800 Subject: [PATCH] Introduce session setup --- config/sqlserver/sample_tpch_config.xml | 2 ++ .../session_setup_sqlserver_cmds_example.sql | 3 ++ .../java/com/oltpbenchmark/DBWorkload.java | 2 ++ .../oltpbenchmark/WorkloadConfiguration.java | 6 ++++ .../java/com/oltpbenchmark/api/Worker.java | 35 +++++++++++++++++++ 5 files changed, 48 insertions(+) create mode 100644 data/session-setup-files/session_setup_sqlserver_cmds_example.sql diff --git a/config/sqlserver/sample_tpch_config.xml b/config/sqlserver/sample_tpch_config.xml index 23275cbea..472244d77 100644 --- a/config/sqlserver/sample_tpch_config.xml +++ b/config/sqlserver/sample_tpch_config.xml @@ -9,6 +9,8 @@ P@ssw0rd TRANSACTION_SERIALIZABLE 1024 + + 0.1 diff --git a/data/session-setup-files/session_setup_sqlserver_cmds_example.sql b/data/session-setup-files/session_setup_sqlserver_cmds_example.sql new file mode 100644 index 000000000..bee4d4633 --- /dev/null +++ b/data/session-setup-files/session_setup_sqlserver_cmds_example.sql @@ -0,0 +1,3 @@ +-- SQL Server Database Console Command statements (DBCC) +DBCC DROPCLEANBUFFERS -- clear buffers (for cold runs) +DBCC FREEPROCCACHE -- clean plan cache \ No newline at end of file diff --git a/src/main/java/com/oltpbenchmark/DBWorkload.java b/src/main/java/com/oltpbenchmark/DBWorkload.java index 46231c0e7..75fd56537 100644 --- a/src/main/java/com/oltpbenchmark/DBWorkload.java +++ b/src/main/java/com/oltpbenchmark/DBWorkload.java @@ -124,6 +124,7 @@ public static void main(String[] args) throws Exception { wrkld.setPassword(xmlConfig.getString("password")); wrkld.setRandomSeed(xmlConfig.getInt("randomSeed", -1)); wrkld.setBatchSize(xmlConfig.getInt("batchsize", 128)); + wrkld.setSessionSetupFile(xmlConfig.getString("sessionsetupfile")); wrkld.setMaxRetries(xmlConfig.getInt("retries", 3)); wrkld.setNewConnectionPerTxn(xmlConfig.getBoolean("newConnectionPerTxn", false)); @@ -169,6 +170,7 @@ public static void main(String[] args) throws Exception { initDebug.put("URL", wrkld.getUrl()); initDebug.put("Isolation", wrkld.getIsolationString()); initDebug.put("Batch Size", wrkld.getBatchSize()); + initDebug.put("Session Setup File", wrkld.getSessionSetupFile()); initDebug.put("Scale Factor", wrkld.getScaleFactor()); initDebug.put("Terminals", wrkld.getTerminals()); initDebug.put("New Connection Per Txn", wrkld.getNewConnectionPerTxn()); diff --git a/src/main/java/com/oltpbenchmark/WorkloadConfiguration.java b/src/main/java/com/oltpbenchmark/WorkloadConfiguration.java index 68fa03cbc..5596e5f0d 100644 --- a/src/main/java/com/oltpbenchmark/WorkloadConfiguration.java +++ b/src/main/java/com/oltpbenchmark/WorkloadConfiguration.java @@ -37,6 +37,7 @@ public class WorkloadConfiguration { private String password; private String driverClass; private int batchSize; + private String sessionSetupFile; private int maxRetries; private int randomSeed = -1; private double scaleFactor = 1.0; @@ -116,6 +117,10 @@ public void setBatchSize(int batchSize) { this.batchSize = batchSize; } + public String getSessionSetupFile(){ return sessionSetupFile; } + + public void setSessionSetupFile(String sessionSetupFile){ this.sessionSetupFile = sessionSetupFile; } + public int getMaxRetries() { return maxRetries; } @@ -337,6 +342,7 @@ public String toString() { ", password='" + password + '\'' + ", driverClass='" + driverClass + '\'' + ", batchSize=" + batchSize + + ", setupSessionFile=" + sessionSetupFile + ", maxRetries=" + maxRetries + ", scaleFactor=" + scaleFactor + ", selectivity=" + selectivity + diff --git a/src/main/java/com/oltpbenchmark/api/Worker.java b/src/main/java/com/oltpbenchmark/api/Worker.java index f1cdf68ee..d77700dd5 100644 --- a/src/main/java/com/oltpbenchmark/api/Worker.java +++ b/src/main/java/com/oltpbenchmark/api/Worker.java @@ -26,6 +26,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; @@ -191,6 +194,13 @@ public final void run() { // In case of reuse reset the measurements latencies = new LatencyRecord(workloadState.getTestStartNs()); + // Invoke setup session + try { + this.setupSession(); + } catch (Throwable ex) { + throw new RuntimeException("Unexpected error when setting up the session " + this, ex); + } + // Invoke initialize callback try { this.initialize(); @@ -520,6 +530,31 @@ protected void initialize() { // The default is to do nothing } + /** + * Set up the session by running a set of statements before benchmark execution begins. + * The path of the file where a set of statements defined should be added + * in <sessionsetupfile> </sessionsetupfile> + */ + protected void setupSession() { + try { + String setupSessionFile = configuration.getSessionSetupFile(); + if (setupSessionFile == null || setupSessionFile.isEmpty()) { + return; + } + + String statements = new String(Files.readAllBytes(Paths.get(setupSessionFile))); + if (statements.isEmpty()) { + return; + } + + try (Statement stmt = conn.createStatement()) { + stmt.execute(statements); + } + } catch (SQLException | IOException ex) { + throw new RuntimeException("Failed setting up session", ex); + } + } + /** * Invoke a single transaction for the given TransactionType *