0

何かに行き詰まっていて、解決策が思い浮かびません。dbSelect という関数があり、MySQL クエリを実行して を取得するスレッドを作成しますが、それを取得して返すResultSet必要があります。ここに私が持っているものがあります:dbSelectResultSet

public class Utils {
    public static void dbSelect(String query){
        selectQuery = query;
        Thread selectThread = new selectThreadClass();
        selectThread.start();
    }
}
class selectThreadClass extends Thread {
    public void run(){
        perform();
    }

    public ResultSet perform(){
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection("jdbc:mysql://localhost/lob/?user=root&password=");

            Statement s = conn.createStatement();
            ResultSet rs = s.executeQuery(Utils.selectQuery);
            return rs;
        }catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e){
            e.printStackTrace();
            return null;
        }
    }
}

スレッドからdbSelect返されるように、誰かがそれを手に入れるのを手伝ってくれますか? ResultSetありがとう!

4

5 に答える 5

4

Callableを使用する

 public interface Callable<V> {
 V call() throws Exception;
}
于 2012-08-18T20:21:59.363 に答える
2

Runnable の代わりに callable を使用します。

public class SelectCallableClass implements Callable<ResultSet> {

    public ResultSet call() throws Exception {
        return perform();
    }

    public ResultSet perform(){
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection("jdbc:mysql://localhost/lob/?user=root&password=");

            Statement s = conn.createStatement();
            ResultSet rs = s.executeQuery(Utils.selectQuery);
            return rs;
        }catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e){
            e.printStackTrace();
            return null;
        }
    }
}

Callable クラスを送信するには、ExecuterService を使用します。

ExecutorService service=Executors.newFixedThreadPool(1);
Future future=service.submit(new SelectCallableClass());

上記のコードは、次のことを行います (doc から)。実行のために値を返すタスクを送信し、タスクの保留中の結果を表す Future> を返します。Future の get メソッドは、正常に完了するとタスクの結果を返します。

于 2012-08-18T20:26:26.303 に答える
1

私の側から試してみてください

コードを変更し、List を使用して ResultSet の値を保持するソリューションを得ましたが、質問が 1 つだけあります。つまり、Callable で型 (ResultSet) として結果を取得できませんでした。

future get() 関数を使用して値を取得しようとすると、どういうわけか結果セットが空でした

結果セット rs = (結果セット)future.get();

以下は、機能しなかったコードの一部です。

ExecutorService service=Executors.newFixedThreadPool(1);
Callable<ResultSet> callable = new SelectThreadResultSet();
Future<ResultSet> future = service.submit(callable);
ResultSet rs = (ResultSet)future.get();
// Here I dont get any values
while(rs.next()){
    System.out.println(rs.getString("EMPLOYEE"));
}

私のために働いた解決策を以下に見つけてください。Listを使用して値を保持し、それを返しました。

クラス SelectThreadClass:

public class SelectThreadClass implements Callable<List<String>> {

    public List<String> call(){
        ResultSet rs = null;
        List<String> strList = new ArrayList<String>();
        try {
            rs  = perform();
            while(rs.next()){
                strList.add(rs.getString("EMPNAME"));
            }
            System.out.println("Passed");

        } catch (InstantiationException | IllegalAccessException | SQLException e) {
            e.printStackTrace();
        }
        return strList;
    }

    public ResultSet perform() throws InstantiationException, IllegalAccessException, SQLException{
        Connection conn = null;
        try {
            Class.forName("org.sqlite.JDBC");
            try {
                conn = DriverManager.getConnection("jdbc:sqlite:C:\\SqlLite\\EMPLOYEE.db");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            Statement s = null;
            try {
                s = conn.createStatement();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            ResultSet rs = null;
            try {
                rs = s.executeQuery(Utils.selectQuery);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return rs;
        }catch (ClassNotFoundException e){
            e.printStackTrace();
            return null;
        }
    }
}

クラスユーティリティ:

public class Utils {

    public static String selectQuery = "SELECT EMPNAME FROM EMPLOYEEDETAILS";
    public static void dbSelect(String query) throws InterruptedException, ExecutionException, SQLException{
        ExecutorService service=Executors.newFixedThreadPool(1);
        Callable<List<String>> callable = new SelectThreadClass();

        Future<List<String>> future = service.submit(callable);

        List<String> empList = future.get();
        for(String emp : empList){
            System.out.println(emp);
        }
    }

    public static void main(String args[]) throws InterruptedException, ExecutionException, SQLException{
        dbSelect("SELECT EMPNAME FROM EMPLOYEEDETAILS");
    }

}
于 2012-08-18T22:03:43.323 に答える
0

Thread クラスに属性を設定するだけで、その属性を取得できます。

public class Utils {
    public static void dbSelect(String query){
        selectQuery = query;
        Thread selectThread = new selectThreadClass();
        selectThread.start();

        ((SelectThreadClass) selectThread).getResult();
    }
}

class selectThreadClass extends Thread {
    ResultSet rs = null;

    public ResultSet getResult(){
        return rs;
    }

    public void run(){
        rs = perform();
    }

    public ResultSet perform(){
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection("jdbc:mysql://localhost/lob/?user=root&password=");

            Statement s = conn.createStatement();
            return s.executeQuery(Utils.selectQuery);
        } catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e){
            e.printStackTrace();
            return null;
        }
    }
}

唯一の問題は、dbutil から接続クロージャやその他のものを処理することになる可能性があることです。代わりに、結果セットを任意の Java クラスに変換してから、結果セットではなくその Java オブジェクト リストを返すことができます。

于 2012-08-18T22:14:33.457 に答える
0

run結果を返しません。
al Callableを使用するか、共有変数を使用して poll/ waitinUtilsからの結果SelectThreadClassが利用可能になるまで使用します。
ただしCallable、タスクに正確に適合するため、 a を使用することをお勧めします

于 2012-08-18T20:24:23.730 に答える