NutzCN Logo
问答 一个service的save, find方法使用不懂得datasource
发布于 3095天前 作者 yzhang226 2707 次浏览 复制 上一个帖子 下一个帖子
标签:

现在项目中有这么一种需求:

XXXService {
private Dao dao;

public void save(){
// 走主库
}
public void find() {
// 走从库
}
}

spring是通过 AbstractRoutingDataSource 来完成的,
nutz可否能实现类似功能?
谢谢

10 回复

注入不同的dao实例不是更好吗

@wendal 因为是一样的库, 只是主 从而已, 不想在代码里写死, 还有后期希望可以动态找数据源, 分散数据库的压力,
能否有这样的实现?
按照我的理解, 只需要能动态置入datasource, 一个事务中, 就ok了

@yzhang226 那可以动态选dao实例啊

@wendal 可以动态选dao? 怎么动态置入到, 而又在事务中?

@yzhang226 注入多个dao实例,按需选用不同的dao实例

@wendal 是对一个service 的同一个方法, 需要分散数据库压力, 读多个不同的数据库, 代码是一个样的, 只是读的库不一样.
这个选择不同的dao应该是放在外层, 有很多这样的方法, 举个例子:

public Product getProductById(long id) {
    // 因为有了不同的dao, 不能直接dao., 而应该有一个统一获取dao的策略, 
	// 怎么动态获取这个dao
    return dao.fetchById(id);
}

@yzhang226 Dao只是一个接口哦

@wendal 恩, 对于这种需求, 你有什么idea来处理?

@yzhang226

要完全透明,唯有中间件

dao层,部分透明,实现Dao接口,里面放注入2个真正的dao实例,执行fetch和query时用'读dao',其他用'写dao'

另外一个思路就是像daocache那样,根据执行的sql做不同的逻辑

另外,不同数据源的强事务很难的,不能要求完全一致

@wendal 我一开始的想法是, 使用aop, 根据service的方法名, 置入不同的dao

实现一个自定义的dao实现, 似乎不能通用, 因为dao里面无法知道service的哪一个方法, 无法根据service的方法来做判断

mysql数据库一般是一主多从, 写可以一个写dao, 读的话有很多读dao, 难点在于平衡多个读dao对于同一方法

添加回复
请先登陆
回到顶部