2017-10-07 76 views
0

嗨我有一个java程序多线程查询HSQL数据库。我从查询中得到一些非常奇怪的结果,我的猜测是数据库没有设置为同时处理多个查询。 (这甚至可以在数据库中?)。同步数据库查询java

然后我想要做的是排队任何数据库查询。

据我可以告诉这是在我的数据库对象中做功能时使用synchronize关键字完成的?

我的数据库对象看起来是这样的:

public class Database(){ 
    public Database(){ 
     connect(); 
    } 

    private void connect(){ 
     //connect to HSQL database 
    } 

    public void executeOneTypeOfQuery(){ 
     ... 
     ResultSet rs1 = someStatement.executeQuery(); 
     //do something with a query 
    } 

    public void executeAnotherTypeOfQuery(){ 
     ... 
     ResultSet rs2 = anotherStatement.executeQuery(); 
     //do something with a query 
    } 

} 

此刻,我可以在不同的线程同时调用executeOneTypeOfQuery()和executeAnotherTypeOfQuery()的任意组合。

这两个函数应该有synchronized关键字吗?或者只会阻止他们同时调用两次JUST THAT方法?

我在想另一种解决方案可以利用回调(我不太了解这里的语法)吗? 因此,在我的项目中,我调用其中一个数据库函数,我调用一个中间同步函数,说明我真正想使用哪个数据库函数。

所以线程调用是这样的:

public synchronized void executeAnyQuery(Function theFunctionIWantToCall, Object[] args){ 
    //do theFunctionIWantToCall 
} 

这是做正确的方式?如果是的话,回调函数的语法是什么?

+2

你是什么意思与“非常奇怪的查询结果”?问题是缺少一个明确的问题陈述,而你没有告诉任何关于这些查询的性质(他们只是选择或做一些修改数据)。数据库通常支持在_transactions_中分离的并行查询。如果你在内存中运行它,HSQL可能会有点不同。 –

+1

见https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html: > ...使这些方法同步有两个作用: > > *首先,这是不可能的用于对同一对象上的同步方法的两次调用进行交织。当一个线程正在执行一个对象的同步方法时,所有其他线程调用同一对象的同步方法块(挂起执行),直到第一个线程完成对象。 所以它不只是那个方法,它是同一个实例的任何'synchronized'方法。 – lexicore

+0

感谢球员,他们只是SELECT查询,并假设HSQLDB的工作原理就像你说的那样,问题可能不是与数据库对象,但SQL本身......我很确定:/ –

回答

0

synchronized关键字被另一个线程锁定了从接入功能,直到函数结束(虽然它并不能保证胎面将执行不间断)

回调,你会做这样的事情

public class Foo { 
    public static void main(String[] args) { 
     new Foo.doExample(); 
    } 

}