เหตุใดเราจึงใช้ DataSource แทน DriverManager


89

ฉันกำลังอ่านข้อกำหนด Java JDBC (ข้อ 4) และพบคำสั่งนี้:

แหล่งข้อมูล - อินเทอร์เฟซนี้ถูกนำมาใช้ใน JDBC 2.0 Optional Package API เป็นที่ต้องการมากกว่า DriverManager เนื่องจากช่วยให้รายละเอียดเกี่ยวกับแหล่งข้อมูลพื้นฐานโปร่งใสกับแอปพลิเคชัน

สิ่งที่ฉันพยายามทำความเข้าใจคือความแตกต่างระหว่าง a Connectionและ a DataSourceและเหตุใดจึงมีอยู่ ฉันหมายถึงบล็อกด้านบนบอกว่ารายละเอียดเกี่ยวกับแหล่งข้อมูลนั้นโปร่งใสสำหรับแอปพลิเคชัน แต่จะไม่ทำให้คุณสมบัติฐานข้อมูลภายนอกเช่นชื่อผู้ใช้รหัสผ่าน url ฯลฯ ในไฟล์คุณสมบัติแล้วใช้ DriverManager ทำงานในลักษณะเดียวกันหรือไม่

และDataSourceอินเทอร์เฟซถูกสร้างขึ้นเพื่อให้มีวิธีส่งคืนการเชื่อมต่อทั่วไปที่สามารถรวมกันได้หรือไม่? ใน Java EE แอ็พพลิเคชันเซิร์ฟเวอร์ใช้อินเทอร์เฟซนี้และแอปพลิเคชันที่ปรับใช้เพื่อให้มีการอ้างอิงไปยังแหล่งข้อมูลแทนการเชื่อมต่อหรือไม่

คำตอบ:


72

ความยืดหยุ่นและการบำรุงรักษาที่ดีขึ้น

สำหรับDriverManagerคุณจำเป็นต้องทราบรายละเอียดทั้งหมด (โฮสต์พอร์ตชื่อผู้ใช้รหัสผ่านคลาสไดรเวอร์) เพื่อเชื่อมต่อกับ DB และรับการเชื่อมต่อ การกำหนดภายนอกสิ่งเหล่านั้นในไฟล์คุณสมบัติไม่ได้เปลี่ยนแปลงอะไรเกี่ยวกับข้อเท็จจริงที่คุณจำเป็นต้องรู้

การใช้DataSourceคุณจำเป็นต้องรู้ชื่อ JNDI เท่านั้น AppServer ให้ความสำคัญกับรายละเอียดและไม่ได้กำหนดค่าโดยผู้จำหน่ายแอปพลิเคชันไคลเอนต์ แต่โดยผู้ดูแลระบบที่โฮสต์แอปพลิเคชัน

ความสามารถในการปรับขนาด:

สมมติว่าคุณต้องสร้างการเชื่อมต่อด้วยตัวเองคุณจะจัดการกับการเปลี่ยนแปลงโหลดอย่างไรบางครั้งคุณมีผู้ใช้ 10 คนบางครั้งคุณมี 1,000 คนคุณไม่สามารถรับการเชื่อมต่อได้ทุกเมื่อที่คุณต้องการ 'ปล่อย' และหลังจากนั้นเซิร์ฟเวอร์ฐานข้อมูลจึงไม่ ออกจากการเชื่อมต่อซึ่งจะนำคุณไปสู่การรวมการเชื่อมต่อ DriverManagerไม่ได้ให้มันDataSourceทำ

ถ้าคุณจะไปในการเขียนโปรแกรมเชื่อมต่อสระว่ายน้ำด้วยตัวคุณเองแล้วคุณจะต้องใช้อย่างอื่นไปด้วยDriverManagerDataSource


