一般限定DAO时,你将不得不为DAO对象上的数据源一个setter。 我的问题是,基于请求到服务器数据源我们的动态变化。即每个请求可以访问不同的数据库实例。

在请求保持逻辑特性,稍后可以使用检索到请求的DB的连接。

因此,当依赖注入DAO业务逻辑对象,我需要一种方法在运行时设置在DAO的属性(未配置时间)。

一个解决方案是存储线程本地的数据源,但我真的不喜欢用线程局部变量搞乱。

另一种选择是有一个调用初始化与所述请求属性DAO业务逻辑对象上的初始化方法。

我想这是一个常见的问题,你可以提出一个通用的解决方案?

有帮助吗?

解决方案

这听起来像你的问题是,你是为应用程序创建一个DAO实例。要么你需要为每个数据源创建一个单独的实例(可能使某种道控制器来管理这一切为你),或可能让你在你的DAO方法是静态的,并通过有关如何连接到数据源连同所有信息数据您正在持续到每一个方法。

其他提示

您的问题是有点混乱。有一个DAO访问多个不同的数据源,似乎是一个维护的噩梦。因此,你应该定义一个包含所有你想调用的方法之一DAO接口。对于每个数据库要连接到我会构建一个实现你的DAO接口的新类。这使您可以有多种实现。然后我就这些实现(每个都有自己的数据源)存储在一个Map(java.util.Map),使用“逻辑性”为重点,以地图。由于所有的DAO实现你的界面,你将能够将它们转换成接口和交替使用它们。在您的业务对象,你会注入地图DAO实现的。我希望这有助于你的设计。

您可能想看看这个类:

HTTP: //static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/datasource/lookup/AbstractRoutingDataSource.html

这将使它更容易为你的服务对象和数据访问对象是无知的是动态数据源的任何概念出现。

通常你需要实现一个Servlet过滤器,并使用一个ThreadLocal使得由AbstractRoutingDataSource使用的DataSourceLookup实施可以很容易地访问到规定返回哪个数据源的请求参数。如果你真的想避免这种情况,你可以实现一个Servlet过滤器,其设置的请求作用域的bean的属性和这个bean注入到你写的DataSourceLookup实施。请求范围豆仍然使用一个ThreadLocal在执行过程中,但至少这种方式是Spring的IMPL,不是你的,你不必担心。 :)

类似的方法是从Spring团队这个博客条目详细说明:

http://blog.springsource.com/2007/01 / 23 /动态数据源的路由/

我曾在一个客户机/服务器项目这样的问题。客户端和服务器项目中分享道接口。当我用来做数据库操作,我不得不选择合适的DAO实现。我的解决办法是这样的:

IVehicleDao vehicleDao =daoFactory.Get<IVehicleDao>(parameters);
vehicleDao.doSomething();

通过传递parameters.Inside道工厂决定哪些DAO实现返回..

从厂获取DAO

我已经这样做。您需要创建一个DAO每个类,并在你的DAO的范围,你需要通过你在那里做动态调用DAO到数据源,最后一类控制器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top