0

私はJavaが初めてです。別のスレッドで ResultSet に値をスローするプログラムを作成しようとしています。

     ResultSet rset = stmt
            .executeQuery("select  DISTINCT  substr(file_type,1,3) from DBM.file_table where process_time= '0015' ");

while (rset.next()){    
    r = rset.getString(1);
System.out.println(r);

ここで、ResultSet から 5 つの異なる値を取得したとします。私がしたいのは、異なるスレッドで同期された ResultSet のすべての値に対して以下のコードを実行することです。

    String spCall = "call DBM.SP_MS_" + r + "('0015', NULL, SYSDATE, 'DBM')";

    try {
        dbConnection = getDBConnection();
        stmt1 = dbConnection.createStatement();

        System.out.println(spCall);

        stmt1.executeUpdate(spCall);

        System.out.println("SUCCESS for File_Type " + r );
        System.out.println("-----------------------------");
    } catch (SQLException e) {

        System.out.println(spCall);

        stmt1.executeUpdate(spCall);

        System.out.println("SUCCESS for File_Type " + r );
        System.out.println("-----------------------------");
    } catch (SQLException e) {

ありがとう

4

2 に答える 2

2

次のように進めることができます。

public void executeQuery()
{
    ResultSet rset = stmt.executeQuery("select  DISTINCT  substr(file_type,1,3) from DBM.file_table where process_time= '0015' ");

    while (rset.next())
    {    
        final r = rset.getString(1);
        System.out.println(r);
        Thread th = new Thread ( new Runnable()
        {
            @Override
            public void run()
            {
                method(r);
            }
        });
        th.start();
    }
}
public synchronized void method(String r)
{
    String spCall = "call DBM.SP_MS_" + r + "('0015', NULL, SYSDATE, 'DBM')";

    try {
        dbConnection = getDBConnection();
        stmt1 = dbConnection.createStatement();

        System.out.println(spCall);

        stmt1.executeUpdate(spCall);

        System.out.println("SUCCESS for File_Type " + r );
        System.out.println("-----------------------------");
    } catch (SQLException e) {

        System.out.println(spCall);

        stmt1.executeUpdate(spCall);

        System.out.println("SUCCESS for File_Type " + r );
        System.out.println("-----------------------------");
    } catch (SQLException e) {}
}
于 2013-03-20T16:10:25.303 に答える
0

あなたは正しい方向に向かっていると確信していますか?既にストアド プロシージャを使用しているのであれば、ストアド プロシージャにすべての作業を任せてみませんか? その時点で、データベースへの単一の呼び出しである必要があります。

CALL DBM.SP_MS('0015', NULL, SYSDATE, 'DBM');

_ + rOracle ストアド プロシージャの内部では、バージョンによって個別に実際に行われていたことをすべて行います。とにかく、元の呼び出しと同じように「0015」を受け取ります。これにより、Java 側が簡素化され、データベースに対する接続の負担が大幅に軽減されます (往復するよりも)。

ストアド プロシージャは、影響を受けたファイル タイプのリストを返すrことができます。これは、ログやレポートの目的で使用できます。

これが内部でどのように機能するかは、_ + r実装が実際に何をしているかによって異なります。私はそれが同じであると疑うでしょう。

最後に、これを行うと、実際に通話をやめたい場合は、呼び出し全体に対してThread1 つのみを作成するだけで済みます。Threadこれにより、システム内の s が少なくなりThread、これは一般的には良いことです。

また、Java は初めてなので、Executors と jtahlborn のリンクを調べてください。

于 2013-03-20T16:15:19.310 に答える