配置多数据源后Db.update的tablename错误

主数据库hefei_energy_consumption_monitor

副数据库hefei_energy

两张表都存在tb_alarm_record

使用db.update在服务器上报错

com.jfinal.plugin.activerecord.ActiveRecordException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hefei_energy_consumption_monitor.hefei_energytb_alarm_record' doesn't exist
	at com.jfinal.plugin.activerecord.DbPro.update(DbPro.java:313)
	at com.jfinal.plugin.activerecord.DbPro.update(DbPro.java:324)
	at com.jfinal.plugin.activerecord.Db.update(Db.java:260)
	at com.hhubrain.energy.model.AlarmRecord.updateAlarmRecordOnlyDurationMin(AlarmRecord.java:233)
	at com.hhubrain.energy.service.SwitchAlarmService$4.run(SwitchAlarmService.java:483)
	at com.jfinal.plugin.activerecord.DbPro.tx(DbPro.java:770)
	at com.jfinal.plugin.activerecord.DbPro.tx(DbPro.java:807)
	at com.jfinal.plugin.activerecord.Db.tx(Db.java:533)
	at com.hhubrain.energy.service.SwitchAlarmService.terminateAlarmRecord(SwitchAlarmService.java:479)
	at com.hhubrain.energy.service.SwitchAlarmService.switchAlarmUpgrade(SwitchAlarmService.java:419)
	at com.hhubrain.energy.service.SwitchAlarmService.switchAlarmMonitor(SwitchAlarmService.java:172)
	at com.hhubrain.energy.job.EveryFiveMinJob.alarmJob(EveryFiveMinJob.java:69)
	at com.hhubrain.energy.job.EveryFiveMinJob.run(EveryFiveMinJob.java:28)
	at it.sauronsoftware.cron4j.RunnableTask.execute(Unknown Source)
	at it.sauronsoftware.cron4j.TaskExecutor$Runner.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
使用dao.findById和打印sql都是正常的
{alarm_name:一级开关全局报警定义, eid:92BF64352A0501C9E055000000000001, peid:196, level:1, alarm_time:2020-05-28 19:50:00.0, is_global:1, process_user:null, ptype:1, type:1, f_type:0, duration_min:0, update_time:2020-05-28 19:50:00.0, alarm_type:1, alarm_content:手动喷漆线1#运行,手动喷漆线1# 废水+废气处理未运行, id:15056, did:1, status:1, cid:196}
UPDATE tb_alarm_record SET duration_min = '340',update_time='2020-05-29 01:30:00',status='3' WHERE id = '15056'

但是使用update就会报上面的错

Table 'hefei_energy_consumption_monitor.hefei_energytb_alarm_record' doesn't exist

tablename前会加上副数据库名

评论区

JFinal

2020-05-29 11:43

jfinal 本身的行为并不是这样的,估计你们改过代码,或者 sql 写得不对

建议单步调试跟踪一下,看是哪个环境出现的问题

黑猫惊涨

2020-05-29 12:29

Db.user("")这里?你把具体代码贴出来,我以前遇到过这个问题

tyroxyz

2020-05-29 14:22

@黑猫惊涨 String selectSql = String.format("UPDATE %s SET duration_min = '%s',update_time='%s'", TABLE_NAME, durationMin, DateUtil.formatDate(nowDate));
if (0 < status) {
selectSql += String.format(",status='%s'", status);
}
selectSql += String.format(" WHERE id = '%s'", alarmRecordId);
updateRes = Db.update(selectSql);
直接用的是db

tyroxyz

2020-05-29 14:33

@JFinal 本地运行没问题,放在服务器就出错了,环境配置都一样的,而且model.save()也可以用,就是使用db操作会报错

JFinal

2020-05-29 14:36

@tyroxyz 直接拼 sql 是极度危险的,有被 sql 注入的风险,像下面这样使用:
String sql = "UPDATE #(table) SET duration_min = #para(durationMin) ,update_time=#para(updateTime) ... #if ( 0 < status) #para(status) #end ";

Kv kv = Kv.by("table", 表名).set("durationMin", durationMin).....;
updateRet = Dao.templateByString(sql, kv).update();

也就是说,在 java 代码中可以使用 String 变量的形式来使用 sql 模板,极度方便

JFinal

2020-05-29 14:38

回到你的碰到的问题本身,我建议你远程调试一下:
https://jfinal.com/feedback/5106
https://jfinal.com/share/1528

tyroxyz

2020-06-01 21:21

@JFinal 波总,debug服务器上发现警告信息
table.modelClass.classLoader=Cannot find local variable 'table'

JFinal

2020-06-01 21:23

@tyroxyz 可能是你数据库配置的问题,这个警告信息与你自己的代码应该没啥关系

jfinal 也不会输出这类信息