我有一个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行,然后返回消息,就像所有进程都已完成一样,我不知道为什么。我认为不会等到所有线程都完成,但有代码,那为什么会发生这种情况?请帮我。谢谢。
答案 0 :(得分:2)
当然,这是可能的。 您熟悉Java提供的并发API吗?
从高层来看,您必须编写处理Http POST的代码。在此代码中,您可以实例化任意数量的线程(线程池),并且池的每个线程都会对要更新的行的子集进行更新。 例如,您可以启动10个线程,每个线程仅在1000行上进行更新。
此外:
在代码中:
// 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
}
}