Dlaczego używamy źródła danych zamiast Menedżera Drivermanagera?
Czytam specyfikację Java JDBC (vr. 4)i natknąłem się na to stwierdzenie:
DataSource-interfejs ten został wprowadzony w JDBC 2.0 Opcjonalnie API pakietów. Jest preferowany niż DriverManager, ponieważ pozwala szczegóły dotyczące podstawowego źródła danych, aby były przejrzyste dla zastosowanie
Próbuję zrozumieć, jaka jest różnica między Connection
i a DataSource
, i dlaczego istnieje. To znaczy, blok powyżej jest napisane, że dane o źródle danych są przejrzyste dla aplikacji, ale czy zewnętrzność właściwości bazy danych, takich jak nazwa użytkownika, hasło, adres url itp. w pliku właściwości, a następnie użycie DriverManager nie działa w ten sam sposób?
I jest DataSource
interfejs stworzony tylko po to, aby mieć wspólny sposób zwracania połączeń, które można łączyć itp.? W Java EE serwer aplikacji implementuje ten interfejs i wdrażane aplikacje mają odniesienie do źródła danych zamiast połączenia?
5 answers
Lepsza skalowalność i konserwacja
Dla Menedżera sterowników musisz znać wszystkie szczegóły (host, port, nazwę użytkownika, hasło, klasę sterownika), aby połączyć się z DB i uzyskać połączenia. Eksternalizacja tych w pliku właściwości nie zmienia niczego co do tego, że musisz je znać.
Używając źródła danych musisz znać tylko nazwę JNDI. AppServer dba o szczegóły i nie jest konfigurowany przez dostawcę aplikacji klienckiej, ale przez administratora, gdzie aplikacja jest hostowana.
Skalowalność:
Załóżmy, że musisz tworzyć połączenia samodzielnie, jak radzisz sobie ze zmianą obciążenia, czasami masz 10 użytkowników czasami masz 1000, nie możesz po prostu uzyskać połączenia, gdy potrzebujesz jednego, a później go "zwolnić", aby serwer bazy danych nie wydostał się z połączeń, co prowadzi do poolingu połączeń. DriverManager tego nie dostarcza, DataSource to robi.
Jeśli zamierzasz zaprogramować pulę połączeń to musisz użyj DriverManager, w przeciwnym razie idź z DataSource.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-21 21:11:39
DriverManager.
- utrudnia działanie aplikacji, ponieważ połączenia są tworzone/zamykane w klasach java.
- nie obsługuje łączenia.
DataSource
- poprawia wydajność aplikacji, ponieważ połączenia nie są tworzone/zamykane w ramach klasy, są zarządzane przez serwer aplikacji i mogą być pobierane podczas wykonywania.
- zapewnia obiekt tworzący pulę połączeń
- pomocny dla aplikacji korporacyjnych
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-04 09:43:58
Możemy uzyskać połączenie za pomocą źródła danych w następujący sposób. Użyj połączenia, aby wykonać dowolne zapytanie do bazy danych.
DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-22 04:36:43
Poniższy kod pokazuje dwa sposoby na uzyskanie połączenia.
Nie ma potrzeby wiedzieć o URL w przypadku mySqlDataSource
, ponieważ ta linia jest komentowana.
public class MySqlDataSourceTest {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
/************** using MysqlDataSource starts **************/
MysqlDataSource d = new MysqlDataSource();
d.setUser("root");
d.setPassword("root");
// d.setUrl("jdbc:mysql://localhost:3306/manavrachna");
d.setDatabaseName("manavrachna");
Connection c = (Connection) d.getConnection();
/************** using MysqlDataSource ends**************/
/************** using DriverManager start **************/
Class.forName("com.mysql.jdbc.Driver");
Connection c=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/manavrachna","root","root");
/************** using DriverManager ends **************/
Statement st=(Statement) c.createStatement();
ResultSet rs=st.executeQuery("select id from employee");
while(rs.next())
{
System.out.println(rs.getInt(1));
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 15:06:02
Obiekty DataSource mogą zapewniać pooling połączeń i transakcje rozproszone, więc może być konieczne użycie DataSource, jeśli potrzebujesz jednej z tych funkcji lub obu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-11 17:34:07