用java代码实现支持事务的线程池
时间: 2023-06-30 19:19:24 浏览: 107
好的,以下是一个简单的用Java代码实现支持事务的线程池的示例:
```
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import javax.transaction.UserTransaction;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TransactionalThreadPool {
private DataSource dataSource;
private UserTransaction userTransaction;
private ExecutorService executorService;
public TransactionalThreadPool(DataSource dataSource, UserTransaction userTransaction, int poolSize) {
this.dataSource = dataSource;
this.userTransaction = userTransaction;
this.executorService = Executors.newFixedThreadPool(poolSize);
}
public void execute(final TransactionalRunnable transactionalRunnable) {
executorService.submit(() -> {
Connection connection = null;
try {
userTransaction.begin();
connection = dataSource.getConnection();
transactionalRunnable.run(connection);
userTransaction.commit();
} catch (Exception e) {
try {
userTransaction.rollback();
} catch (Exception rollbackException) {
rollbackException.printStackTrace();
}
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
});
}
public void shutdown() {
executorService.shutdown();
}
}
interface TransactionalRunnable {
void run(Connection connection) throws SQLException;
}
```
这个示例中,我们创建了一个名为 `TransactionalThreadPool` 的类,它接受一个 `DataSource` 实例用于获取数据库连接,并且接受一个 `UserTransaction` 实例用于启动和提交事务。它还使用 `ExecutorService` 来管理线程池。
我们提供了一个 `execute` 方法,它接受一个 `TransactionalRunnable` 实例作为参数。这个 `TransactionalRunnable` 实例包含我们要在事务中执行的代码。当我们调用 `execute` 方法时,我们将创建一个新的线程来运行 `TransactionalRunnable`,并在事务的上下文中执行它。
最后,我们还提供了一个 `shutdown` 方法,用于关闭线程池。
使用这个线程池的示例代码:
```
DataSource dataSource = ... // 初始化数据源
UserTransaction userTransaction = ... // 初始化 UserTransaction
TransactionalThreadPool threadPool = new TransactionalThreadPool(dataSource, userTransaction, 10);
threadPool.execute(connection -> {
// 在这里执行需要在事务中执行的代码,例如:
PreparedStatement statement = connection.prepareStatement("INSERT INTO my_table (id, name) VALUES (?, ?)");
statement.setInt(1, 1);
statement.setString(2, "John Doe");
statement.executeUpdate();
});
threadPool.shutdown();
```
在这个示例中,我们首先创建了 `DataSource` 和 `UserTransaction` 实例,并将它们传递给 `TransactionalThreadPool` 的构造函数。然后,我们创建一个 `TransactionalRunnable` 实例,它包含我们要在事务中执行的代码。我们调用 `execute` 方法,并将 `TransactionalRunnable` 实例传递给它。最后,我们调用 `shutdown` 方法关闭线程池。