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
}
这是做正确的方式?如果是的话,回调函数的语法是什么?
你是什么意思与“非常奇怪的查询结果”?问题是缺少一个明确的问题陈述,而你没有告诉任何关于这些查询的性质(他们只是选择或做一些修改数据)。数据库通常支持在_transactions_中分离的并行查询。如果你在内存中运行它,HSQL可能会有点不同。 –
见https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html: > ...使这些方法同步有两个作用: > > *首先,这是不可能的用于对同一对象上的同步方法的两次调用进行交织。当一个线程正在执行一个对象的同步方法时,所有其他线程调用同一对象的同步方法块(挂起执行),直到第一个线程完成对象。 所以它不只是那个方法,它是同一个实例的任何'synchronized'方法。 – lexicore
感谢球员,他们只是SELECT查询,并假设HSQLDB的工作原理就像你说的那样,问题可能不是与数据库对象,但SQL本身......我很确定:/ –