diff --git a/mysql-storage/src/main/java/io/druid/storage/mysql/MySQLConnector.java b/mysql-storage/src/main/java/io/druid/storage/mysql/MySQLConnector.java index 6bcb34d0d89..2bebe0ced36 100644 --- a/mysql-storage/src/main/java/io/druid/storage/mysql/MySQLConnector.java +++ b/mysql-storage/src/main/java/io/druid/storage/mysql/MySQLConnector.java @@ -70,30 +70,12 @@ public class MySQLConnector extends SQLMetadataConnector } @Override - public void createTable(final IDBI dbi, final String tableName, final String sql) + protected boolean tableExists(Handle handle, String tableName) { - try { - dbi.withHandle( - new HandleCallback() - { - @Override - public Void withHandle(Handle handle) throws Exception - { - List> table = handle.select(String.format("SHOW tables LIKE '%s'", tableName)); - if (table.isEmpty()) { - log.info("Creating table[%s]", tableName); - handle.createStatement(sql).execute(); - } else { - log.info("Table[%s] existed: [%s]", tableName, table); - } - return null; - } - } - ); - } - catch (Exception e) { - log.warn(e, "Exception creating table"); - } + return !handle.createQuery("SHOW tables LIKE :tableName") + .bind("tableName", tableName) + .list() + .isEmpty(); } @Override diff --git a/postgres-storage/src/main/java/io/druid/storage/postgres/PostgreSQLConnector.java b/postgres-storage/src/main/java/io/druid/storage/postgres/PostgreSQLConnector.java index 3778e64bfb8..dadb9791148 100644 --- a/postgres-storage/src/main/java/io/druid/storage/postgres/PostgreSQLConnector.java +++ b/postgres-storage/src/main/java/io/druid/storage/postgres/PostgreSQLConnector.java @@ -29,9 +29,7 @@ import org.skife.jdbi.v2.DBI; import org.skife.jdbi.v2.Handle; import org.skife.jdbi.v2.IDBI; import org.skife.jdbi.v2.tweak.HandleCallback; - -import java.util.List; -import java.util.Map; +import org.skife.jdbi.v2.util.StringMapper; public class PostgreSQLConnector extends SQLMetadataConnector { @@ -61,30 +59,15 @@ public class PostgreSQLConnector extends SQLMetadataConnector } @Override - public void createTable(final IDBI dbi, final String tableName, final String sql) + protected boolean tableExists(final Handle handle, final String tableName) { - try { - dbi.withHandle( - new HandleCallback() - { - @Override - public Void withHandle(Handle handle) throws Exception - { - List> table = handle.select(String.format("SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public' AND tablename LIKE '%s'", tableName)); - if (table.isEmpty()) { - log.info("Creating table[%s]", tableName); - handle.createStatement(sql).execute(); - } else { - log.info("Table[%s] existed: [%s]", tableName, table); - } - return null; - } - } - ); - } - catch (Exception e) { - log.warn(e, "Exception creating table"); - } + return !handle.createQuery( + "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public' AND tablename LIKE :tableName" + ) + .bind("tableName", tableName) + .map(StringMapper.FIRST) + .list() + .isEmpty(); } @Override diff --git a/server/src/main/java/io/druid/db/DerbyConnector.java b/server/src/main/java/io/druid/db/DerbyConnector.java index 88f71d4d666..1c0929efe0d 100644 --- a/server/src/main/java/io/druid/db/DerbyConnector.java +++ b/server/src/main/java/io/druid/db/DerbyConnector.java @@ -24,9 +24,12 @@ import com.google.common.base.Supplier; import com.google.inject.Inject; import org.apache.derby.drda.NetworkServerControl; import org.skife.jdbi.v2.DBI; +import org.skife.jdbi.v2.Handle; import org.skife.jdbi.v2.tweak.ConnectionFactory; import java.net.InetAddress; +import java.util.List; +import java.util.Map; public class DerbyConnector extends SQLMetadataConnector { @@ -40,6 +43,15 @@ public class DerbyConnector extends SQLMetadataConnector this.dbi = new DBI(getConnectionFactory("druidDerbyDb")); } + @Override + protected boolean tableExists(Handle handle, String tableName) + { + return !handle.createQuery("select * from SYS.SYSTABLES where tablename = :tableName") + .bind("tableName", tableName.toUpperCase()) + .list() + .isEmpty(); + } + @Override protected String getSerialType() { diff --git a/server/src/main/java/io/druid/db/SQLMetadataConnector.java b/server/src/main/java/io/druid/db/SQLMetadataConnector.java index 048b0b4c25a..1e9aba86810 100644 --- a/server/src/main/java/io/druid/db/SQLMetadataConnector.java +++ b/server/src/main/java/io/druid/db/SQLMetadataConnector.java @@ -77,6 +77,8 @@ public abstract class SQLMetadataConnector implements MetadataStorageConnector */ protected abstract String getSerialType(); + protected abstract boolean tableExists(Handle handle, final String tableName); + public void createTable(final IDBI dbi, final String tableName, final String sql) { try { @@ -86,12 +88,11 @@ public abstract class SQLMetadataConnector implements MetadataStorageConnector @Override public Void withHandle(Handle handle) throws Exception { - List> table = handle.select(String.format("select * from SYS.SYSTABLES where tablename = \'%s\'", tableName.toUpperCase())); - if (table.isEmpty()) { + if (!tableExists(handle, tableName)) { log.info("Creating table[%s]", tableName); handle.createStatement(sql).execute(); } else { - log.info("Table[%s] existed: [%s]", tableName, table); + log.info("Table[%s] already exists", tableName); } return null; }