2015-12-28 10 views
9

I mają pochodzić z poniższej klasie użytkowej:Najlepszy sposób otwierania i zwracania połączenia z bazą danych w aplikacji Java?

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; 
    } 
} 

Problemem jest: Nie chcę, aby powrócić NULL z mojego sposobu, ponieważ w ten sposób wymusić moich rozmówców zrobić if (connection != null) {...} sprawdzaj za każdym razem, gdy się otwierają i chcesz skorzystać z połączenia. Uważam, że te kontrole zerowe są podatne na błędy i chcę ich uniknąć za wszelką cenę. Jakie inne podejście mogę zastosować, aby zarządzać połączeniami z bazą danych w mojej aplikacji?

+0

Czy potrzebne jest połączenie połączeń lub czy jest przydatne? –

+0

Nie można ich złapać, a zamiast tego zmusić dzwoniących do ich złapania. – Natecat

+0

Użyj implementacji 'DataSource' zamiast przewracać własne. –

Odpowiedz

5

Przede wszystkim, począwszy od JDBC 4.0/Java 6, wywołanie Class.forName() nie jest już konieczne.
(See is Class.forName() necessary)

Następnie nie należy chować wyjątków. Rzuć je na stos i niech rozmówcy decydują, w jaki sposób należy rozwiązywać wyjątki. W zależności od momentu getConnection() jest nazywany możesz:

  • wyświetlania skrzynki błąd popup użytkownikowi
  • Spróbuj innej bazy danych dla połączenia
  • uruchomić skrypt, aby spróbować i sprawdzić stan z następujących bazy danych i próba jej ponownego uruchomienia, jeśli wydaje się być w dół
  • Retry getConnection() całkowicie

Chodzi mi o byt, nie bój się rzucać wyjątków w górę stosu i niech calle r odpowiednio obsługiwać Wyjątek.

Wszystko to jest powiedziane, twoja metoda getConnection() powinna po prostu przechowywać twój adres URL DB, nazwę użytkownika i hasło.

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); 
    } 
} 

Realnie getConnection() będzie bardzo, bardzo rzadko wyrzucać SQLException. Jedynym scenariuszem, który miałem kiedykolwiek zobaczyłem, że rzucił wyjątek SQLException, ponieważ poświadczenia były nieprawidłowe lub baza danych została wyłączona.

+0

Oto, do czego służy implementacja 'DataSource', więc nie sądzę, że istnieje potrzeba napisania własnego opakowania. –

+0

@MarkRotteveel Zgadzam się, że źródło danych jest lepsze, ale używanie ich poza środowiskiem kontenerowym (wiosna lub Java EE) wydaje mi się nie na miejscu. Polecam dodanie innej odpowiedzi pokazującej prosty sposób korzystania z DataSources dla Java SE. –

1

Możesz rzucić wyjątek w oryginalnym kodzie w górę, a następnie za każdym razem, gdy chcesz uzyskać połączenie, musisz zająć się możliwym wyjątkiem. Oczywiście nie będziesz mieć problemów z wartością NULL, ale może to oznaczać więcej pracy. Jednak to bardzo wyraźnie mówi, że musisz obsłużyć połączenie nie działa, a to może być czystsze niż po prostu zwracanie wartości zerowej.

1

Patrz na te dwa pytania, Should a retrieval method return 'null' or throw an exception when it can't produce the return value? i How to show if a method may return null

że należy wyczyścić rzeczy nieco.

Nie można uniknąć zwracania NULL, jeśli nie można utworzyć żądanego obiektu (w niektórych przypadkach mamy opcję zwracania obiektów EMPTY, ale to nie ma zastosowania do obiektu połączenia JDBC) - Wszystko, co można zrobić, to poprawnie udokumentuj swoje metody.

Należy również unikać robienia Sysouts i pozwolić dzwoniącemu dowiedzieć się o błędach, oczekując, dodając throws do swojej metody i przez ponowne rzucanie wyjątków. Masz możliwość zawarcia wyjątków do czegoś bardziej użytecznego (specyficznego dla twojej aplikacji) przed rzuceniem.

Ponadto, wyraźne NULL zwraca z połowu (return NULL;) zamiast polegać na ostatnim oświadczeniu zwrotu - return connection;. Nie ma sensu, abyśmy nie wracali natychmiast, jeśli nie mieli ochoty zjeść Exception i kontynuować.

Na koniec powinieneś spróbować użyć adnotacji @Null i @NotNull, aby prawidłowo udokumentować swoje metody.

Powiązane problemy