DriverManager 대신 DataSource를 사용하는 이유는 무엇입니까?


89

Java JDBC 사양 (vr. 4)을 읽고 있는데 다음과 같은 진술을 접했습니다.

DataSource —이 인터페이스는 JDBC 2.0 선택적 패키지 API에 도입되었습니다. 기본 데이터 소스에 대한 세부 정보를 응용 프로그램에 투명하게 표시 할 수 있으므로 DriverManager보다 선호됩니다.

내가 이해하려고하는 것은 a Connection와 a 의 차이점 DataSource과 그것이 존재하는 이유입니다. 위의 블록은 데이터 소스에 대한 세부 정보가 응용 프로그램에 투명하지만 속성 파일에서 사용자 이름, 암호, url 등과 같은 데이터베이스 속성을 외부화 한 다음 같은 방식으로 DriverManager 작업을 사용하지 않는다고 말합니다.

그리고 DataSource풀링 할 수있는 연결을 반환하는 일반적인 방법을 갖도록 인터페이스가 만들어 졌습니까? Java EE에서 애플리케이션 서버가이 인터페이스를 구현하고 애플리케이션이 연결 대신 데이터 소스에 대한 참조를 갖도록 배치됩니까?

답변:


72

확장 성 및 유지 관리 향상

들어 DriverManager당신이 모든 세부 사항을 알고 있어야합니다 (호스트, 포트, 사용자 이름, 암호, 드라이버 클래스) DB에 연결하고 연결을 얻을 수 있습니다. 속성 파일에서 그것들을 외부화한다고해서 당신이 그것들을 알아야한다는 사실은 바뀌지 않습니다.

를 사용 DataSource하면 JNDI 이름 만 알면됩니다. AppServer는 세부 사항에 관심이 있으며 클라이언트 애플리케이션 공급 업체가 아니라 애플리케이션이 호스팅되는 관리자가 구성합니다.

확장 성 :

직접 연결을 생성해야한다고 가정 해 보겠습니다. 부하 변경을 어떻게 처리하고, 어떤 때는 10 명의 사용자가 있고, 어떤 때는 1000 명의 사용자가 있고, 필요할 때마다 연결을 얻을 수 없으며 나중에 '릴리스'할 수 없으므로 데이터베이스 서버가 그렇지 않습니다. 연결에서 벗어나면 연결 풀링으로 이어집니다. DriverManager제공하지 않습니다 DataSource.

연결 풀을 직접 프로그래밍하려면을 사용해야 DriverManager하고 그렇지 않으면를 사용해야 DataSource합니다.


4
데이터 소스 구현은 드라이버 공급 업체 (MySQL)에서 제공합니다. 애플리케이션 서버는 데이터 소스를 만들 수있는 드라이버를 알아야합니다. 그런 다음 구성된 JNDI 이름 (논리 이름)에 바인딩합니다. 이 구성 단계에서 모든 세부 정보 (드라이버 클래스, URL, 사용자 이름, 암호 등)를 알아야합니다. 그러나 이것은 클라이언트 응용 프로그램에 의해 알려진 것보다 여전히 낫습니다.
A4L 2013 년

4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.-이름을 뒤집 었어?
arun

3
@arun 그렇게 생각하지 않습니다. DriverManager는 DataSource보다 낮은 수준의 API입니다.
A4L

9
@CodeChieftain 나는 그가 의미하는 것처럼, 당신이 연결 풀을 직접 구현하고 싶다면 뒤집을 것이 없습니다.
Koray Tugay

2
데이터 소스는 연결 폴링을 제공합니다. 마지막 문은 연결 폴링을 프로그래밍하려는 경우 DataManager로 이동합니다. 처음에는 약간 오해의 소지가 있습니다. 앱에서 연결 폴링을 사용하려는 경우 데이터 소스로 이동해야합니다.
Aniket Thakur

38

DriverManager

  • 연결이 Java 클래스에서 생성 / 닫기 때문에 애플리케이션 성능이 저하됩니다.
  • 연결 풀링을 지원하지 않습니다.

DataSource

  • 연결이 클래스 내에서 생성 / 닫히지 않고 애플리케이션 서버에서 관리되며 런타임 중에 가져올 수 있으므로 애플리케이션 성능을 향상시킵니다.
  • 연결 풀을 만드는 기능을 제공합니다.
  • 엔터프라이즈 애플리케이션에 유용

그러나 MyConnectionPool과 같은 고유 한 클래스를 만들고 DriverManager를 사용하여 내부에 마법을 적용했다면 DataSource 인터페이스를 구현하는 클래스를 사용하는 것과 동일할까요? DataSource 인터페이스는 연결을 얻기위한 공통 인터페이스를 갖기위한 것입니까?
LuckyLuke 2013 년

1
Spring과 같은 프레임 워크는 dataSource의 기능과 성능을 보여줍니다.
nav0611 2013 년

3

아래 코드는 연결을 얻는 두 가지 방법을 보여줍니다.

mySqlDataSource이 줄이 주석 처리 된 경우 URL에 대해 알 필요가 없습니다 .

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.