关于servlet获取请求 但是执行两次sql访问的bug
1 在项目中,客户调用接口 发送两次请求,但是参数不一样 依次放松 数据访问应该依次运行,但是 sql语句却并行执行的问题
在程序中 我也做了唯一校验,即数据库中有相同记录,就执行更新操作 而不是执行插入操作。但是这次似乎插入的时候 就直接插入了两条。
在后台日志中 正确的应该是这样的:
获取每个请求,及对应的值:i.ebelter.com
获取每个请求,及对应的值:42.121.59.208
获取每个请求,及对应的值:42.121.59.208
获取每个请求,及对应的值:close
showAdvice=true
showResult=true
count:68
获取userId的用户信息:sql检验sql的执行次数:SELECT USER_NAME,SEX,AGE,HEIGHT,WEIGHT,PROFESSION,REGION,SERIALNUMBER,DISEASEHISTORY FROM `belter_userinfo` t WHERE t.`USER_ID`='1754188'
获取每个请求,及对应的值:i.ebelter.com
获取每个请求,及对应的值:42.121.104.92
获取每个请求,及对应的值:42.121.104.92
获取每个请求,及对应的值:close
showAdvice=false
showResult=false
count:69
获取userId的用户信息:sql检验sql的执行次数:SELECT USER_NAME,SEX,AGE,HEIGHT,WEIGHT,PROFESSION,REGION,SERIALNUMBER,DISEASEHISTORY FROM `belter_userinfo` t WHERE t.`USER_ID`='1754188'
search_sql:select count(id) from belter_weight where USER_ID='1754188' and TEST_DATE='2013-03-14 12:37:17' limit 1
res:0
insert+search_sql:insert into belter_weight (USER_ID, WEIGHT, HEIGHT,SHAREID,TEST_DATE) values('1754188', 69.199997, 170.000000, '0','2013-03-14 12:37:17')
search_sql:select count(id) from belter_weight where USER_ID='1754188' and TEST_DATE='2013-03-14 12:37:17' limit 1
res:0
insert+search_sql:insert into belter_weight (USER_ID, WEIGHT, HEIGHT,SHAREID,TEST_DATE) values('1754188', 69.199997, 170.000000, '0','2013-03-14 12:37:17')
SELECT USER_NAME,SEX,AGE,HEIGHT FROM belter_userinfo WHERE USER_ID='1754188'
sex: 0weight: 69.2height: 170.0score:90.0
而有时候确实这样的
获取每个请求,及对应的值:i.ebelter.com
获取每个请求,及对应的值:42.121.59.208
获取每个请求,及对应的值:42.121.59.208
获取每个请求,及对应的值:close
showAdvice=true
showResult=true
showAdvice=false
showResult=false
获取userId的用户信息:sql检验sql的执行次数:SELECT USER_NAME,SEX,AGE,HEIGHT,WEIGHT,PROFESSION,REGION,SERIALNUMBER,DISEASEHISTORY FROM `belter_userinfo` t WHERE t.`USER_ID`='1754188'
res:0
insert+search_sql:insert into belter_weight (USER_ID, WEIGHT, HEIGHT,SHAREID,TEST_DATE) values('1754188', 69.199997, 170.000000, '0','2013-03-14 12:37:17')
res:0
insert+search_sql:insert into belter_weight (USER_ID, WEIGHT, HEIGHT,SHAREID,TEST_DATE) values('1754188', 69.199997, 170.000000, '0','2013-03-14 12:37:17')
这种问题 是服务器端问题 还是客户端问题了。
发现在第一次插入后,res没有及时更新 。
这个问题 最终被我解决了 开始认为是并发问题 所谓并发是不同的线程干同一件事情或者是同时操作一个对象等等 但是这里不是 只是;两个请求
这两个请求 只有两个参数不同 第一个请求发了后 其中的一个参数是showAdvice是true,这个变量设置为成员变量,第二个请求中 showAdvice是false,这样第一个请求中的参数值就变为false 按照程序逻辑 执行了两次插入操作。
之后修改为 将成员变量showAdvice 设置为方法内部的临时变量,作用域就仅仅在此方法内,使得第二次请求无法修改第一次请求的showAdvice变量
这样就解决了问题
开始的时候我想 第二次请求发来的时候 第一次请求就结束了 这次看来似乎没有那么快,本地测试是好的,在服务器上就不行,通过打印日志记录,才分析出这些问题。前段时间接手这个bug的时候 总认为解决了这个 自己肯定逆天 小小的得意一把 。有点忘性 哈哈 兴奋中