インターフェイスが JDBC - DataSourceDataSource
で指定された標準データ ソース プロパティを定義しないのはなぜ ですか?
タイプの参照ds
ではDataSource
、次のようなプロパティを設定できません。
public DbUtil(DataSource ds, String dbName, String port){
ds.setServerName(dbName);
ds.setPortNumber(port);
}
インターフェイスが JDBC - DataSourceDataSource
で指定された標準データ ソース プロパティを定義しないのはなぜ ですか?
タイプの参照ds
ではDataSource
、次のようなプロパティを設定できません。
public DbUtil(DataSource ds, String dbName, String port){
ds.setServerName(dbName);
ds.setPortNumber(port);
}
プレーンな古いものとは異なり、これらの値を渡すことは想定されていないためですDriverManager
。通常、DataSource はコンテナーで構成され、JNDI を使用してのみ検索されます。
これらの値を再び渡し始めると、構成可能な DataSource を持つという点がすべて無効になります。
以下は API からの引用です。
DataSource インターフェイスは、ドライバー ベンダーによって実装されます。
DataSource オブジェクトには、必要に応じて変更できるプロパティがあります。たとえば、データ ソースが別のサーバーに移動された場合、サーバーのプロパティを変更できます。利点は、データ ソースのプロパティを変更できるため、そのデータ ソースにアクセスするコードを変更する必要がないことです。
JDBC 4.1 仕様、セクション9.4.1 DataSource Propertiesはあなたの質問に答えます:
DataSource プロパティは、JDBC クライアントから直接アクセスできるようには意図されていません。この設計は、アプリケーションで使用されるパブリック DataSource インターフェイスではなく、実装クラスでアクセス メソッドを定義することによって強化されます。さらに、クライアントが操作するオブジェクトは、DataSource インターフェイスのみを実装するラッパーにすることができます。プロパティのセッター メソッドとゲッター メソッドは、クライアントに公開する必要はありません。
また、ドライバーの実装者は、データベースに固有のセッター/ゲッターを追加できます
データベース名またはデータベース構成をデータソースに手動で設定することは意味がないため、それが許可されている場合、実行時にデータソース機能が壊れます。Oracle を使用しているときにサーバーの詳細を変更したい場合は、Sybase を指すようになります。 .
これらのパラメーターはコンテナーに提供されることになっており、実行時にこれらを使用することができます。このような詳細をオーバーライドまたは変更するメカニズムを許可するのは危険すぎます。
ここで注意すべきもう 1 つの点は、これらのプロパティがコントラクトの一部になると、呼び出し元にとって情報が多すぎて、カプセル化に反することです。
コードは、構成の一部であるこれらの詳細について知る必要はありません。