前一段,我们内部系统的一个重要WEB页面报表出现一个怪现象,报表数据不稳定,随时变化,可检查原始数据并没有问题,奇怪,这个报表已经使用三年了怎么才出现这个问题,而且开发报表的人已经不在搞技术了。只好硬者头皮看远程序了,发现这是一个非常复杂的报表,SQL语句也比较复杂,用到多个union语句,为了能提高显示速度,使用的一个中间过渡表,把中间的运算结果放到过渡表中,问题就出现在这个过渡表上,这个表是按照普通表创建的,但起的作用就是存放临时数据,每次执行报表时都是先删除数据,在插入数据,然后在筛选比较后在页面显示出,这似乎也没有什么错,而且以前一直用的很好,测试也没问题,为什么现在会出现上面的问题呢,研究一段后忽然顿悟到程序实现时没有考虑到多用户使用的情况,恰好以前只是一个部门的一个人用这张报表,现在有多个人在用这个报表,问题的确是这样。找到问题根源只是第一步,如何解决呢,大部人自然会想到采用数据库锁,使用数据库事务隔离级别等技术,由于不太精通JDBC这方面的接口实现,还好互联网里蕴藏着无法估量的技术宝藏,有时真感到求人不如求互联网,当然最高境界是求自己。在网上搜索时无意中发现一篇 关于oracle数据库临时表的使用,大受启发,临时表就是解决这个问题的救星,临时表保证每个连接的数据是安全的,独占的,互不影响。开始还只是觉得可行但不敢确信一定能解决问题,使用上临时表后,不仅解决问题还大大提高速度,真是一箭双雕,感慨临时表实现方式的优雅。
解决了这个问题后,我有很多的深思。首先是感谢互联网,感谢oracle,更要感谢分享知识的人,我写这篇文章也是希望能帮助遇到此类问题的人提供一个解决思路。另外有感触程序设计或者说系统设计人员需要更广博的知识,要把握知识的关键点,我以前用过很多次临时表,但都没有去关注临时表的核心价值,需要深刻反省自己。最后就是分析问题的方法,一定要先抓住问题出现的环境,才有利于解决问题。