最近开发时碰到了一个奇怪的现象:使用多线程对同一张表每秒查询一次,但是只有程序刚起来的时候查询的第一次可以查询到最新结果,之后怎么改表里的数据,查询出的结果都跟之前一样。
由于创建连接比较消耗时间和系统资源,这个程序又不能用数据库连接池,我每个线程都只维护一个connection连接,当这个连接失效或为空的时候,再重新获取一个。
之前我一直怀疑是同一个连接如果不每次关闭,就无法查询出同一个sql语句执行的最新结果。直到同事帮我看过代码之后。才发现。原来是我这一个线程的唯一连接除了查询还执行了update操作,设置了手动提交conn.setAutoCommit(false)。所以在第二次执行的时候这个连接的所有操作都需要进行手动提交conn.commit()才能查询出结果。
最后我去掉了手动提交的设置,改为自动提交。这个bug就解决掉了。