曾经发生在身边开发过程中的灵异事件
这些年的开发过程中,稀奇古怪的问题没少遇到。所谓常在河边走,早晚遇见鬼。
举几个例子,当年用IP卡打电话太多太勤,竟然有好几次在打完电话之后,发现卡上的余额一点没少!肯定是电信的计费系统有问题,哼哼,被他们剥削了这么久,占他们一点便宜也心安理得!听说现在经常还有个人银行卡莫名其妙多钱少钱的事情,觉得银行的系统也不过尔尔。
分享几个我曾经遇到的几个怪问题,比较有难度和迷惑性。可有同道也遇到过类似的奇怪问题?
动用你智慧的大脑,先分析一下这几个事件的原因。稍后我会给出最终的解决方式,但不一定是正确的和最好的。集思广议先。
问题一、客户无法登录系统
貌似,这不能称得上是一个问题吧?按常理,无法登录,那肯定server端出问题了,或者是程序,或者是数据库。再不济,也是客户自己的原因。
话说在2002年的某一天,公司网站(apache+php)出现了全国约一半的用户无法登录的情况,输完用户名和密码就报“该页无法显示”(恨人啊,你要再说得详细点也好),但是在我们公司内部,是可以正常登录的。不能登录的用户分布在全国各个地区,但不解的是,在同一个地区,竟然也有部分用户能登录部分不能登录的情况。这是怎么回事?大家都是一头雾水。要说server端有问题吧,又有一半的用户能登录。要说那一半不能登录的用户客户端或网络的问题吧,可是他们的情况不一,分散全国各地,怎么会这么巧合呢?再说B/S结构,客户就是只需要浏览器的嘛。
亲自到北京的一个客户那里去,在他们的电脑上试了一下,还真是报这样的错误(试着登录了几十次,竟然有一次还登录成功了,怪)。
why??
问题二、数据库事务部分失效
一个系统中有一个数据导入的模块,一直运行得很正常很正常。突然有一天,客户反映最近有一部分数据经常丢失,导不进去。甚为惊讶,不应该啊,我们是开启了事务的,要导就全导进去,或者全部无法导入,怎么会出现只导入一部分数据的情况呢?而且,把数据拿到我们这边的测试环境中,一点问题也没有啊。只好亲自到客户那边,自己一试,还真是会少一部分数据。而且每次少的数量都不一样,就是没有一次全部导入的!
检查代码,事务开启/执行sql/提交/回滚,没问题。
在运行过程中跟踪每一条导入数据的sql语句,没有发现哪一条sql报错。最后也正常执行了commit。
把所有的sql打印出来,统一放到sql客户端去手工执行,数据全部导入,一条不少!
代码也没问题,sql也没问题,事务也没问题,那问题还是出现了,why??
[数据库是sqlserver2000]
问题三、系统的查询统计速度极慢
一个决策支持系统,主要做统计分析,数据量虽然很大(10几个G),但运行得一直很稳定,速度也还不错。但突然有一天,客户反映统计分析的速度变得极慢,慢到无法使用。
到现场,代码没问题,并且一直没动过。那就处理数据库吧,重建索引,不行;重新部署安装环境,不行;重新安装sql server,不行。
把统计分析的代码取出来,到sql客户端执行,速度挺快的嘛!为什么同样的代码,在程序里执行就那么慢呢?
why??
[数据库是sqlserver2000]
问题四、表单信息无法提交
由于客户众多(几万家),所以报的错也是五花八门。
有一个表单提交(post),有很多小数据项,大概有三四十项的数据吧。提交后台保存,一般都没什么问题。但是就是有几个客户反映,他们一提交,后台程序就报错(前台javascript并没报错),提示他们要先输入数据。我们这边做测试,填入和客户一模一样的数据,不报错啊!怎么回事?
好多人对这个问题乱猜啊,一看就知道缺少SQL Server应用经验,否则是不会不知道的或者没遇到过的。包括我挺佩服的ajoo,趁这个机会BS一下你
我还真是没有完全弄明白这是怎么回事.cursor也是有可能的,反正app发过来得都是opencursor的命令.
我能确信的就两点:
1.app过来的query plan确实很傻.
2.重建统计就解决了问题.
jobs知道这个问题的答案,何不分享出来?功德无量地!(btw, 我还是有sql server的使用经验地.google group也查了,没找到答案.于是也只知道乱猜)
好多人对这个问题乱猜啊,一看就知道缺少SQL Server应用经验,否则是不会不知道的或者没遇到过的。包括我挺佩服的ajoo,趁这个机会BS一下你
我本人不是专业DBA,所以没有做过深入的数据库研究。另外本公司的DBA水平也不太强。
想到点什么,顺便再补充一点,由于这个系统主要的工作是统计分析,因此在应用中用到了大量的临时表操作,临时表在统计结束后,会被删除。那是否会是由于经常创建和drop临时表,而导致的opencursor问题呢?
PS:临时表的空间都不会大,主要作用是提高运算速度。
40 楼 LucasLee 2006-10-30 猜测可以,但不要把不确定的结论当作确定的来说。
否则容易误导别人。 41 楼 mayu 2006-10-30 估计你们的测试没有完全走通吧?