为什么DataSource接口没有定义由JDBC - DataSource指定的标准数据源属性?
使用DataSource类型的引用ds,我不能像这样设置以下属性:
public DbUtil(DataSource ds, String dbName, String port){
ds.setServerName(dbName);
ds.setPortNumber(port);
}发布于 2012-05-21 22:47:52
因为您不应该像普通的老式DriverManager那样传入这些值。DataSource通常配置在容器上,并且只能使用JNDI进行查找。
如果您再次开始传递这些值,那么拥有可配置DataSources的意义就大打折扣。
以下是API中的一句话。
DataSource接口由驱动程序供应商实现。
DataSource对象具有可在必要时修改的属性。例如,如果将数据源移动到其他服务器,则可以更改该服务器的属性。这样做的好处是,因为数据源的属性可以更改,所以访问该数据源的任何代码都不需要更改。
发布于 2012-05-21 22:51:28
由于手动设置数据源上的数据库名称或数据库配置没有任何意义,因此如果允许这样做,将在运行时中断数据源功能,而使用Oracle时,您想要更改服务器详细信息,并且您将开始指向Sybase。
这些参数应该提供给容器,您可以在运行时使用这些参数,允许机制覆盖或更改此类细节将非常危险。
这里要注意的另一件事是,如果这些属性成为协定的一部分,那么对于调用者来说,这就是太多的信息,这与封装是相反的。
您的代码不需要知道这些细节,它是配置的一部分。
发布于 2012-05-22 01:18:01
JDBC4.1规范的9.4.1 DataSource属性一节回答了您的问题:
JDBC客户端不能直接访问
DataSource属性。通过在实现类上定义访问方法,而不是在应用程序使用的公共DataSource接口上定义访问方法,加强了这种设计。此外,客户端操作的对象可以是仅实现DataSource接口的包装器。属性的setter和getter方法不需要向客户端公开。
驱动程序实现者还可以添加特定于其数据库的setter/getter
https://stackoverflow.com/questions/10687453
复制相似问题