私はJava JDBC仕様(vr。4)を読んでおり、このステートメントに出会いました。
DataSource —このインターフェイスは、JDBC 2.0オプションパッケージAPIで導入されました。基盤となるデータソースの詳細をアプリケーションに対して透過的にできるため、DriverManagerよりも優先されます。
私が理解しようとしているのは、 Connection
と DataSource
の違いと、それが存在する理由です。つまり、上記のブロックは、データソースに関する詳細はアプリケーションに対して透過的であるが、ユーザー名、パスワード、URLなどのデータベースプロパティをプロパティファイルで外部化し、DriverManagerを使用しても同じように動作しないことを示しています。
そして、 DataSource
インターフェースは、プールされるなどの接続を返す一般的な方法を持つためだけに作成されていますか? Java EEで、アプリケーションサーバーはこのインターフェイスと、接続ではなくデータソースへの参照を持つようにデプロイされたアプリケーションを実装しますか?
スケーラビリティとメンテナンスの改善
ドライバーマネージャーの場合、DBに接続して接続を取得するには、すべての詳細(ホスト、ポート、ユーザー名、パスワード、ドライバークラス)を知る必要があります。プロパティファイルでそれらを外部化しても、それらを知る必要があるという事実については何も変わりません。
DataSourceを使用すると、JNDI名を知るだけで済みます。 AppServerは詳細を考慮し、クライアントアプリケーションのベンダーではなく、アプリケーションがホストされている管理者によって構成されます。
スケーラビリティ:
自分で接続を作成する必要があるとします。負荷の変化にどのように対処しますか。1000人のユーザーが10人いる場合は、データベースサーバーが必要としないため、1つ以上の「解放」が必要なときに接続を取得することはできません接続から抜け出すと、接続プールにつながります。 DriverManagerは提供しませんが、DataSourceは提供します。
接続プールをプログラムする場合は、DriverManagerを使用する必要があります。そうでない場合は、DataSourceを使用します。
以下のコードは、接続を取得する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));
}
}
}
DataSourceオブジェクトは接続プーリングと分散トランザクションを提供できるため、これらの機能の一方または両方が必要な場合はDataSourceを使用する必要がある場合があります。
次のようにデータソースを使用して接続を取得できます。接続を使用して、データベースクエリを実行します。
DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();