2013-07-09 1 views
0

나는 "문장"이라는 하나의 클래스 ArrayList를 가지고있다. 각 문장은 값 "단어"를 포함합니다. 스톱 어라운드인지 여부에 관계없이 MySQL 데이터베이스에 각 단어를 확인해야합니다. 말하자면, 나는 "문장"이 200 개 있고 문장마다 다양한 "단어"가 있습니다.하나의 루핑에서 MySQL 최대 히트

데이터베이스에 "단어"를 한 번에 하나씩 확인했습니다. 연결 수가 실패하기 전에 단어가 2500자를 초과하면 (때로는 3500 번째 단어까지 도달 함) 오류가 발생합니다. 2500

아래의 "단어"의 수가이 내 쿼리 코드

public Query() throws SQLException, ClassNotFoundException{ 
    try{ 
     cd = new Connect(); 
     connect = cd.getConnection(); 
     statement = (Statement) connect.createStatement(); 

    }catch(SQLException e){ 
     System.err.println("Database connecting failed"); 
    } 
} 

public boolean isStopWords(String word) throws SQLException{ 

    String query = "SELECT stopwords FROM stopword WHERE stopwords = '"+word+"'"; 

    rs = statement.executeQuery(query); 

    if(!rs.next()) return false; 
    else return true; 
} 

그러나 만약 그것을 잘 이것은 검색 내 방법이 내 연결 코드

public Connect() throws SQLException{ 
    try{ 
     Class forName = Class.forName ("com.mysql.jdbc.Driver"); 
    }catch(ClassNotFoundException ex){ 

    } 
    connect = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/mydatabase", "root", null); 
} 

public Connection getConnection(){ 
    return connect; 
} 

되어있을 것 Sentence 클래스의 단어 .String [] tempWords는 한 개체 문장의 단어 값입니다. 그리고 문장 자체는 벌금이 약 2500 "단어"를 돌 때까지 왜 ArrayList의 문장

protected ArrayList<String> eraseStopWord (String[] tempWords) throws SQLException, ClassNotFoundException{ 
    result = new ArrayList<String>(); 
    db = new Query(); 
    for(int i=0;i<tempWords.length;i++){ 

     if(!db.isStopWords(tempWords[i])){ 
      result.add(tempWords[i]); 
     } 
    } 

    return result; 

} 

의 크기에 따라 반복 할 것인가? (때로는 연결이 실패하기 전에 3500 번째 단어까지 괜찮습니다. 단어의 2500 번째 문자보다 안정적입니다.)

업데이트 : 이제 연결이 중지 된 부분을 알 수 있습니다. 그것은 153 번째 문장 루핑에서 멈췄다. 그래서 그 단어에 의존하지 않습니다. 버그 후 모양을 봐

  • 나는 대답을 찾았습니다. 나는 루프에서 연결을 열어서 MySQL이 너무 많은 연결 (152 연결)을 취한다.
+1

arraylist에서 값을 반복하고 가져 오는 위치는 어디입니까? – pikrut

+0

질문을 편집합니다 –

+0

콜렉션을 사용할 때 인터페이스를 사용해야합니다. 즉 반환 유형으로'ArrayList' 대신'List'를 사용해야합니다. –

답변

0

내 잘못. 내 앞의 코드에서 , 난 매번 연결 만든 문장 (dB = 새로운 쿼리)

protected ArrayList<String> eraseStopWord (String[] tempWords) throws SQLException, ClassNotFoundException{ 
result = new ArrayList<String>(); 
db = new Query(); 
for(int i=0;i<tempWords.length;i++){ 

    if(!db.isStopWords(tempWords[i])){ 
     result.add(tempWords[i]); 
    } 
} 

return result; 

}를 만들

는 153 문장에 도달하면 그래서, 그것 때문에 너무 많은 연결 의 중지합니다

해결 방법은 문장 반복 전에 열려있는 연결 코드를 작성하는 것입니다.

0

단어의 경우 in 절을 사용할 수있다.

String query = "SELECT stopwords FROM stopword WHERE stopwords in '("+words+")'"; 

이렇게하면 적중 횟수가 줄어 듭니다. Statement 대신 PreparedStatement를 사용하는 것이 더 좋습니다. 이것은 SQL 주입으로부터 당신을 저장할 것입니다.

+0

연결이 끊어 지거나 다소 어긋나는 이유가 궁금합니다. 그것은 MySQL에서 최대 히트 한도입니까? –

+0

연결을 다시 사용할 수 있습니다. 각 쿼리에 대해 새 연결을 만들 필요는 없습니다. 작업이 완료되면 연결을 끊어야합니다. –

+0

@Subir이 쿼리로 SQL 주입을 조심하십시오! – Abubakkar

0

쿼리 실행을 위해 최신 명령문을 닫아야합니다. 라인에서

봐이와

if(!rs.next()) return false; 
else return true; 

변경 :

bool returnValue = true; 
if (!rs.next()) { 
    returnValue = false; 
    statement.close(); // it will release the Statement object 
} 

return returnValue; 
+0

업데이트 : 이제 연결이 중단 된 곳을 알고 있습니다. 그것은 153 번째 문장 루핑에서 멈췄다. 그래서 그 단어에 의존하지 않습니다. 아직도 버그를 돌봐야합니다 –

+1

우리는 당신의 문제를 해결하기 위해 서로 만나야 만합니다 ... : D –