作者sthermit ( )
看板java
标题[问题] JAVA从DB捞取资料的问题
时间Sat Dec 27 11:51:26 2014
不好意思我又来请教各位
最近开发程式遇到一个bug
可是我想不出来可能的原因,也抓不到重点去google
小弟最近在做一个批价计算系统
设计一个每日累计与每月累计的表格
针对各个使用者累积价钱
流程大概是
有一个定时写入批价系统的表格A
我写的程式也是定时从表格A得取资料进行批价,并且累计在每日与每月的表格
我使用Quartz做排程
每次启动时会从每日与每月的表格读取资料
批价时,有资料就做累计
批完之後更新回资料库
有测试过从开始到及结束更新回资料库都是可以运作的
现在遇到一个bug是
当程式在第一次从DB捞取资料,之後.....完成後
时间到再次的从DB捞取资料,会发生读到的是没有包含第一次累积结果的资料
完全想不到问题在哪,只好来请教各位
在此先感谢大家
-------------
我捞db的CODE
private void setCurrentMap(){
try {
sql=
"SELECT A.IMSI,A.CHARGE,A.LAST_FILEID,A.SMS_TIMES,
A.LAST_DATA_TIME,A.VOLUME,A.MONTH,A.EVER_SUSPEND,
A.LAST_ALERN_THRESHOLD,A.LAST_ALERN_VOLUME "
+ "FROM HUR_CURRENT A "
+ "WHERE A.MONTH IN ('"+sYearmonth+"','"+sYearmonth2+"') ";
Statement st = conn.createStatement();
logger.debug("Execute SQL : "+sql);
ResultSet rs = st.executeQuery(sql);
logger.debug("Set current map...");
while(rs.next()){
Map<String,Object> map=new HashMap<String,Object>();
Map<String,Map<String,Object>> map2=new
HashMap<String,Map<String,Object>>();
String imsi =rs.getString("IMSI");
String month=rs.getString("MONTH");
if(currentMap.containsKey(month)){
map2=currentMap.get(month);
}
map.put("LAST_FILEID", rs.getInt("LAST_FILEID"));
map.put("SMS_TIMES", rs.getInt("SMS_TIMES"));
map.put("LAST_DATA_TIME",
(rs.getDate("LAST_DATA_TIME")!=null?
rs.getDate("LAST_DATA_TIME"):new Date()));
map.put("CHARGE", rs.getDouble("CHARGE"));
map.put("VOLUME", rs.getDouble("VOLUME"));
map.put("EVER_SUSPEND", rs.getString("EVER_SUSPEND"));
map.put("LAST_ALERN_THRESHOLD",
rs.getDouble("LAST_ALERN_THRESHOLD"));
map.put("LAST_ALERN_VOLUME",
rs.getDouble("LAST_ALERN_VOLUME"));
map2.put(imsi, map);
currentMap.put(month,map2);
}
st.close();
rs.close();
} catch (SQLException e) {
logger.error("At setCurrentMap occur
SQLException error", e);
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.132.72.213
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1419652289.A.BCF.html
1F:推 mozzan: 要不要贴一下你捞DB的程式 12/28 09:04
程式码已贴上,排版可能有点伤眼,请见谅
2F:→ DeathWatch: 条件逻辑会不会写错了才捞不到 12/28 11:42
我的条件是依照日期取出,应该不会捞不到
状况是
第一次处理
原始资料 A,A经过处理过後的资料 =>B
时间到再次处理
一样捞取到A,而不是捞取到B
这边感觉到困惑,先感谢两位
※ 编辑: sthermit (220.132.72.213), 12/29/2014 10:44:37
3F:→ ssccg: 老实说看不懂到底你是读哪个table,更新哪个table 12/29 11:42
4F:→ ssccg: 前面说读A,写到每日(B?)和每月(C?) 12/29 11:43
5F:→ ssccg: 下一段变从每日(B?)和每月(C?)读,然後更新回资料库(B,C?) 12/29 11:44
6F:→ ssccg: 如果是前者,那A又没更新? 12/29 11:49
7F:→ ssccg: 如果是後者,"测试过...都是可以运作的"这句,是指你看过 12/29 11:51
8F:→ ssccg: 资料库中的资料在排程执行前後,资料是有变动的? 12/29 11:51
9F:→ ssccg: 然後资料已修改且commit,但select出来是commit前的资料? 12/29 11:53
10F:→ ssccg: 程式码看起来又像有在记忆体留一份资料,所以流程到底是? 12/29 11:55
抱歉,我叙述能力不够好
流程是
从A读出来资料
从B读出资料
从C读出资料
A批价之後累计到B与C
最後更新A批价结果
更新B累计结果
更新C累计结果
有先把资料读出来放到记忆体後再使用
※ 编辑: sthermit (220.132.72.213), 12/29/2014 12:03:15
11F:→ swpoker: 你都说是bug了~那就不关流程的问题~根本就是程式有问题 12/29 15:37
12F:→ swpoker: 把完整的贴出来就知道了~你只贴前面一部分而已 12/29 15:38
13F:→ adrianshum: 这样除非很幸运,不然很难会找到 bug. 建议你找个工具 01/01 07:12
14F:→ adrianshum: (jdbcdslog之类),看看你真正跑的 SQL 和传回的record 01/01 07:13
15F:→ adrianshum: 是不是正确,(我不太相信DB会无故return少了record) 01/01 07:14
16F:→ adrianshum: 先确认问题出来 DB 捞data,还是之後的处理吧. 01/01 07:14