Повторите логику uptil базы данных - PullRequest
0 голосов
/ 27 июля 2010

Через мой Java-код я подключаюсь к нескольким базам данных, используя пул соединений. Если моя база данных выходит из строя, мне нужно обработать логику повторных попыток, чтобы получить соединение, пока оно не возвратит объект соединения.

1 Ответ

0 голосов
/ 06 февраля 2012

Если ваше соединение с БД создает какое-то исключение, вы можете просто поспать немного и повторить операцию.

В приведенном ниже примере работник - это объект, который выполняет некоторую работу, такую ​​как подключение к БД и т. Д. Он довольно общий, поэтому вы можете повторить любую операцию, например чтение из файла и т. Д.*

Обратите внимание, что ловить Throwable не обязательно будет хорошей идеей.

    boolean success = false;
    int i = 0;
    long delay = retryDelay;

    LOGGER.info("Starting operation");

    /*
     * Loop until you cannot retry anymore or the operation completed successfully
     * The catch block has a nested try catch to ensure that nothing goes wrong
     * while trying to sleep
     * 
     * In case of failure the last retry exception is propagated up to the calling
     * class.
     */
    while (i++ < retryMax && !success)
    {
        try
        {
            worker.work();
            success = true;
        }
        catch (Throwable t)
        {
            try
            {
                LOGGER.warn("Caught throwable", t);

                if (i == retryMax) 
                {
                    LOGGER.warn("Retry maximum reached, propagating error");
                    throw t;
                }

                if (retryPolicy == RetryPolicy.ESCALATING) 
                {
                    delay *= 2;
                }

                LOGGER.info("Sleeping for " + delay + " milliseconds");

                Thread.sleep(delay);
            }
            catch (Throwable tt)
            {
                /*
                 * Quick check to see if the maximum has been hit, so we don't log twice
                 * 
                 * t is the original error, and tt is the error we got while retrying
                 * tt would most likely be a InterruptedException or something
                 */
                if (i == retryMax) 
                {
                    throw t;
                }

                LOGGER.warn("Error while retrying, propagating original error up", tt);

                throw t;
            }
        }

    } // end retry loop
...