executorservice实现同步执行多条sql
时间: 2023-09-10 08:02:51 浏览: 89
ExecutorService是Java提供的一个多线程执行框架,可以帮助我们简化多线程编程。
要实现同步执行多条SQL,可以使用ExecutorService与Callable配合使用。首先,我们需要定义一个实现了Callable接口的类,用于执行需要同步执行的SQL操作。
```java
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.concurrent.Callable;
public class SqlTask implements Callable<Void> {
private Connection connection;
private String sql;
public SqlTask(Connection connection, String sql) {
this.connection = connection;
this.sql = sql;
}
@Override
public Void call() throws Exception {
PreparedStatement statement = null;
try {
statement = connection.prepareStatement(sql);
statement.execute();
} catch (SQLException e) {
e.printStackTrace();
throw e;
} finally {
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return null;
}
}
```
然后,我们可以使用ExecutorService来创建线程池,并通过submit方法提交需要执行的SQL任务。
```java
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
Connection connection = null;
try {
// 初始化数据库连接
connection = getConnection();
// 创建要执行的SQL任务列表
List<SqlTask> tasks = new ArrayList<>();
tasks.add(new SqlTask(connection, "INSERT INTO table1 VALUES (1, 'A')"));
tasks.add(new SqlTask(connection, "INSERT INTO table2 VALUES ('B', 2)"));
tasks.add(new SqlTask(connection, "UPDATE table1 SET value = 'C' WHERE id = 1"));
// 提交任务并获取Future列表
List<Future<Void>> futures = executorService.invokeAll(tasks);
// 等待任务执行结束
for (Future<Void> future : futures) {
future.get();
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
// 关闭数据库连接
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 关闭线程池
executorService.shutdown();
}
}
private static Connection getConnection() {
// 返回数据库连接
return null;
}
}
```
以上代码中,我们首先创建了一个线程池,具体使用的是`java.util.concurrent.Executors`类提供的`newFixedThreadPool`方法,指定线程池大小为5。
然后,通过创建SqlTask对象来包装需要执行的SQL,并将这些任务放入一个任务列表tasks中。
接着,通过`executorService.invokeAll`方法将所有任务提交到线程池中执行,并获得一个Future列表,用于等待任务执行结束。
最后,我们通过`future.get`方法来等待所有任务执行完毕,确保任务都执行完成后再关闭线程池和数据库连接。
总之,通过使用ExecutorService与Callable配合可以实现同步执行多条SQL的功能。
阅读全文