2014-01-28 6 views
0
public class Database { 

    private String ric; 
    private String volume; 

    private String _url; 
    private String _userId; 
    private String _password; 
    private String _dbLib; 
    private String _dbFile; 
    private Connection _conn; 
    private PreparedStatement _statement; 

    public Database(LSE item) { 
     ric = item.get_ric(); 
     volume = item.get_volume(); 
    } 

    public void writeToDb() throws SQLException{ 
      //setString   
    } 
} 

나는 ItemDispatcher 클래스가 데이터베이스 연결을 만들 : 반복 ItemDispatcher 실행에한 번만

public class ItemDispatcher implements Runnable { 

    private LSE lse; 

    public ItemDispatcher(LSE lseItem) { 
     this.lse= lseItem; 
    } 

    @Override 
    public void run() { 
     try { 
      new Database(lse).writeToFile(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

run() 방법. 데이터베이스 연결을 만들고 Database 클래스에 prepareStatement을 만들고 싶지만 데이터베이스 클래스 생성자에서이 작업을 수행하면 여러 번 연결이 생성됩니다. run()을 실행할 때마다 연결을 단 한 번만 만들고 다시 반복하지 않도록 디자인을 변경하는 방법은 무엇입니까? 다른 클래스에서는이 작업을 수행하지 않으려 고합니다. 데이터베이스 클래스

답변

0

Singleton pattern을 사용하십시오. 이렇게하면 데이터베이스 연결 인스턴스를 하나만 가질 수 있습니다. 예를 들어 코드를 촬영 ,이 같은 것 :

public class Database { 

private String ric; 
private String volume; 

private String _url; 
private String _userId; 
private String _password; 
private String _dbLib; 
private String _dbFile; 
private Connection _conn; 
private PreparedStatement _statement; 
private static final Database INSTANCE; 

private Database(LSE item) { 
    ric = item.get_ric(); 
    volume = item.get_volume(); 
} 

public static final Database getInstance(LSE item) { 
    if (INSTANCE == null) { 
     INSTANCE = new Database(LSE item); 
    } 

    return INSTANCE; 
} 

public void writeToDb() throws SQLException{ 
     //setString   
} 
} 

응용 프로그램 스레드 (동시성)를 사용할 경우, 나는, 당신은 또한 이러한 상황에 대한 귀하의 싱글을 준비하는 것이 좋습니다 see this question

+0

사용자의 접근 방식에서는 ItemDispatcher 인스턴스가 하나만 있다고 가정합니다. –

+0

@codenoire, 그는 ItemDispatcher를 계속 전달할 수 있습니다. 단, ItemDispatcher의 인스턴스가 하나만 있다고 가정하는 것이 아니라 연결의 인스턴스 하나입니다. – Leo

+0

디스패처의 두 인스턴스가 단일 데이터베이스 연결을 공유하는 확장 가능한 응용 프로그램을 구축하지 못할 수도 있습니다. 두 번째 사람은 거래와 같은 일을해야합니다. 싱글 톤은 응용 프로그램 전체에 적용됩니다. 이것은 실제로 OP가 요구하는 것 이상입니다. *** 인스턴스 ***의 범위 내에서 run 메소드를 요청하여 하나의 데이터베이스 연결을 사용합니다. –

0

마 Database 클래스 내의 정적 블록

static { 

} 

그러나 이는 Connections 및 Statement가 정적이어서 데이터베이스의 모든 인스턴스에서 공유 함을 의미합니다. 그냥 다른 SO 포스트에서 예를 들어

: ItemDispatcher의 범위 내

public static final Map<String, String> initials = new HashMap<String, String>(); 
static { 
    initials.put("AEN", "Alfred E. Newman"); 
    // etc. 
} 
0

는 입력 데이터베이스의 개인 변수 X를 선언합니다. 별도의 메서드 (최상) 또는 생성자 (괜찮을 수도 있음)에서 초기화 할 수 있습니다. 메서드 에서 새 인스턴스를 만드는 대신 사설 변수 X를 사용하십시오.