gpt4 book ai didi

multithreading - 在Java中的RESTful Web服务上使用线程

转载 作者:行者123 更新时间:2023-12-03 13:16:02 24 4
gpt4 key购买 nike

我有一个RESTful Web服务问题,我在php中有一个客户端,它在Java中调用了RESTful服务。在我的RESTful服务中,我有一个Post方法,该方法执行一个更新查询来修改具有10000条记录的表中的所有行。我想使用线程来做到这一点。可以这样做吗?请帮助我,我是Java的新手。谢谢。

好的,我在服务层中执行此操作:

for(int i = 0; i < 10; i++)
{
startRow = i*1000;
finalRow = i*1000 + 1000;
Runnable process = new ProcessRecords(startRow , finalRow);
executor.execute(process);
}

// Wait until all threads are finish
while (!executor.isTerminated()) {

}
System.out.println("\n All threads finished");

我正在调用此类(ProcessRecords)执行更新:
public ProcessRecords (int start, int final)
{
startRow = start;
finalRow = final;
}

@Override
public void run(){

try {

ConsultUniversity consult = new ConsultUniversity ();
consult.averangeGrade(startRow, finalRow);

} catch (Exception ex) {
Logger.getLogger(Procesos.class.getName()).log(Level.SEVERE, null, ex);
}
}

然后在我的数据层中,在我的方法“averangeGrade”中执行此操作:
 try {
conn = UniversityConection();//This is my conection

query = "SELECT * FROM grades LIMIT " + filaInicial + "," + filaFinal;
prepStatement = conn.prepareStatement(query);

rs = prepStatement.executeQuery(query);

rsmd = rs.getMetaData();

while(rs.next())
{
averange = (rs.getInt("nFirGrd") + rs.getInt("nSecGrd") +
rs.getInt("nThrGrd"))/3; //the averange of three grades

query = "UPDATE grades SET nFinGrd = ? WHERE cCodAlu = ?";

prepStatement = conn.prepareStatement(query);
prepStatement.setInt(1, averange);
prepStatement.setString(2, rs.getString("cCodAlu"));

prepStatement.executeUpdate();

System.out.println("Record " + rs.getString("cCodAlu") +
" modified");
}

conn.close(); //close connection

}

然后,当我执行我的客户端时,我的服务将对最上面的行(例如50行)进行更新,然后返回消息,例如所有进程是否都完成了,我也不知道为什么。我认为不是等所有线程都完成了,而是有相应的代码,为什么会这样呢?请帮我。谢谢你。

最佳答案

当然可以。
您是否熟悉Java提供的并发API?

从高角度来看,您必须编写处理该Http POST的代码。在此代码中,您可以实例化任意数量的线程(线程池),并且池中的每个线程都会对要更新的行的子集进行更新。
例如,您可以启动10个线程,而每个线程仅在1000行上进行更新。

此外:

  • 我将在应用程序启动时设置线程池,因此每次执行POST时,它都会使用已创建的池,并且不会每次实例化一个新的池(这太昂贵了)
  • 要将行的子集分配给每个线程,您必须使用LIMIT和START sql子句,您可以选择该子集。每个线程根据此2个参数
  • 会有一个不同的查询

    在代码中:
    // instantiate the pool
    ExecutorService pool=Executors.newFixedThreadPool(poolSize);
    // run the task to execute in parallel, specificying the subset of rows
    pool.execute(new UpdateHandler(limit,skip));

    // below you find a prototype of the async thread task
    class Handler implements Runnable {
    private final int skip;
    private final int limit;
    Handler(int limit, int skip) { ... }

    public void run() {
    // specify the code that runs the query here
    }
    }

    您可以找到文档 herehere
    希望这可以帮助。

    关于multithreading - 在Java中的RESTful Web服务上使用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26855561/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com