diff --git a/gradle.properties b/gradle.properties index 61a6736..f3dd5bd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group = org.xbib name = database -version = 1.4.2 +version = 1.4.3 org.gradle.warning.mode = ALL diff --git a/jdbc-query/src/main/java/org/xbib/jdbc/query/Database.java b/jdbc-query/src/main/java/org/xbib/jdbc/query/Database.java index 9b4bbe3..499eeda 100644 --- a/jdbc-query/src/main/java/org/xbib/jdbc/query/Database.java +++ b/jdbc-query/src/main/java/org/xbib/jdbc/query/Database.java @@ -121,6 +121,12 @@ public interface Database extends Supplier { */ Connection underlyingConnection(); + /** + * Probe the underlying connection. + * @return true if database has executed a probe query successfully, false if not + */ + boolean probe() throws SQLException; + Options options(); /** diff --git a/jdbc-query/src/main/java/org/xbib/jdbc/query/DatabaseImpl.java b/jdbc-query/src/main/java/org/xbib/jdbc/query/DatabaseImpl.java index 17207b6..41436e1 100644 --- a/jdbc-query/src/main/java/org/xbib/jdbc/query/DatabaseImpl.java +++ b/jdbc-query/src/main/java/org/xbib/jdbc/query/DatabaseImpl.java @@ -139,6 +139,12 @@ public class DatabaseImpl implements Database { return connection; } + @Override + public boolean probe() throws SQLException { + // use a standard timeout of 5 seconds + return connection != null && connection.isValid(5); + } + @Override public Options options() { return options; diff --git a/jdbc-query/src/main/java/org/xbib/jdbc/query/DatabaseProvider.java b/jdbc-query/src/main/java/org/xbib/jdbc/query/DatabaseProvider.java index dcd7179..6dc1aec 100644 --- a/jdbc-query/src/main/java/org/xbib/jdbc/query/DatabaseProvider.java +++ b/jdbc-query/src/main/java/org/xbib/jdbc/query/DatabaseProvider.java @@ -7,7 +7,6 @@ import org.xbib.jdbc.query.util.Metric; import javax.sql.DataSource; import java.io.Closeable; import java.io.IOException; -import java.lang.reflect.InvocationTargetException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; @@ -313,14 +312,37 @@ public final class DatabaseProvider implements Supplier, Closeable { } finally { metric.done(); if (logger.isLoggable(Level.FINE)) { - StringBuilder buf = new StringBuilder("Get ").append(builder.options.flavor()).append(" database: "); - metric.printMessage(buf); - logger.fine(buf.toString()); + StringBuilder sb = new StringBuilder("Get ").append(builder.options.flavor()).append(" database: "); + metric.printMessage(sb); + logger.fine(sb.toString()); } } return database; } + public boolean check() { + Metric metric = new Metric(logger.isLoggable(Level.FINE)); + boolean probe = false; + try { + if (database != null) { + probe = database.probe(); + } else { + get(); + probe = database.probe(); + } + } catch (SQLException | RuntimeException e) { + metric.checkpoint("fail", e.getMessage()); + } finally { + metric.done(); + if (logger.isLoggable(Level.FINE)) { + StringBuilder sb = new StringBuilder("Probe ").append(builder.options.flavor()).append(" database: "); + metric.printMessage(sb); + logger.log(Level.FINE, sb.toString()); + } + } + return probe; + } + public void commit() { if (connection != null) { try { diff --git a/jdbc-test/src/main/java/org/xbib/jdbc/test/CommonTest.java b/jdbc-test/src/main/java/org/xbib/jdbc/test/CommonTest.java index 4db005d..07c78c9 100644 --- a/jdbc-test/src/main/java/org/xbib/jdbc/test/CommonTest.java +++ b/jdbc-test/src/main/java/org/xbib/jdbc/test/CommonTest.java @@ -77,6 +77,9 @@ public abstract class CommonTest { dbp = createDatabaseProvider(new OptionsOverride() { }); db = dbp.get(); + if (!db.probe()) { + fail(); + } db.dropTableQuietly(TEST_TABLE_NAME); }