3

NetBeans で Java のコードを書きました。

package helloworld;

import java.sql.*;
import java.io.*;
import java.lang.Object;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.functors.EqualPredicate;
import org.apache.lucene.queryParser.ParseException;

public class HelloWorld {
    public static void main(String[] args) throws IOException, ParseException {
        // TODO code application logic here       
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        String url = "jdbc:mysql://localhost:3306/kdd";
        String user = "root";
        String password = "Pass1234";    

        try {
            conn = DriverManager.getConnection(url, user, password);
            stmt = conn.createStatement();

            String sqlQuery = "Select * from ad_contents";
            rs = stmt.executeQuery(sqlQuery);

            while (rs.next()) { //(rs.next())              
                int adID = rs.getInt(1);
                String keywordTokens = rs.getString(2);
                String titleTokens = rs.getString(3);
                String descriptionTokens = rs.getString(4);

                List<String> keywordList = Arrays.asList(keywordTokens.split("\\|", -1));
                List<String> titleList = Arrays.asList(titleTokens.split("\\|", -1));
                List<String> descriptionList = Arrays.asList(descriptionTokens.split("\\|", -1));
                Set<String> distincts = new HashSet<String>();
                distincts.addAll(keywordList);
                distincts.addAll(titleList);
                distincts.addAll(descriptionList);

                int keywordHit = 0, titleHit = 0, descriptionHit = 0;

                for (String distinctCounter : distincts) {                    
                    keywordHit = CollectionUtils.cardinality(distinctCounter, keywordList);
                    titleHit = CollectionUtils.cardinality(distinctCounter, titleList);
                    descriptionHit = CollectionUtils.cardinality(distinctCounter, descriptionList);
                    String intoQuery = "insert into ad_word_counts values (" + adID + "," + distinctCounter + "," + keywordHit + "," + titleHit + "," + descriptionHit + ")";
                    stmt.execute(intoQuery);
                    //node myNode= new node(adID, Integer.parseInt(distinctCounter) , keywordHit, titleHit, descriptionHit);                                     
                }

            }           
        } catch (SQLException ex) {
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException ex) {
            }
        }
    }
}

ただし、rs Result Set の 1 行目で while ブロックに入るのは 1 回だけです。そのため、1 つの adID のデータのみを書き込みます。「intoQuery」は、すべての rs 結果セット行に対して機能しません。どうすればそれを処理できますか?

4

1 に答える 1

8

これは、while ループ内の for ループでもう 1 つのクエリを実行したためです。

for (String distinctCounter : distincts) {                    

    // Create a new statement to execute query in while loop                
    Statement stmt1 = conn.createStatement();  
    stmt1.execute(intoQuery);

}

これにより、古いresult setものが閉じられます。

見てみましょう: -ResultSet#closeドキュメンテーションには次のように書かれています: -

ResultSet オブジェクトは、Statement オブジェクトが閉じられるか、再実行されるか、複数の結果のシーケンスから次の結果を取得するために使用されると、それを生成した Statement オブジェクトによって自動的に閉じられます。

したがって、ドキュメントには、同じステートメントで新しいクエリを再実行するとResultSetオブジェクトが閉じられることが明確に記載されています。

statementそのため、別のインスタンスを使用して内部クエリを作成する必要があります。

提案: -

理想的には、上記のコードは、ブロック内の例外を飲み込んだために知らなかったSQLException(See ) をスローします。ResultSet#nextcatch

    catch (SQLException ex) {
    }

emptycatch ブロックを使用しないでください。プログラムが実行時に停止するのを防ぐことを除いて、それは役に立ちません。しかし、それは何の役にも立ちません。

于 2012-10-16T13:07:21.257 に答える