Mengapa kita menggunakan DataSource sebagai ganti DriverManager?


89

Saya membaca spesifikasi Java JDBC (vr. 4) dan saya menemukan pernyataan ini:

DataSource - antarmuka ini diperkenalkan di JDBC 2.0 Opsional Package API. Ini lebih disukai daripada DriverManager karena memungkinkan detail tentang sumber data yang mendasarinya menjadi transparan bagi aplikasi

Apa yang saya coba pahami adalah apa perbedaan antara a Connectiondan a DataSource, dan mengapa itu ada. Maksud saya, blok di atas mengatakan bahwa detail tentang sumber data transparan untuk aplikasi, tetapi tidakkah mengeksternalisasi properti database seperti nama pengguna, kata sandi, url dll dalam file properti dan kemudian menggunakan DriverManager bekerja dengan cara yang sama?

Dan apakah DataSourceantarmuka dibuat hanya untuk memiliki cara umum untuk mengembalikan koneksi yang dapat digabungkan, dll? Di Java EE, apakah server aplikasi mengimplementasikan antarmuka ini dan aplikasi yang digunakan memiliki referensi ke sumber data, bukan koneksi?

Jawaban:


72

Skalabilitas dan pemeliharaan yang lebih baik

Untuk DriverManagerAnda perlu mengetahui semua detail (host, port, username, password, kelas driver) untuk terhubung ke DB dan mendapatkan koneksi. Eksternalisasi yang ada di file properti tidak mengubah apa pun tentang fakta bahwa Anda perlu mengetahuinya.

Menggunakan a, DataSourceAnda hanya perlu mengetahui nama JNDI. AppServer peduli dengan detailnya dan tidak dikonfigurasi oleh vendor aplikasi klien, tetapi oleh admin tempat aplikasi dihosting.

Skalabilitas:

Misalkan Anda perlu membuat koneksi sendiri, bagaimana Anda menangani perubahan beban, terkadang Anda memiliki 10 pengguna terkadang Anda memiliki 1000, Anda tidak bisa mendapatkan koneksi kapan pun Anda membutuhkannya dan kemudian 'melepaskannya' sehingga server Database tidak keluar dari koneksi, yang membawa Anda ke penggabungan koneksi. DriverManagertidak menyediakannya, DataSourcetidak.

Jika Anda akan memprogram kumpulan koneksi sendiri maka Anda harus menggunakan DriverManager, jika tidak, lanjutkan DataSource.


4
implementasi Datasource disediakan oleh vendor driver (katakanlah MySQL). Appserver perlu mengetahui driver untuk dapat membuat Sumber Data. Setelah itu menangani pengikatan ke nama JNDI (nama logis) yang telah dikonfigurasi. Perhatikan bahwa untuk langkah konfigurasi ini semua detail (kelas driver, url, nama pengguna, kata sandi, dll.) Harus diketahui. tetapi ini masih lebih baik daripada membuatnya diketahui oleh aplikasi klien.
A4L

4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.- apakah kamu membalik namanya?
arun

3
@arun Saya rasa tidak, DriverManager adalah API level yang lebih rendah daripada DataSource.
A4L

9
@CodeChieftain Saya pikir maksudnya, jika Anda ingin menerapkan Connection Pool sendiri, jadi tidak ada yang perlu dibalik.
Koray Tugay

2
Sumber data menyediakan polling koneksi. Pernyataan terakhir menyatakan jika Anda ingin memprogram polling koneksi, gunakan DataManager. Ini bisa sedikit menyesatkan pada awalnya. Seharusnya jika Anda ingin melakukan polling koneksi di aplikasi Anda, carilah sumber data.
Aniket Thakur

38

DriverManager

  • menghambat kinerja aplikasi karena koneksi dibuat / ditutup di kelas java.
  • tidak mendukung penggabungan koneksi.

DataSource

  • meningkatkan kinerja aplikasi karena koneksi tidak dibuat / ditutup dalam suatu kelas, mereka dikelola oleh server aplikasi dan dapat diambil saat runtime.
  • ia menyediakan fasilitas yang membuat kumpulan koneksi
  • berguna untuk aplikasi perusahaan

Tetapi jika Anda membuat kelas Anda sendiri seperti MyConnectionPool dan melakukan sihir di dalamnya dengan DriverManager, apakah itu sama dengan menggunakan kelas yang mengimplementasikan antarmuka DataSource? Apakah antarmuka Sumber Data hanya untuk memiliki antarmuka umum untuk mendapatkan koneksi?
LuckyLuke

1
Tidak persis sama. Framework seperti pegas menunjukkan kapabilitas dataSource dan performanya.
nav0611

3

Kode di bawah ini menunjukkan dua cara untuk mendapatkan koneksi.

Tidak perlu mengetahui tentang URL jika mySqlDataSourcebaris ini dikomentari.

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

DataSourceobjek dapat menyediakan penyatuan koneksi dan transaksi terdistribusi, jadi Anda mungkin harus menggunakan DataSourcejika Anda memerlukan salah satu atau kedua fitur ini.


Beri suara. 'transaksi terdistribusi' adalah titik yang hilang dalam jawaban lain
卢 声 远 Shengyuan Lu

1

Kita bisa mendapatkan koneksi menggunakan sumber data sebagai berikut. Gunakan koneksi untuk melakukan kueri database apa pun.

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.