2017-10-07 5 views
0

こんにちは私は、HSQLデータベースを照会する複数のスレッドを持つJavaプログラムを持っています。私はクエリからいくつかの非常に奇妙な結果を得ていると私の推測は、データベースが同時に多くのクエリを処理するように設定されていないということです。 (これはデータベースでも可能ですか?)データベースクエリを同期するjava

私がしたいことは、データベースクエリをキューに入れることです。

私の知る限り、これはデータベースオブジェクトに関数を作成するときにsynchronizeキーワードを使って行いますか?私は別のスレッドで同時にexecuteOneTypeOfQuery()とexecuteAnotherTypeOfQuery()の任意の組み合わせを呼び出すことも現時点で

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 
    } 

} 

私のデータベースオブジェクトは、次のようになります。

これらの2つの関数はsynchronizedキーワードを持つべきですか?それとも、それは同時に2回の方法だけを呼び出すことを止めるでしょうか?

私は別の解決策がコールバックを使用していると思うのですが(私は本当にここでの構文を理解していません)? 私はこれらのデータベース関数のいずれかを私のプロジェクトのどこでも呼び出すので、私は実際に使用したいデータベース関数を示す中間同期関数を呼び出します。

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

これはそれを行うための正しい方法です:

ので、スレッドのような何かを呼び出しますか?もしそうなら、コールバックを持つ構文は何ですか?コールバックの

+2

「クエリの非常に奇妙な結果」とはどういう意味ですか?質問には明確な問題文がありません。これらのクエリの性質については何も教えていません(SELECTだけであるかデータを変更するのか)。一般的に、データベースは_transactions_で分離された並列クエリをサポートしています。 HSQLは、メモリ内で実行している場合、ここでは少し異なるかもしれません。 –

+1

はhttps://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.htmlを参照してください: > ...これらの方法は、同期する2つの効果があります> > *まず、それは不可能ですインターリーブする同じオブジェクト上の同期メソッドの2回の呼び出しに対してあるスレッドがオブジェクトの同期メソッドを実行しているとき、そのオブジェクトで最初のスレッドが完了するまで、同じオブジェクトブロックの同期メソッドを呼び出す他のすべてのスレッド(実行を中断)。 これはまったく同じメソッドではなく、同じインスタンスの 'synchronized'メソッドです。 – lexicore

+0

おかげで、それらはSELECTクエリだけで、HSQLDBがあなたのように動作していると仮定した場合、問題はおそらくデータベースオブジェクトではなくSQL自体であると私は確信していました:/ –

答えて

0

機能が終了するまで(それはトレッドが中断されずに実行される保証するものではありませんが)synchronizedキーワードが別のスレッドによるアクセスから機能をロック

、あなたはこの

public class Foo { 
    public static void main(String[] args) { 
     new Foo.doExample(); 
    } 
ような何かをするだろう

}