Максимальное попадание 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;
}

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

person Ahimsa Afrizal    schedule 09.07.2013    source источник
comment
Где вы повторяете и берете значения из массива?   -  person Niju    schedule 09.07.2013
comment
я отредактирую вопрос   -  person Ahimsa Afrizal    schedule 09.07.2013
comment
Вы должны использовать интерфейсы при работе с коллекциями, т.е. List вместо ArrayList в качестве возвращаемого типа.   -  person Ondra Žižka    schedule 10.07.2013


Ответы (3)


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

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

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

person Subir Kumar Sao    schedule 09.07.2013
comment
мне нужно отключить соединение или что-то в этом роде, мне любопытно, почему это происходит. это какой-либо максимальный предел хитов в MySQL? - person Ahimsa Afrizal; 09.07.2013
comment
Вы можете повторно использовать соединение. Вам не нужно создавать новое соединение для каждого запроса. И да, вы должны закрыть соединение после завершения работы. - person Subir Kumar Sao; 09.07.2013
comment
@Subir Остерегайтесь SQL-инъекций с этим запросом! - person Abubakkar; 09.07.2013
comment
@SubirKumarSao, это решение не работает, мой запрос остановился и не смог подключиться к MySQL, когда он достигает 2646-го слова - person Ahimsa Afrizal; 09.07.2013
comment
В запросе позволяет только 1000 одновременно. Поэтому вам нужно разделить после 1000 слов. Опубликуйте текущие изменения. - person Subir Kumar Sao; 09.07.2013
comment
Если вы добираетесь до этого количества слов, вместо использования IN я бы предложил поместить слова во временную таблицу, а затем использовать JOIN для этой временной таблицы. - person Kickstart; 09.07.2013
comment
ОБНОВЛЕНИЕ: теперь я знаю, где остановилось соединение. Он остановился на 153-м предложении. так что это не зависит от зацикливания слов - person Ahimsa Afrizal; 11.07.2013

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

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

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;
person Fathoni Rokhman    schedule 10.07.2013
comment
ОБНОВЛЕНИЕ: теперь я знаю, где остановилось соединение. Он остановился на 153-м предложении. так что это не зависит от слов. все еще присмотри за ошибкой сейчас - person Ahimsa Afrizal; 11.07.2013

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

person Ahimsa Afrizal    schedule 11.07.2013