Максимальный удар 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.