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 个不同的值。我想做的是在不同线程中同步的所有结果集值的代码下面运行。

    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');

在 Oracle 存储过程的内部,您可以执行各个_ + r版本实际单独执行的任何操作;无论如何,它都会收到与原始呼叫相同的“0015”。这将简化您的 Java 端,并且将对数据库产生更小的连接负担(而不是来回连接)。

然后,存储过程可以返回r它所影响的文件类型列表,您可以将其用于记录或报告目的。

这在内部如何工作取决于_ + r实现实际在做什么。我会怀疑它是一样的。

最后,这样做意味着,如果您真的想Thread停止通话,那么您只需要Thread为整个调用创建一个单一的。这导致Thread系统中的s更少,这通常是一件好事。

此外,由于您是 Java 新手,请查看Executors 和 jtahlborn 的链接。

于 2013-03-20T16:15:19.310 回答