2017-10-07 6 views
0

안녕하세요, 나는 여러 스레드가 HSQL 데이터베이스를 쿼리하는 자바 프로그램이 있습니다. 나는 매우 이상한 결과를 쿼리에서 얻고있다. 그리고 나의 추측은 데이터베이스가 많은 쿼리를 동시에 처리하도록 설정되어 있지 않다는 것이다. (데이터베이스에서도 가능합니까?).데이터베이스 쿼리를 동기화하십시오.

내가하고 싶은 것은 모든 데이터베이스 쿼리 대기열입니다.

필자는 데이터베이스 개체에 함수를 만들 때 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 
    } 

} 

:

내 데이터베이스 개체는 다음과 같이 보인다.

두 함수에 synchronized 키워드가 있어야합니까? 아니면 그저 그 같은 방법을 두 번 동시에 호출하는 것을 멈출 것입니까?

다른 해결책이 콜백을 사용할 수 있다고 생각합니까? (저는이 구문을 실제로 이해하지 못합니다)? 그래서 내 프로젝트에서 어디서나 데이터베이스 함수 중 하나를 호출합니다. 중간 동기화 함수를 호출하여 실제로 사용하려는 데이터베이스 함수를 알려줍니다.

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를 참조하십시오 이> 가> * 첫째, 수 없습니다 : 을> ... 동기화 이러한 방법을 두 가지 효과가 있습니다 인터리브 (interleave)하는 동일한 객체에 대한 동기화 된 메소드의 두 번 호출 한 스레드가 객체에 대해 동기화 된 메소드를 실행할 때 첫 번째 스레드가 객체로 완료 될 때까지 동일한 객체 블록 (실행 중단)에 대해 동기화 된 메소드를 호출하는 다른 모든 스레드. 그냥 그 방법이 아니에요, 그것은 같은 인스턴스의 어떤'synchronized' 메소드입니다. – lexicore

+0

고마워요, 그들은 단지 SELECT 쿼리이고 HSQLDB가 작동한다고 가정하면 문제는 데이터베이스 객체가 아니라 SQL 자체 일 것입니다 ... 저는 확신했습니다 :/ –

답변

0

은 동기화 된 키워드는이

public class Foo { 
    public static void main(String[] args) { 
     new Foo.doExample(); 
    } 
같은 일을 할 것, 펑션이 종료 될 때까지 다른 스레드에 의해 액세스의 기능을 잠금

}