Я придумал следующий служебный класс:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MySqlConnection
{
    private static String dbUrl = "jdbc:mysql://localhost:3306/database";
    private static String dbUsername = "root";
    private static String dbPassword = "mysql";

    public static Connection getConnection()
    {
        Connection connection = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(dbUrl, dbUsername, dbPassword);
        } catch (ClassNotFoundException e) {
            System.out.println("Could not load JDBC driver: " + e.getMessage());
        } catch (SQLException e) {
            System.out.println("Could not connect to DB: " + e.getMessage());
        }
        return connection;
    }
}

Проблема в следующем: Я не хочу возвращать null из моего метода , потому что при этом я заставляю вызывающих абонентов выполнять проверку if (connection != null) {...} каждый раз, когда они открываются и хотите использовать соединение. Я считаю, что эти нулевые проверки подвержены ошибкам, и хочу избежать их любой ценой. Какой другой подход я могу использовать для управления подключениями к базе данных в моем приложении?

12
Enrique 28 Дек 2015 в 06:58

3 ответа

Лучший ответ

Прежде всего, начиная с JDBC 4.0 / Java 6, вызов Class.forName() больше не нужен.
(См., требуется ли Class.forName ())

Далее, не хороните исключения. Подбросьте их в стек, и позвольте вызывающим абонентам решать, как обрабатывать исключения. В зависимости от того, когда вызывается getConnection(), вы можете:

  • Показывать пользователю всплывающее окно с ошибкой
  • Попробуйте другую базу данных для подключения
  • Запустите сценарий, чтобы попытаться проверить состояние базы данных и попытаться перезапустить ее, если она не работает.
  • Повторить попытку getConnection () полностью

Я хочу сказать, что не бойтесь выбросить исключения в стек и позволить вызывающей стороне обработать исключение соответствующим образом.

При этом ваш метод getConnection() должен просто хранить URL вашей БД, имя пользователя и пароль.

public class MySqlConnection
{
    private static String dbUrl = "jdbc:mysql://localhost:3306/database";
    private static String dbUsername = "root";
    private static String dbPassword = "mysql";

    public static Connection getConnection() throws SQLException
    {
        return DriverManager.getConnection(dbUrl, dbUsername, dbPassword);
    }
}

На самом деле getConnection() очень редко вызывает исключение SQLException. Единственный сценарий, который я когда-либо видел, когда он генерировал исключение SQLException, - это неправильные учетные данные или отказ базы данных.

5
Community 23 Май 2017 в 11:52

Обратитесь к этим двум вопросам: Должен ли метод поиска возвращать значение null или выдавать исключение, если он не может предоставить возвращаемое значение? и Как узнать, может ли метод возвращать значение null

Это должно немного прояснить ситуацию.

Вы не можете избежать возврата NULL, если не можете создать желаемый объект (в некоторых случаях у нас есть возможность вернуть объекты EMPTY, но это не применимо к объекту подключения JDBC) - Все, что вам нужно можно правильно задокументировать свои методы.

Вам также следует избегать выполнения Sysouts и сообщать вызывающей стороне об ожидаемых ошибках, добавляя throws в ваш метод и повторно генерируя исключения. У вас есть возможность перенести исключения во что-то более полезное (специфичное для вашего приложения) перед повторным выбросом.

Кроме того, сделайте явный возврат NULL из вашего улова (return NULL;) вместо того, чтобы полагаться на последний оператор возврата - return connection;. Нет смысла не возвращаться немедленно, если не хочешь съесть Exception и продолжить.

Наконец, вы должны попытаться использовать аннотации @Null и @NotNull для правильного документирования ваших методов.

1
Community 23 Май 2017 в 11:45

Вы можете выбросить исключение в исходном коде вверх, а затем иметь дело с возможным исключением каждый раз, когда вы захотите установить соединение. Конечно, у вас не будет нулевых проблем, но это может потребовать больше работы. Тем не менее, в нем очень четко указано, что вам нужно обрабатывать неработающее соединение, и это может быть яснее, чем просто возврат null.

1
Untitled123 28 Дек 2015 в 04:04