0

我有一个名为“句子”的类 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;
}

这是我从 Class Sentence.String[] tempWords 中检索 Word 的方法,它是一个对象 Sentence 中 Words 的值。并且 Sentence 本身会根据 ArrayList Sentence 的大小循环

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 连接)
4

3 回答 3

0

对于单词,您可以使用in从句。

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

这将减少点击次数。最好使用 PreparedStatement 而不是 Statement。这将使您免于 sql 注入。

于 2013-07-09T06:23:27.990 回答
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;
于 2013-07-10T04:10:31.080 回答
0

我的错。在我之前的代码中,每次创建句子时我都会建立连接(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句时,会因为连接太多而停止 解决方法是在Sentence looping之前写open connection代码

于 2013-07-11T07:42:44.833 回答