Neden DriverManager yerine DataSource kullanıyoruz?


90

Java JDBC spesifikasyonunu (vr. 4) okuyorum ve şu ifadeyle karşılaştım:

DataSource - bu arayüz, JDBC 2.0 İsteğe Bağlı Paket API'sinde tanıtıldı. DriverManager'a tercih edilir çünkü temeldeki veri kaynağıyla ilgili ayrıntıların uygulamaya şeffaf olmasına izin verir.

Anlamaya çalıştığım şey, a Connectionve a arasındaki farkın ne olduğu DataSourceve neden var olduğudur. Demek istediğim, yukarıdaki blok, bir veri kaynağı ile ilgili ayrıntıların uygulamaya şeffaf olduğunu söylüyor, ancak bir özellik dosyasında kullanıcı adı, şifre, url vb. Gibi veritabanı özelliklerini dışsallaştırıp sonra DriverManager çalışmasını aynı şekilde kullanmaz mı?

Ve DataSourcearabirim yalnızca havuzda toplanabilen bağlantıları geri döndürmenin ortak bir yoluna sahip olmak için mi oluşturuldu? Java EE'de, uygulama sunucusu bu arabirimi uyguluyor mu ve uygulamalar bir bağlantı yerine bir veri kaynağına başvuruya sahip olacak şekilde dağıtılıyor mu?

Yanıtlar:


72

Daha iyi ölçeklenebilirlik ve bakım

İçin DriverManagertüm ayrıntıları bilmek gerekir (ana bilgisayar, port, kullanıcı adı, şifre, sürücü sınıfı) DB bağlanmak için ve bağlantıları olsun. Bunları bir özellikler dosyasında dışsallaştırmak, onları bilmeniz gerektiği gerçeğiyle ilgili hiçbir şeyi değiştirmez.

A kullanarak DataSourceyalnızca JNDI adını bilmeniz gerekir. AppServer ayrıntılara önem verir ve istemci uygulamasının satıcısı tarafından değil, uygulamanın barındırıldığı bir yönetici tarafından yapılandırılır.

Ölçeklenebilirlik:

Bağlantıları kendiniz oluşturmanız gerektiğini varsayalım, değişen yük ile nasıl başa çıkardınız, bazen 10 kullanıcınız var, bazen 1000'e sahipseniz, ihtiyacınız olduğunda sadece bir bağlantı kuramazsınız ve daha sonra Veritabanı sunucusu bunu yapmasın bağlantılardan kurtulun, bu da sizi bağlantı havuzuna götürür. DriverManagerbunu sağlamaz, DataSourceyapar.

Bir bağlantı havuzunu kendiniz programlayacaksanız kullanmanız gerekir DriverManager, aksi takdirde devam edin DataSource.


4
Veri kaynağı uygulaması, sürücü satıcısı tarafından sağlanır (MySQL diyelim). Uygulama sunucusunun, Veri Kaynağını oluşturabilmesi için sürücüyü bilmesi gerekir. Bundan sonra, onu yapılandırılmış olan JNDI adına (mantıksal ad) bağlamayı halleder. Bu yapılandırma adımı için tüm ayrıntıların (sürücü sınıfı, url, kullanıcı adı, şifre vb.) Bilinmesi gerektiğini unutmayın. ancak bu yine de bunların istemci uygulaması tarafından bilinmesinden daha iyidir.
A4L

4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.- isimleri çevirdin mi?
arun

3
@arun Sanmıyorum, DriverManager DataSource'tan daha düşük seviyeli bir API.
A4L

9
@CodeChieftain Bence, bir Bağlantı Havuzunu kendiniz uygulamak istiyorsanız, çevirecek hiçbir şey yok.
Koray Tugay

2
Veri kaynağı, bağlantı sorgulaması sağlar. Son ifade, DataManager için bağlantı yoklamayı programlamak isteyip istemediğinizi belirtir. İlk başta biraz yanıltıcı olabilir. Uygulamanızda bağlantı yoklamasının veri kaynağına gitmesini istiyorsanız bu olmalıdır.
Aniket Thakur

38

DriverManager

  • Bağlantılar java sınıflarında oluşturulurken / kapatılırken uygulama performansını engeller.
  • bağlantı havuzunu desteklemez.

DataSource

  • Bağlantılar bir sınıf içinde oluşturulmadığından / kapatılmadığından, uygulama sunucusu tarafından yönetildiğinden ve çalışma zamanında alınabildiğinden uygulama performansını artırır.
  • bağlantı havuzu oluşturan bir tesis sağlar
  • kurumsal uygulamalar için yararlı

Ancak MyConnectionPool gibi kendi sınıfınızı yarattıysanız ve içinde DriverManager ile biraz sihir yaptıysanız, bu DataSource arayüzünü uygulayan bir sınıf kullanmakla aynı mı olurdu? DataSource arabirimi yalnızca bir bağlantı elde etmek için ortak bir arabirime sahip olmak için mi?
LuckyLuke

1
Tam olarak aynı değil. Spring gibi çerçeve, dataSource'un kapasitesini ve performansını gösterir.
nav0611

3

Aşağıdaki kod, bağlantı kurmanın iki yolunu göstermektedir.

mySqlDataSourceBu satırın yorumlanması durumunda URL'nin bilinmesine gerek yoktur .

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

}

}

2

DataSourcenesneler bağlantı havuzu ve dağıtılmış işlemler sağlayabilir, bu nedenle DataSourcebu özelliklerden birine veya her ikisine ihtiyacınız varsa kullanmanız gerekebilir.


Oyvermek. 'dağıtılmış işlemler' diğer yanıtlarda eksik bir nokta
卢 声 远 Shengyuan Lu

1

Aşağıdaki gibi bir veri kaynağı kullanarak bağlantı kurabiliriz. Herhangi bir veritabanı sorgusu gerçekleştirmek için bağlantıyı kullanın.

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.