我有一个应用程序需要从数据库中的表中了解最新数量的某些记录,该解决方案应该适用而无需更改数据库代码或添加触发器或函数,因此我需要一个独立于数据库供应商的解决方案。 我用java编写的程序,但数据库可能是(SQLite,MySQL,PostgreSQL或MSSQL),现在我这样做: 在一个设置为守护进程的单独线程中,我的应用程序通过JDBC向数据库发送一个简单的命令,以便知道具有以下条件的最新记录数:
while(true){
SELECT COUNT(*) FROM Mytable WHERE exited='1'
}
这种编码导致DATABASE锁定,减慢整个系统并生成巨大的DB日志,最终导致整个事情! 我怎么能以正确的方式做到总是拥有最新数量的某些记录,或者仅在数字改变时计算?
答案 0 :(得分:2)
评论太长了。
SELECT
语句本身不应该具有您描述的行为。例如,SELECT
没有记录任何内容。现在,有可能会发生并发insert
/ update
/ delete
语句,并且这些语句会导致问题,因为SELECT
会锁定表。
你可以做的两件事:
exited
是一个数字,请不要使用单引号(混合类型可能会混淆某些数据库)。(exited)
上创建索引。在基本上所有数据库中,这是一个命令:create index idx_mytable_exited on mytable(exited)
。如果锁定和并发事务是一个问题,那么您将需要执行更多特定于数据库的事情,以避免该问题。
答案 1 :(得分:1)
正如其他人所说,请确保退出已编入索引。
此外,您可以在查询中设置事务隔离以执行“脏读”;这向数据库服务器指示您不需要等待其他进程的事务提交,而是希望读取那些其他进程正在更新的行的当前退出值。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED是使用“脏读”的标准语法。