配置多数据源后,发现一个问题,没发现怎么设置默认数据源

项目开发后期了,本来是只有一个数据源,现在多加一个数据源(也就是原来的写法不能变了),两个库的表基本一样,只有些许区别,配置两个数据源后使用Db.use("sourceName")或Model.dao.use("sourceName")那都是正常的,但是问题出在Db.findFirst(sql)与Model.dao.findFirst(sql)上,就是没指定默认数据源时Db的方法查询的是“me.add(arp)”谁在前就使用该数据源,而Model.dao却是”me.add(arp)“谁在后就使用该数据源。   不晓得描述的清不清楚。。。

评论区

ghostsf

2017-03-24 11:10

有这个问题吗?我只知道Db是默认用的在前面的配置的。Model没试过,按程序走,Model应该用的后面的。这个需要你用use来切换了。

JFinal

2017-03-24 11:42

确实在十秒之内没有看懂,但你的 model.dao.use(...) 这种用法是绝对错误的,因为 dao 是 static 的全局共享的,多个人同时访问的时候会出现线程安全问题

补充一下,由于时间极其有限,一般只能花十秒钟左右的时间去扫一眼问题,如果不能秒懂,就只能要求大家继续补充详细

zhaozhihong

2017-03-24 14:25

@JFinal 吓我一跳。。dao只能查询并不能增删改,Model.dao.use("sourceName")后面再加查询方法,如Model.dao.use("sourceName").findFirst(sql)。

zhaozhihong

2017-03-24 14:26

@JFinal 我的意思是如果不指定使用哪个数据源的话,执行同一查询语句Db.findFirst(sql)与Model.dao.findFirst(sql)的结果不一样

zhaozhihong

2017-03-24 14:31

@ghostsf 是啊!结果是这样的,但是项目之前的代码讲真的不可能再去挨个修改指定数据源,所以我想问问如果没指定数据源,怎么使用默认的那个(当然了,怎么设置默认我都不知道),要不然Db.findFirst(sql)与Model.dao.findFirst(sql)的结果不一样这样就很尴尬

ghostsf

2017-03-24 14:58

@zhaozhihong 我刚看了下 设置默认数据源有个configname="main",取名叫main就是默认的。这是jfinal2.2的。3.0似乎在DbPro搞了个MAIN静态变量,但是这个还是按第一次初始化来的。具体看代码。

zhaozhihong

2017-03-24 17:04

@ghostsf 测试了一下,不设置名字就会自动给个“main”,但是这个并没有起到默认数据源的功能,那两句还是查出不同库的东西,我用的是3.0

JFinal

2017-03-24 17:54

@zhaozhihong configName 为 main 的是默认数据源,如果你只有一个数据源,那么这第一个也会默认成为主数据源

不要使用 model.dao.use(...),而是要直接 model.use(...) , 这样就没问题了,最终是: model.use(...).find(sql)

通常要封装得更好,可以利用一个全局拦截器,在拦截器中使用一个 ThreadLocal 去存放当前请求该有的 configName,然后在查询的时候,统一使用:
Db.use(Kit.getConfigName()).find(sql, ...) 或者
model.use(kit.getConfigName()).find(sql, ...)

杜福忠

2017-03-24 22:00

我也是后期加的多数据源, 分享一下我处理的, 发现有问题的地方 麻烦您也帮忙指导一下http://www.jfinal.com/share/236

热门反馈

扫码入社