Print

Print


Author: [log in to unmask]
Date: Mon Oct 12 13:30:30 2015
New Revision: 3840

Log:
auto-retry connection

Modified:
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java	Mon Oct 12 13:30:30 2015
@@ -9,6 +9,7 @@
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.Properties;
+import java.util.logging.Logger;
 
 /**
  * This class encapsulates the parameters for connecting to a database, including host name, port, user and password.
@@ -21,6 +22,11 @@
      * The default port number.
      */
     public static final int DEFAULT_PORT = 3306;
+
+    /**
+     * Number of connection retries allowed.
+     */
+    private static final int MAX_ATTEMPTS = 10;
 
     /**
      * Configure the connection parameters from a properties file.
@@ -147,13 +153,24 @@
     public Connection createConnection() {
         final Properties connectionProperties = this.getConnectionProperties();
         Connection connection = null;
-        try {
-            connection = DriverManager.getConnection(this.getConnectionString(), connectionProperties);
-            connection.createStatement().execute("USE " + this.getDatabase());
-        } catch (final SQLException x) {
-            throw new RuntimeException("Failed to connect to database: " + this.getConnectionString(), x);
-        }
-        return connection;
+        int attempt = 0;
+        while (true) {
+            attempt++;
+            try {
+                connection = DriverManager.getConnection(this.getConnectionString(), connectionProperties);
+                connection.createStatement().execute("USE " + this.getDatabase());
+            } catch (final SQLException x) {
+                Logger.getLogger(this.getClass().getPackage().getName()).warning("Failed to connect to database " + this.getConnectionString() + " - " + x.getMessage());
+                if (attempt >= MAX_ATTEMPTS) {
+                    throw new RuntimeException("Failed to connect to database after " + attempt + " attempts: " + this.getConnectionString(), x);
+                }
+                continue;
+            }
+            if (attempt > 1) {
+                Logger.getLogger(this.getClass().getPackage().getName()).warning("Connected to database " + this.getConnectionString() + " - after " + attempt + " attempts");
+            }
+            return connection;
+        }
     }
 
     /**