2011-11-09 2 views
0

내 응용 프로그램에서 데이터베이스를 사용하고 있습니다. 예를 들어 응용 프로그램이 시작될 때 두 개의 스레드가 데이터베이스에 액세스 할 때와 같이 동 기적으로 데이터베이스에 액세스해야하는 요구 사항이 있습니다. 어떻게이 상황을 피할 수 있습니까? 방법 상기동기화 된 데이터베이스 액세스

private synchronized Database accessDB() 
{ 
    Database dbObj = null; 
    try { 
_uri = URI.create(dbLocation + DB_NAME); 
try { 
dbObj = DatabaseFactory.openOrCreate(_uri, new DatabaseSecurityOptions(false)); 
System.out.println("Database Created"+_dbTopNews); 
    } catch (ControlledAccessException e) { 
      // TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (DatabaseIOException e) { 
// TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (DatabasePathException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

} catch (IllegalArgumentException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
    } catch (MalformedURIException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return dbObj; 
} 

TE 디버깅 리턴 제 스레드 반대하면되지만 두 번째 스레드가 액세스 될 때 널 (null)을 반환

AY 일반적

+0

다음 번에는 제목에 capslock이 필요하지 않습니다. –

+0

Thomas Jungblut, 고맙습니다. 많은 친구, 제 마음 속에 유지해야 할 것이 하나도 없습니다. D – ayachama

답변

3

, 따라서 이렇게 두 가지가되는 당신은 고립되어 있습니다.

1 : 트랜잭션. 이렇게하면 데이터베이스의 작업이 격리됩니다. 예를 들어, 한 번에 하나의 스레드 (세션)만이 테이블이나 행을 변경할 수 있습니다.

2 : 동기화. 멀티 스레드 환경에서 스레드 동시성을 처리하는 Java의 메소드입니다. 동기화 (및 "잠금") 기능을 사용하면 코드 섹션을 분리하여 한 번에 하나의 스레드 만 실행할 수 있습니다.

제공하신 정보가 더 구체적이지 않습니다.

+0

답답함을 보내 주셔서 감사합니다. 큰 도움이되었는데, 제 설명의 성격을 사과해야합니다. 이 처음으로, 그래서 내 관점에서 제대로 넣을 수없는, 데이터베이스 개체에 액세스하기위한 동기화 구현하려고합니다. – ayachama

+0

2 개의 스레드, 스레드 1과 thread2가 있습니다. Thread1은 xml을 구문 분석하고 새 DATABASE1을 openorcreate하고, table1에 작성하고 삽입하며 thread2는 DATABASE1을 열고 table2에 삽입합니다. – ayachama

+0

스레드가 다른 테이블에 삽입하는 경우 어쩌면 동기화 할 필요가 없습니다 – pap