web-dev-qa-db-ja.com

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

私はJava JDBC仕様(vr。4)を読んでおり、このステートメントに出会いました。

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

私が理解しようとしているのは、 ConnectionDataSource の違いと、それが存在する理由です。つまり、上記のブロックは、データソースに関する詳細はアプリケーションに対して透過的であるが、ユーザー名、パスワード、URLなどのデータベースプロパティをプロパティファイルで外部化し、DriverManagerを使用しても同じように動作しないことを示しています。

そして、 DataSource インターフェースは、プールされるなどの接続を返す一般的な方法を持つためだけに作成されていますか? Java EEで、アプリケーションサーバーはこのインターフェイスと、接続ではなくデータソースへの参照を持つようにデプロイされたアプリケーションを実装しますか?

79
LuckyLuke

スケーラビリティとメンテナンスの改善

ドライバーマネージャーの場合、DBに接続して接続を取得するには、すべての詳細(ホスト、ポート、ユーザー名、パスワード、ドライバークラス)を知る必要があります。プロパティファイルでそれらを外部化しても、それらを知る必要があるという事実については何も変わりません。

DataSourceを使用すると、JNDI名を知るだけで済みます。 AppServerは詳細を考慮し、クライアントアプリケーションのベンダーではなく、アプリケーションがホストされている管理者によって構成されます。

スケーラビリティ:

自分で接続を作成する必要があるとします。負荷の変化にどのように対処しますか。1000人のユーザーが10人いる場合は、データベースサーバーが必要としないため、1つ以上の「解放」が必要なときに接続を取得することはできません接続から抜け出すと、接続プールにつながります。 DriverManagerは提供しませんが、DataSourceは提供します。

接続プールをプログラムする場合は、DriverManagerを使用する必要があります。そうでない場合は、DataSourceを使用します。

65
A4L

DriverManager。

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

情報元

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

以下のコードは、接続を取得する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));
    }

}

}
3
Ram Tiwary

DataSourceオブジェクトは接続プーリングと分散トランザクションを提供できるため、これらの機能の一方または両方が必要な場合はDataSourceを使用する必要がある場合があります。

0
Koray Tugay

次のようにデータソースを使用して接続を取得できます。接続を使用して、データベースクエリを実行します。

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
0
ansraju