1. Java / Говнокод #12772

    +71

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    public static Connection getDBConnectionReader() throws Exception {
            Connection conn = null;
            try {
                conn = enrollmentsDataSource.getConnection();
            } catch (SQLException e) {
                LOGGER.warn("SQL Exception: get DB connection reader", e);
                resetConnectionReader();
                try {
                    conn = enrollmentsDataSource.getConnection();
                } catch (SQLException e1) {
                    throw new Exception("Exception: get DB connection reader", e1);
                }
            }
            return conn;
    }

    Фрактал...

    Запостил: amarfey, 20 Марта 2013

    Комментарии (20) RSS

    • Ну а что, масштабируемое решение. Надо будет сделать 3 попытки - заменим строку 11 на копию 6-12, и так далее.
      Ответить
    • throw new Inception("We need to go even deeper");
      Ответить
    • А как правильно в таком случае?
      Ответить
      • Такое чувство, что всё говно внутри метода resetConnectionReader() осталось. Или же ГК в использовании лишней переменной conn?
        Ответить
        • Что-то волшебное там происходит, после чего соединение магически восстановится :)
          Ответить
      • Ну я бы цикл написал. И строк меньше, и число попыток легко поменять...
        Ответить
        • Насколько я знаю, с ексепшинами цикла не напишешь.
          Ответить
          • > ексепшинами цикла не напишешь.
            Кул стори, бро.

            P.S. А из топора каши не сваришь ;)
            Ответить
          • Как-то так это будет выглядеть в цикле
            public static Connection getDBConnectionReader() throws SQLException {
                for (int i = 0; ; i++) {
                    try {
                        return enrollmentsDataSource.getConnection();
                    }
                    catch (SQLException ex) {
                        if (i >= 1) {
                            throw ex;
                        }
                        LOGGER.warn("SQL Exception: get DB connection reader", ex);
                        resetConnectionReader();
                    }
                }    
            }
            Ответить
            • А вообще в данном случае и цикл не нужен, resetConnectionReader() не сработал — адью! Другое дело, что всю писанину можно сократить до:
              public static Connection getDBConnectionReader() throws SQLException {
                      try {
                          return enrollmentsDataSource.getConnection();
                      }
                      catch (SQLException ex) {
                          LOGGER.warn("SQL Exception: get DB connection reader", ex);
                          resetConnectionReader();
                          return enrollmentsDataSource.getConnection();
                  }    
              }
              Ответить
              • > и цикл не нужен
                Не, ну так категорично не надо, не от хорошей жизни же стали вторую попытку делать... Видимо какие-то проблемы с подключением были, а лишний раз беспокоить юзера не хотят.

                Но вот две попытки вызывают в моей дурной голове стойкую мысль о магическом числе. Почему не семь? Почему не сорок две?
                Ответить
                • Попытка одна и это попытка реконнекта в методе resetConnectionReader(). Почему я так думаю. С наибольшей вероятностью тут используется пул коннектов, т.е. getConnection() возвращает соединение из загашника, а оно может и протухнуть, например если СУБД перезагружали. И тут на помощь приходит метод resetConnectionReader, который волшебным образом восстанавливает протухшие коннекты.
                  Ответить
                  • А, вот оно как. Ну тогда это не такой уж говнокод.
                    Ответить
                    • Думал что очевидно, но вижу что нет. Придется отписаться.
                      >public static Connection getDBConnectionReader() throws Exception
                      Гавно это нубское, на уровне лабы. Есть один признак:

                      Нормальные, ленивые люди не получают руками соединения из датасорсов и не закрывают их и говнопулы c попытками они тоже не пишут.

                      За них это делают либы. А DataSource - это кошерная абстракция-обёртка.
                      Ответить
      • Совсем правильно - завести пул. Есть же DBCP.
        Ответить
    • а еще говно в том, что метод статический. т.е. более одного источника ну никак не судьба (сомневаюсь, что они пулятся циклически\рандомно)
      Ответить
    • public static Connection getDBConnectionReader() throws Exception {
      begin:        
      Connection conn = null;
              try {
                  conn = enrollmentsDataSource.getConnection();
              } catch (SQLException e) {
                  LOGGER.warn("SQL Exception: get DB connection reader", e);
                  resetConnectionReader();
                 goto begin;
              }
              return conn;
      }
      Ответить
      • в жабе нет goto
        Ответить
      • Про цикл while еще учитель не рассказал? По всей видимости не зря убрали.
        Не пойму это тут много вас идиотов, или перед нами один уёбок, который толком ни знает ни о структурах, ни английского, ни явы?
        Ответить
        • > По всей видимости не зря отказались.
          Ну, как я когда-то писал, в Си у goto есть несколько адекватных применений:
          1) выход из нескольких циклов - в жабе есть особый бряк;
          2) прыжок в конец функции для освобождения ресурсов - в жабе есть finally;
          3) конченные автоматы, высранные кодогенераторами - вот тут фейл, придется запилить по-другому, или генерить сразу байткод;

          Поэтому goto в жабе не особо нужно.
          Ответить

    Добавить комментарий