Tại sao chúng tôi sử dụng DataSource thay vì DriverManager?


89

Tôi đang đọc đặc tả Java JDBC (vr. 4) và tôi đã gặp câu lệnh này:

DataSource - giao diện này đã được giới thiệu trong API gói tùy chọn JDBC 2.0. Nó được ưu tiên hơn DriverManager vì nó cho phép thông tin chi tiết về nguồn dữ liệu cơ bản đối với ứng dụng

Điều tôi đang cố gắng hiểu là sự khác biệt giữa a Connectionvà a là gì DataSourcevà tại sao nó tồn tại. Ý tôi là, khối ở trên nói rằng các chi tiết về nguồn dữ liệu là minh bạch đối với ứng dụng, nhưng sẽ không bên ngoài các thuộc tính cơ sở dữ liệu như tên người dùng, mật khẩu, url, v.v. trong tệp thuộc tính và sau đó sử dụng DriverManager theo cách tương tự?

Và có phải DataSourcegiao diện được tạo ra chỉ để có một cách chung để trả về các kết nối có thể được gộp chung, v.v.? Trong Java EE, máy chủ ứng dụng có triển khai giao diện này và các ứng dụng được triển khai có tham chiếu đến nguồn dữ liệu thay vì kết nối không?

Câu trả lời:


72

Khả năng mở rộng và bảo trì tốt hơn

Đối với DriverManagerbạn, bạn cần phải biết tất cả các chi tiết (máy chủ, cổng, tên người dùng, mật khẩu, lớp trình điều khiển) để kết nối với DB và nhận kết nối. Việc ngoại hóa chúng trong một tệp thuộc tính không thay đổi bất kỳ điều gì về thực tế là bạn cần biết chúng.

Sử dụng một DataSourcebạn chỉ cần biết tên JNDI. AppServer quan tâm đến các chi tiết và không được định cấu hình bởi nhà cung cấp ứng dụng khách mà bởi quản trị viên nơi ứng dụng được lưu trữ.

Khả năng mở rộng:

Giả sử bạn cần tự tạo kết nối, bạn sẽ đối phó với việc thay đổi tải như thế nào, đôi khi bạn có 10 người dùng, đôi khi bạn có 1000, bạn không thể chỉ có được kết nối bất cứ khi nào bạn cần và sau đó 'giải phóng' nó để máy chủ Cơ sở dữ liệu không thoát ra khỏi kết nối, dẫn bạn đến kết nối gộp. DriverManagerkhông cung cấp nó, DataSourcekhông.

Nếu bạn định tự lập trình một nhóm kết nối thì bạn phải sử dụng DriverManager, nếu không thì hãy sử dụng DataSource.


4
Datasource được cung cấp bởi nhà cung cấp trình điều khiển (giả sử MySQL). Máy chủ ứng dụng cần biết trình điều khiển để có thể tạo Nguồn dữ liệu. Sau đó, nó sẽ liên kết nó với tên JNDI (tên logic) đã được cấu hình. Lưu ý rằng đối với bước cấu hình này, tất cả các chi tiết (lớp trình điều khiển, url, tên người dùng, mật khẩu, v.v.) phải được biết. nhưng điều này vẫn tốt hơn việc ứng dụng khách biết những điều này.
A4L

4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.- bạn đã lật tên?
arun

3
@arun Tôi không nghĩ vậy, DriverManager là một API cấp thấp hơn DataSource.
A4L

9
@CodeChieftain Tôi nghĩ ý của anh ấy là, nếu bạn muốn tự mình triển khai Nhóm kết nối, vì vậy không có gì phải lật.
Koray Tugay,

2
Datasource cung cấp tính năng thăm dò kết nối. Câu lệnh cuối cùng cho biết nếu bạn muốn lập trình kết nối bỏ phiếu cho DataManager. Nó có thể gây hiểu nhầm lúc đầu. Nếu bạn muốn có kết nối thăm dò trong ứng dụng của mình, hãy tìm nguồn dữ liệu.
Aniket Thakur

38

DriverManager

  • cản trở hiệu suất ứng dụng khi các kết nối được tạo / đóng trong các lớp java.
  • không hỗ trợ gộp kết nối.

DataSource

  • cải thiện hiệu suất ứng dụng vì các kết nối không được tạo / đóng trong một lớp, chúng được quản lý bởi máy chủ ứng dụng và có thể được tìm nạp khi đang chạy.
  • nó cung cấp một cơ sở tạo ra một nhóm kết nối
  • hữu ích cho các ứng dụng doanh nghiệp

Nhưng nếu bạn đã tạo một lớp của riêng mình, chẳng hạn như MyConnectionPool và thực hiện một số phép thuật bên trong nó với DriverManager thì điều đó có giống với việc sử dụng một lớp triển khai giao diện DataSource không? Có phải giao diện DataSource chỉ để có một giao diện chung để kết nối không?
LuckyLuke

1
Không hoàn toàn giống nhau, những tác vụ như mùa xuân cho thấy khả năng của dataSource và hiệu suất của nó.
nav0611

3

Đoạn mã dưới đây cho thấy hai cách để có được kết nối.

Không cần biết về URL trong trường hợp mySqlDataSourcedòng này được nhận xét.

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

DataSourcecác đối tượng có thể cung cấp tổng hợp kết nối và giao dịch phân tán, vì vậy bạn có thể phải sử dụng DataSourcenếu bạn cần một trong hoặc cả hai tính năng này.


Hãy bình chọn. 'giao dịch phân tán' là một điểm còn thiếu trong các câu trả lời khác
卢 声 远 Shengyuan Lu

1

Chúng tôi có thể nhận được kết nối bằng cách sử dụng một nguồn dữ liệu như sau. Sử dụng kết nối để thực hiện bất kỳ truy vấn cơ sở dữ liệu nào.

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.