DriverManagerの代わりにDataSourceを使用するのはなぜですか?


89

Java JDBC仕様(vr。4)を読んでいて、次のステートメントに遭遇しました。

データソース—このインターフェースはJDBC2.0オプションパッケージAPIで導入されました。基になるデータソースに関する詳細をアプリケーションに対して透過的にすることができるため、DriverManagerよりも優先されます

私が理解しようとしているのは、aConnectionと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 2014

3
@arunそうは思いませんが、DriverManagerはDataSourceよりも低レベルのAPIです。
A4L 2014

9
@CodeChieftain接続プールを自分で実装したい場合は、彼が意味していると思います。
Koray Tugay 2016

2
データソースは接続ポーリングを提供します。最後のステートメントは、接続ポーリングをプログラムするかどうかをDataManagerに指定します。最初は少し誤解を招く可能性があります。アプリで接続ポーリングをデータソースに適用したい場合は、そうする必要があります。
Aniket Thakur 2017

38

DriverManager

  • 接続がJavaクラスで作成/閉じられるため、アプリケーションのパフォーマンスが低下します。
  • 接続プーリングはサポートしていません。

DataSource

  • 接続はクラス内で作成/閉じられず、アプリケーションサーバーによって管理され、実行時にフェッチできるため、アプリケーションのパフォーマンスが向上します。
  • 接続のプールを作成する機能を提供します
  • エンタープライズアプリケーションに役立ちます

しかし、MyConnectionPoolなどの独自のクラスを作成し、その中にDriverManagerを使用して魔法をかけた場合、それはDataSourceインターフェイスを実装するクラスを使用するのと同じでしょうか?DataSourceインターフェースは、接続を取得するための共通インターフェースを持つためだけのものですか?
LuckyLuke 2013年

1
まったく同じではありません。春のようなフレームワークは、dataSourceの機能とそのパフォーマンスを示しています。
nav0611 2013年

3

以下のコードは、接続を取得するための2つの方法を示しています。

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.