自从添加了次数据源,以前的老接口也报错了

JF版本:4.9.02

    自从添加了次数据源,以前的老接口也报错了,提示主要数据源找不到次要数据源中的表,这是肯定找不到的,只是不知道为什么在数据源A中会找数据源B中的表。

    我是这么用的,主数据源DB.find(...),次数据源DB.use("xx").find(...),主要是这个错误会在服务器启动几个小时以后才会出现,找不出错误原因,有知道的请大家帮忙分析下是什么原因导致

public void configPlugin的代码

DruidPlugin druidPlugin = new DruidPlugin(p.get("connurl"), p.get("username"), p.get("password").trim());
		me.add(druidPlugin);
		ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
		arp.getEngine().setSourceFactory(new ClassPathSourceFactory());//优化上一行  好处是,即便你的模板打包到 jar 包都可以读到
		arp.addSqlTemplate("lejiaInterface.sql");
		arp.addSqlTemplate("admin.sql");
		arp.addSqlTemplate("pc.sql");
		arp.setTransactionLevel(Connection.TRANSACTION_REPEATABLE_READ);//设置默认事务级别
		_MappingKit.mapping(arp);
		arp.getEngine().addSharedMethod(TemplateFn.class);
		
		DruidPlugin druidPluginKC = new DruidPlugin(p.get("connurl_kc"), p.get("username_kc"), p.get("password_kc").trim());
		me.add(druidPluginKC);
		ActiveRecordPlugin arpKC = new ActiveRecordPlugin("kaochang", druidPluginKC);
		arpKC.getEngine().setSourceFactory(new ClassPathSourceFactory());//优化上一行  好处是,即便你的模板打包到 jar 包都可以读到
		arpKC.addSqlTemplate("kaochang.sql");
		com.kaochang.config.model._MappingKit.mapping(arpKC);
		me.add(arp);
		me.add(arpKC);
}
druidPluginKC 是次要


评论区

JJfinal

2020-11-28 15:33

【Caused by: java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'kcmysql.ql_student' doesn't exist】这个地方实际是要用主数据源,但是异常是:次要数据源中找不到主数据源中的表,也就是说主次都弄混了,老接口,一直没动过

杜福忠

2020-11-28 15:59

如果确定是老代码没有改动,以前好使的情况下。
应该是 主数据源 ActiveRecordPlugin 放在了次数据源 ActiveRecordPlugin的后面启动导致的

https://jfinal.com/doc/5-14
注意最先创建的 ActiveRecrodPlugin实例将会成为主数据源,可以省略configName。最先创建的 ActiveRecrodPlugin实例中的配置将默认成为主配置,此外还可以通过设置configName为 DbKit.MAIN_CONFIG_NAME常量来设置主配置。

JJfinal

2020-11-28 16:07

我也想过这个问题
ActiveRecordPlugin arp1 = new ActiveRecordPlugin(druidPlugin);
ActiveRecordPlugin arp2 = new ActiveRecordPlugin("次",druidPlugin);
me.add(arp1 );
me.add(arp2 );
arp1 是主,但是我这配置应该也没问题

JJfinal

2020-11-28 16:10

@杜福忠 我贴了代码 劳烦看一下 感谢

JJfinal

2020-11-28 16:15

@杜福忠 请问如果使用了Kit.MAIN_CONFIG_NAME常量来设置主配置,主数据源仍然可以省略configName吗

JJfinal

2020-11-28 17:17

主数据源配置了DBKit.MAIN_CONFIG_NAME,问题依然存在

杜福忠

2020-11-28 21:13

看配置好像是没毛病,
“服务器启动几个小时以后才会出现” 是什么情况? 本地开发好使,不能重现问题?
得把错误信息帖出来, 看看是哪里的代码,咋写的SQL看下。
可以建一个控制器,单独请求模拟查询看下是不是能重现

JJfinal

2020-11-30 09:02

@杜福忠 一直报这个错误,我把SQL贴出来java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'o.buyer' in 'where clause' SQL:SELECT od.* FROM order_detailed od
LEFT JOIN `order` o ON o.order_id=od.order_id
WHERE o.state=1
AND o.buyer = #para(idstr)
AND (od.deduction * 100) > 0
其中deduction 是字符串的金额格式,这个方法在服务器启动以后短时间内可以正常访问,这里一报错,其他很多查询也会跟着报错找不到表

JJfinal

2020-11-30 09:21

@杜福忠 现在只能每个接口都调一下,看是哪个触发了这个错误

JJfinal

2020-11-30 09:24

@杜福忠 上面贴的SQL语法没有问题,现在能确定错误是因为查询语句运行在另一个库报的错,那个库的从库,而我调查询的方式是主库,这个也是之前的老接口

JJfinal

2020-11-30 09:32

@杜福忠 我用默认的查询主库的方式(即不加configName),系统拿到SQL却是去从库里面查,不知道其他人有没有遇到过这种问题

杜福忠

2020-11-30 09:38

@JJfinal 本地开发好使吗?能不能重现问题?

JJfinal

2020-11-30 11:03

@杜福忠 现在能重现问题了,对从库执行了更新数据的操作之后,再查询主库就会报错,从库中找不到主库的表

JJfinal

2020-11-30 11:15

@杜福忠 估计问题出在 model.save()和 model.update()这里,没有指定数据源,是否子数据源不能直接用update和save

JJfinal

2020-11-30 11:54

@杜福忠 找到问题了 对从库执行save或update方法之后,再调默认的数据源就会报错,但又不是所有主库查询都报错,现在只能把所有的DB. 都要指定数据源,加上use(“默认”)这种方式来改,这样改工作量巨大,不知道改完会不会又有新的问题,还有原先主库的model.save和model.update是不是也要改成model.use("moren").save()

杜福忠

2020-11-30 12:13

@JJfinal _MappingKit.mapping(arp); 和 com.kaochang.config.model._MappingKit.mapping(arpKC); 里面检查检查看看里面是不是 model 注册错了 ? 如果注册正常,是不用加use的, 你可以读一下model的源码,就是因为乱加use导致this.configName值被更改,所以下次查询会去到configName库。

检查_MappingKit里面,是不是有同名的java类名,虽然不同包名,但是代码里面会很容易引用错误。开发者以为用的是A数据源的Model ,实际上代码导入的是B数据源的Model,遇到这样的情况业务,建议最安全的办法就是直接对B数据源的 Model类进行重命名,增加统一前缀,避免下次再有人导入包时倒错了。并且统一代码里面Model不要使用use方法。

杜福忠

2020-11-30 12:18

Db.use 得查下是没有问题的, 应该就是Model那边有find系列查询 才会被切数据源

JJfinal

2020-11-30 12:30

@杜福忠 _MappingKit.mapping(arp); 和 com.kaochang.config.model._MappingKit.mapping(arpKC);两个库有相同的表名,但是字段不一致,可以确定没有注册错误和引错包的可能!改表名可能是最方便的解决办法,但是现在线上在用,还是打算先把所有的连库都加上use,再看是否解决了这个问题

JJfinal

2020-11-30 12:32

@杜福忠 所有的.update()和.save 也都加上.use(DbKit.MAIN_CONFIG_NAME).

杜福忠

2020-11-30 15:17

@JJfinal 业务层的代码,报错的那个类方法里面 Model没有引用错误吗? 有用到 dao 对象的没?查询用的是Model实例化的dao吗?

热门反馈

扫码入社