我使用resin3.0.18, jdk1.5.0,数据库是mysql server5.0,使用了连接池,jdbc驱动是mysql-connector-java-5.0.3-bin.jar,数据insert,select都使用了preparedstatement. 其中有这么一个模块,类似论坛的东西:发文章,然后察看章列表界面。理论上每增加一篇文章之后刷新文章列表应该出现最新的文章名。 事实上出现的问题让我不解: 
每次发完文章之后,我去反复刷新文章列表页面,发现并不是每次刷新的结果都是最新的文章列表,我检查过数据库,数据库里的数据并没有错乱,是正常的(也就是说insert事务都已经正常提交)。 
首先怀疑是浏览器缓存的问题,加了防止浏览器缓存的语句,发现无效。 
后来追踪每次查询使用的数据库连接的id(这个id指池中连接的数组索引),池中20个连接,发现当用到同一个id的数据库连接查询出来的数据是一样的。打个比方来形容一下,某次查询用到连接1,出来数据是“A,B,C”,某次查询用到连接2,可能结果就是“A,B,C,D”,当再次刷新或许再次碰巧用到连接1,那么结果还是“A,B,C”,而用到2结果就是“A,B,C,D” 
我怀疑是否数据库连接中使用到的游标没有被关闭。接下来查jdbc的文档,发现在preparestatement时候可以设置参数使得游标在commit时候关闭,于是再试,还是没有用。 我知道preparedstatement可以预编译语句,但没有听说可以缓存数据的。 于是又怀疑到是否resin3有了新的特性,于是将resin退回到2.0,发现问题还是存在。 感觉以前使用resin2,jdk1.4,同样的连接池的时候从来没有发现过这个问题,所以我决定再去尝试将jdk退到1.4再试。明天再试试看。 目前看起来这是数据似乎是被缓存下来了,而且和数据库连接相关。哪位仁兄可以帮忙解惑一下?非常感激!

解决方案 »

  1.   

    问题已经解决。但是根本原因没有找到。
    感觉是连接池的问题。这个连接池是原来我在jdbc2环境下用的,那时候没有出现现在遇到的问题。
    现在使用了jdbc3以后,驱动也变了,就出现了这个问题。其实在这个连接池中,对于resultset,preparedstatement,connection我都是很谨慎的,都会在finally中去关闭以上3个对象,可就是不知道为什么还是会出现那样的的问题。迫于进度的压力,我换了连接池,使用了connector j中的连接池,问题解决了。如果有朋友对这方面有心得的话,非常希望能站出来解释一下根源的问题。谢谢