为什么 DataSource
接口没有定义 JDBC- DataSource指定的标准数据源属性?
ds
使用该类型的引用,DataSource
我无法像这样设置以下属性:
public DbUtil(DataSource ds, String dbName, String port){
ds.setServerName(dbName);
ds.setPortNumber(port);
}
为什么 DataSource
接口没有定义 JDBC- DataSource指定的标准数据源属性?
ds
使用该类型的引用,DataSource
我无法像这样设置以下属性:
public DbUtil(DataSource ds, String dbName, String port){
ds.setServerName(dbName);
ds.setPortNumber(port);
}
因为与普通 old 不同,您不应该传递这些值DriverManager
。DataSource 通常在容器上配置,并且仅使用 JNDI 进行查找。
如果您再次开始传递这些值,它将破坏具有可配置数据源的全部意义。
这是来自 API 的引用。
DataSource 接口由驱动程序供应商实现。
DataSource 对象具有可在必要时修改的属性。例如,如果将数据源移动到不同的服务器,则可以更改服务器的属性。好处是因为可以更改数据源的属性,因此无需更改访问该数据源的任何代码。
因为在数据源上手动设置数据库名称或数据库配置没有意义,如果允许,它将在运行时破坏数据源功能,而在使用 Oracle 时,您想要更改服务器详细信息并且您将开始指向 Sybase .
这些参数应该提供给容器,您可以在运行时使用它们,允许覆盖或更改这些细节的机制太危险了。
这里要注意的另一件事是,如果这些属性成为合同的一部分,那么对于调用者来说它就是太多的信息,这不利于封装。
您的代码不需要知道这些细节是其配置的一部分。
JDBC 4.1 规范,第9.4.1节 DataSource Properties回答了您的问题:
DataSource 属性不打算由 JDBC 客户端直接访问。通过在实现类上而不是在应用程序使用的公共 DataSource 接口上定义访问方法,这种设计得到了加强。此外,客户端操作的对象可以是仅实现 DataSource 接口的包装器。属性的 setter 和 getter 方法不需要暴露给客户端。
驱动程序实现者也可以添加特定于其数据库的 setter/getter