Optymalne połączenie JDBC

Optymalne połączenie JDBC
Noran
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:42
0

W jaki sposób napisac klasę odpowiedzialną za połączenie JDBC z bazą danych w najlepszy sposób? Osobiście mam zamiar stworzyć prywatną metodę zwracającą obiekt Connection odpowiedzialną za połączenie, oraz publiczne pole zawierające zwracaną wartość. To jedno pole mam zamiar wykorzystywać we wszystkich moich połączeniach. Czy to dobre rozwiązanie? Przy okazji pytanie: dlaczego w linii ze zmienną POLACZENIE wyskakuje mi błąd o braku złapanych wyjątków?

Kopiuj
 package klasySilnika;

import java.sql.*;
import java.io.*;
import java.util.*;
 


public class UstanowPolaczenie 
{
    public static Connection POLACZENIE = UstanowPolaczenie();
   
    private static Connection UstanowPolaczenie() throws IOException, SQLException, ClassNotFoundException
    {
        try 
        {
            Class.forName("org.postgresql.Driver");
        
            Properties props = new Properties();
            FileInputStream in = new FileInputStream("A:/Projekty/Arch/src/klasySilnika/bazaDanych.properties");
            props.load(in);
            in.close();

            String drivers = props.getProperty("jdbc.drivers");
            if(drivers != null) System.setProperty("jdbc.drivers", drivers);
            String url = props.getProperty("jdbc.url");
            String username = props.getProperty("jdbc.username");
            String password = props.getProperty("jdbc.password");

            return DriverManager.getConnection(url, username,password);
        }
        catch (ClassNotFoundException e) 
        {
	return null;
        }
        catch(IOException e)
        {
            return null;
        }  
        catch(SQLException e)
        {
            return null;
        }    
    }
}

Gdzieś spotkałem się z opinią, że lepiej używać ConnectionFactory. Na jakie inne aspekty warto zwrócić uwagę przy pisaniu klasy odpowiedzialnej za połączenie JDBC?

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

Powiedz że robisz sobie teraz jaja. Lekcja na dziś: singleton. Powinieneś mieć prywatne pole, prywatny konstruktor oraz publiczną metodę do pobierania singletona. Poza tym skoro definiujesz że metoda rzuca wyjątki to nie możesz sobie jej wywołać tak jak to zrobiłeś przy deklaracji pola klasy... Swoja drogą nie bardzo rozumiem czemu twierdzisz ze te wyjątki rzucasz skoro ewidentnie wszystkie łapiesz...
Za "ciche" łapanie wyjątków powinni cię wychłostać. Może jednak warto pouczyć się podstaw javy zamiast głowić się nad "optymalnym" połączeniem z bazą danych?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Noran
Dzięki za uwagi. Mówiąc o cichym łapaniu wyjątków, miałeś na myśli, że nie jest wyświetlany stosowny komunikat?
Shalom
Jak poleci ci wyjątek to nie będziesz o tym po prostu wiedział. Wyobraź sobie że piszesz wielki system w kilkadziesiąt osób i masz tam takiego developera co zamiast informować o tym że wystąpił błąd łapie sobie wyjątki. W logach czysto, stacktraców nie ma, jedyne co widzisz to jakiś nullpointer w zupełnie innym miejscu w kodzie...
Noran
Nie brałem udziału w tak dużym projekcie, do moich potrzeb zawsze wystarczały logi. Dzięki za tę uwagę, uświadomiłem sobie kilka spraw.
__krzysiek85
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 9 lat
  • Postów:1019
1

Z takim rozwiązanie są dwa problemy:
-nie można tego użyć w wielu wątkach
-jeżeli połączenie zostanie czasowo zerwane, to nie zostanie ponownie otwarte


Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5
Noran
W przypadku singletona również?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.