我需要在多线程应用程序(非分布式)中的一个表上执行数据库查询(SELECT,INSERT)。这是一个场景:
每一行必须是唯一的,因此线程必须逐个执行此方案。解决方案必须适用于各种数据库服务器(Oracle,MSSQL,Postgres)
到目前为止,我有两种方法。 一个是数据库级别。我使用锁定表(ORACLE)或行(MSSQL)。它工作正常,但每个db我都不喜欢它的样板代码。
MSSQL:SELECT data ... with(xlock,ROWLOCK)
ORACLE:锁定表TBL1处于独占模式... SELECT data ...
第二种方法是在应用程序级别,我有
private static Object lock = new Object(); void execute() { synchronized(lock){ //perform DB SELECT data calculate(data);// eg.: data++; //perform DB INSERT data } }
它只是工作,但我想知道这第二种方法是否公平/正确吗?
答案 0 :(得分:0)
它会正常工作。我的意思是,如果只是看它,它是否比数据库快很难说。你应该运行一些基准测试!在我看来,你应该使用数据库方法,如果其他应用程序需要运行相同的代码,在多应用程序级别,同步方式将无法正常工作。