2013-01-23 2 views
0

내 디자인에 다음과 같은 것이라고 의견을 수행하는 자바 프로그램 작성했습니다 : CSV 파일에서이 데이터베이스 덤프 설계가 정상입니까?

  1. 읽기 데이터를. 이 파일은 6 개의 열이있는 데이터베이스 덤프입니다.
  2. MySQL 데이터베이스 테이블에 데이터를 씁니다. 다음과 같이

데이터베이스 테이블은 다음과 같습니다

CREATE TABLE MYTABLE 
    (
    ID int PRIMARY KEY not null auto_increment, 
    ARTICLEID int, 
    ATTRIBUTE varchar(20), 
    VALUE text, 
    LANGUAGE smallint, 
    TYPE smallint 
    ); 
  1. 내가 각 행을 저장하는 객체를 만들었습니다.
  2. OpenCSV를 사용하여 각 행을 1에서 생성 된 개체 목록으로 읽습니다.
  3. 개체 목록을 반복하고 PreparedStatements를 사용하여 각 행을 데이터베이스에 씁니다.

솔루션은 요구 사항의 변화에 ​​매우 적절해야하며 좋은 접근 방식, 견고성 및 코드 품질을 입증해야합니다.

디자인이 괜찮습니까?

내가 시도한 또 다른 방법은 'LOAD DATA LOCAL INFILE'SQL 문을 사용하는 것이 었습니다. 그게 더 나은 선택일까요?

편집 : 이제 OpenCSV를 사용하고 있으며 실제 필드 안에 쉼표가있는 문제를 처리하고 있습니다. 이제 문제는 DB에 쓰는 것이 아닙니다. 아무도 그 이유를 말할 수 있습니까?

public static void exportDataToDb(List<Object> data) { 
    Connection conn = connect("jdbc:mysql://localhost:3306/datadb","myuser","password"); 

    try{ 
     PreparedStatement preparedStatement = null; 
     String query = "INSERT into mytable (ID, X, Y, Z) VALUES(?,?,?,?);"; 
     preparedStatement = conn.prepareStatement(query); 

     for(Object o : data){ 
      preparedStatement.setString(1, o.getId()); 
      preparedStatement.setString(2, o.getX()); 
      preparedStatement.setString(3, o.getY()); 
      preparedStatement.setString(4, o.getZ()); 
     } 
     preparedStatement.executeBatch(); 

    }catch (SQLException s){ 
     System.out.println("SQL statement is not executed!"); 
    } 
} 
+2

바퀴를 다시 한번 재 활성화하십시오. MySQL은 CSV 데이터를 직접 가져올 수 있습니다. http://stackoverflow.com/questions/3025648/import-csv-to-mysql CSV를 데이터베이스로 가져 오기 위해 한 줄의 Java 코드를 설정하는 이유는 없습니다 ... – feeela

+0

@feeela이 작업은 업무용 응용 프로그램입니다. 귀하의 제안으로 인해 코딩 기술을 보여줄 수 없거나 외부 도구에 대해 알고 있다는 것을 보여줄 수 있습니까? – TheCoder

+0

원본 파일의 (대략적인) 예상 크기는 얼마입니까? – RandomSeed

답변

1
순수 알고리즘 관점에서

및 소스 CSV 파일이 작은 경우를 제외하고, 더 나은에

  1. 트랜잭션
  2. 부하를 시작
  3. 하여 삽입 문을 준비하는 것이 하나 (또는 몇 줄)
  4. 작은 배치를 데이터베이스에 삽입하십시오.
  5. 3으로 돌아갑니다. NES 메모리에 전체 덤프를로드하지 않도록,

이 방법을 커밋 remainig.

하지만 기본적으로 LOAD DATA을 사용하는 것이 좋습니다.

+0

나는 LOAD DATA 경로를 내려 가고있다. 내 문제는 이제 응용 프로그램이 테이블에 여분의 행을 삽입한다는 것입니다. CSV 파일에없는 행 왜 이런 일이 일어나는 지 아십니까? 나는 그것이 ID 필드의 자동 증가와 관련이 있다고 생각한다. – TheCoder

+0

@ user999353 불필요한 행이 비어 있으면 행 끝 ('LINES TERMINATED BY' 절로 정의)에 문제가있을 것입니다. EOL은 시스템에 따라 다릅니다. – RandomSeed

+0

맞습니다. 내 줄 종결자는 쉼표이고 한 열은 쉼표가있는 문장입니다. 이 문제를 해결하는 방법에 대한 제안이 있으십니까? – TheCoder

0

행의 수가 크면 메모리 부족 오류로 2 단계에서 코드가 실패합니다. 청크로 행을 얻고 그 청크에 대해 준비된 명령문을 사용하여 일괄 처리를 수행하고 모든 행이 처리 될 때까지 계속할 수있는 방법을 찾아야합니다. 이것은 모든 아니오에 대해 작동합니다. 일괄 처리는 성능을 향상시킵니다. 이것 이외에는 디자인에 어떤 문제도 보이지 않습니다.

+0

가능하면 LOAD DATA가 가장 좋은 방법이라는 데 동의하십니까? – TheCoder

관련 문제