4
การเพิ่มแหล่งข้อมูลนั้นจัดทำโดยผู้จำหน่ายไดรเวอร์ (สมมติว่า MySQL) แอปเซิร์ฟเวอร์จำเป็นต้องรู้จักไดรเวอร์จึงจะสามารถสร้างแหล่งข้อมูลได้ หลังจากนั้นจะดูแลการผูกเข้ากับชื่อ JNDI (ชื่อตรรกะ) ที่กำหนดค่าไว้ โปรดทราบว่าสำหรับขั้นตอนการกำหนดค่านี้จะต้องทราบรายละเอียดทั้งหมด (คลาสไดรเวอร์, url, ชื่อผู้ใช้, รหัสผ่าน ฯลฯ ) แต่ยังดีกว่าการที่แอปพลิเคชันไคลเอนต์รู้จัก
A4L

4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.- คุณพลิกชื่อหรือไม่?
อรุณ

3
@arun ฉันไม่คิดอย่างนั้น DriverManager เป็น API ระดับต่ำกว่า DataSource
A4L

9
@CodeChieftain ฉันคิดว่าเขาหมายถึงถ้าคุณต้องการใช้ Connection Pool ด้วยตัวเองก็ไม่มีอะไรต้องพลิก
Koray Tugay

2
แหล่งข้อมูลให้การสำรวจการเชื่อมต่อ ข้อความสุดท้ายระบุว่าคุณต้องการตั้งโปรแกรมการสำรวจการเชื่อมต่อสำหรับ DataManager อาจทำให้เข้าใจผิดได้เล็กน้อยในตอนแรก ควรเป็นถ้าคุณต้องการให้มีการสำรวจการเชื่อมต่อในแอปของคุณให้ไปหาแหล่งข้อมูล
Aniket Thakur

38

DriverManager

  • ขัดขวางประสิทธิภาพของแอปพลิเคชันเนื่องจากการเชื่อมต่อถูกสร้าง / ปิดในคลาส java
  • ไม่รองรับการรวมการเชื่อมต่อ

DataSource

  • ปรับปรุงประสิทธิภาพของแอปพลิเคชันเนื่องจากไม่ได้สร้าง / ปิดการเชื่อมต่อภายในคลาสการเชื่อมต่อเหล่านี้ได้รับการจัดการโดยแอ็พพลิเคชันเซิร์ฟเวอร์และสามารถดึงข้อมูลขณะรันไทม์
  • มีสิ่งอำนวยความสะดวกในการสร้างกลุ่มการเชื่อมต่อ
  • มีประโยชน์สำหรับการใช้งานระดับองค์กร

แต่ถ้าคุณสร้างคลาสของคุณเองเช่น MyConnectionPool และใช้เวทมนตร์ในนั้นด้วย DriverManager จะเหมือนกับการใช้คลาสที่ใช้อินเทอร์เฟซ DataSource หรือไม่ อินเทอร์เฟซ DataSource มีไว้สำหรับการเชื่อมต่อทั่วไปเพื่อรับการเชื่อมต่อหรือไม่
LuckyLuke

1
ไม่เหมือนกันทุกประการเฟรมเวิร์คเช่นสปริงแสดงความสามารถของ dataSource และประสิทธิภาพของมัน
nav0611

3

ด้านล่างรหัสแสดงสองวิธีในการเชื่อมต่อ

ไม่จำเป็นต้องรู้เกี่ยวกับ URL ในกรณีmySqlDataSourceที่แสดงความคิดเห็นในบรรทัดนี้

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

DataSourceออบเจ็กต์สามารถจัดเตรียมการรวมการเชื่อมต่อและธุรกรรมแบบกระจายดังนั้นคุณอาจต้องใช้DataSourceหากคุณต้องการคุณสมบัติอย่างใดอย่างหนึ่งหรือทั้งสองอย่างนี้


โหวตขึ้น 'ธุรกรรมแบบกระจาย' เป็นจุดที่ขาดหายไปในคำตอบอื่น ๆ
卢声远 Shengyuan Lu

1

เราสามารถรับการเชื่อมต่อโดยใช้แหล่งข้อมูลได้ดังนี้ ใช้การเชื่อมต่อเพื่อดำเนินการสืบค้นฐานข้อมูลใด ๆ

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.