Максимальный удар MySQL за один цикл

У меня есть один класс ArrayList с именем "Предложение". каждое предложение содержит значение "слова". Я должен проверить каждое слово в базе данных MySQL, является ли это стоп-словами или нет. Допустим, у меня есть 200 "предложений", и каждое предложение имеет различное количество "слов".

Я проверил "Слова" одно за другим в базе данных, когда он набрал более 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;
}

Это мой метод для извлечения Word из класса Sentence.String[] tempWords - это значение слов в одном объекте Sentence. И само предложение будет зацикливаться в соответствии с размером предложения 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;

}

Почему это хорошо, пока не достигнет примерно 2500 "Слово"? (иногда это нормально до 3500-го слова до того, как соединение не установится, просто стабильно ниже 2500-го слова)

ОБНОВЛЕНИЕ: теперь я знаю, где остановилось соединение. Это остановилось на 153-м предложении зацикливания. так что это не зависит от слов. по-прежнему ухаживать за ошибкой

  • Я нашел ответ. я открываю соединение в цикле, так что MySQL требует слишком много соединения (152 соединения)

3 ответа

Решение

Моя вина. В моем предыдущем коде я устанавливаю соединение каждый раз, когда создается предложение (db = new Query)

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-го предложения, он остановится из-за слишком большого количества соединений. Решение состоит в том, чтобы написать открытый код соединения перед циклом предложения

Вам нужно закрыть последний оператор для выполнения запроса.

Посмотрите на строку:

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;

Для слов вы можете использовать in пункт.

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

Это уменьшит количество попаданий. Лучше использовать PreparedStatement вместо Statement. Это избавит вас от инъекций sql.

Другие вопросы по тегам