From 1df5f7bf10b5e30c051f0956bd89cbf61227d9b0 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 4 Jan 2014 18:46:11 +0900 Subject: [PATCH] Fixed #18 Allow specifying a default transaction isolation level. --- .../java/com/zaxxer/hikari/HikariConfig.java | 32 ++++++++++++++++++- .../java/com/zaxxer/hikari/HikariPool.java | 8 +++++ .../java/com/zaxxer/hikari/CreationTest.java | 10 ++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/zaxxer/hikari/HikariConfig.java b/core/src/main/java/com/zaxxer/hikari/HikariConfig.java index d6011afd..77342e9f 100644 --- a/core/src/main/java/com/zaxxer/hikari/HikariConfig.java +++ b/core/src/main/java/com/zaxxer/hikari/HikariConfig.java @@ -19,6 +19,8 @@ package com.zaxxer.hikari; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.lang.reflect.Field; +import java.sql.Connection; import java.util.Properties; import java.util.concurrent.TimeUnit; @@ -50,6 +52,7 @@ public final class HikariConfig implements HikariConfigMBean // Properties NOT changeable at runtime // + private int transactionIsolation; private String poolName; private String connectionTestQuery; private String dataSourceClassName; @@ -79,6 +82,7 @@ public final class HikariConfig implements HikariConfigMBean maxPoolSize = 60; maxLifetime = MAX_LIFETIME; poolName = "HikariPool-" + poolNumber++; + transactionIsolation = -1; } /** @@ -89,7 +93,7 @@ public final class HikariConfig implements HikariConfigMBean public HikariConfig(Properties properties) { this(); - PropertyBeanSetter.setTargetFromProperties(this, properties); + PropertyBeanSetter.setTargetFromProperties(this, properties); } @@ -376,6 +380,32 @@ public final class HikariConfig implements HikariConfigMBean this.shadedCodexMapping = mapping; } + public int getTransactionIsolation() + { + return transactionIsolation; + } + + /** + * Set the default transaction isolation level. The specified value is the + * constant name from the Connection class, eg. + * TRANSACTION_REPEATABLE_READ. + * + * @param isolationLevel the name of the isolation level + */ + public void setTransactionIsolation(String isolationLevel) + { + try + { + Field field = Connection.class.getField(isolationLevel); + int level = field.getInt(null); + this.transactionIsolation = level; + } + catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) + { + throw new IllegalArgumentException("Invalid transaction isolation value: " + isolationLevel); + } + } + public void validate() { Logger logger = LoggerFactory.getLogger(getClass()); diff --git a/core/src/main/java/com/zaxxer/hikari/HikariPool.java b/core/src/main/java/com/zaxxer/hikari/HikariPool.java index 26aabba1..87908f8a 100644 --- a/core/src/main/java/com/zaxxer/hikari/HikariPool.java +++ b/core/src/main/java/com/zaxxer/hikari/HikariPool.java @@ -58,6 +58,7 @@ public final class HikariPool implements HikariPoolMBean private final boolean jdbc4ConnectionTest; private final boolean isAutoCommit; private final boolean delegationProxies; + private int transactionIsolation; private final Timer houseKeepingTimer; @@ -79,6 +80,7 @@ public final class HikariPool implements HikariPoolMBean this.jdbc4ConnectionTest = configuration.isJdbc4ConnectionTest(); this.leakDetectionThreshold = configuration.getLeakDetectionThreshold(); this.isAutoCommit = configuration.isAutoCommit(); + this.transactionIsolation = configuration.getTransactionIsolation(); String dsClassName = configuration.getDataSourceClassName(); try @@ -162,6 +164,7 @@ public final class HikariPool implements HikariPoolMBean } connection.setAutoCommit(isAutoCommit); + connection.setTransactionIsolation(transactionIsolation); connection.clearWarnings(); return connection; @@ -345,6 +348,11 @@ public final class HikariPool implements HikariPoolMBean throw new RuntimeException("Connection not alive, retry."); } + if (transactionIsolation < 0) + { + transactionIsolation = connection.getTransactionIsolation(); + } + String initSql = configuration.getConnectionInitSql(); if (initSql != null && initSql.length() > 0) { diff --git a/core/src/test/java/com/zaxxer/hikari/CreationTest.java b/core/src/test/java/com/zaxxer/hikari/CreationTest.java index 3c8cd1fe..f400d93d 100644 --- a/core/src/test/java/com/zaxxer/hikari/CreationTest.java +++ b/core/src/test/java/com/zaxxer/hikari/CreationTest.java @@ -193,4 +193,14 @@ public class CreationTest Assert.assertSame("Totals connections not as expected", 2, ds.pool.getTotalConnections()); Assert.assertSame("Idle connections not as expected", 2, ds.pool.getIdleConnections()); } + + @Test + public void testIsolation() throws Exception + { + HikariConfig config = new HikariConfig(); + config.setTransactionIsolation("TRANSACTION_REPEATABLE_READ"); + int transactionIsolation = config.getTransactionIsolation(); + + Assert.assertSame(Connection.TRANSACTION_REPEATABLE_READ, transactionIsolation); + } }