使用若依框架,java实现并发处理切换数据源并使用preparedstatement 预编译进行多个sql的删除,查询和批量插入,给出详细代码示例
时间: 2024-02-17 10:03:45 浏览: 101
好的,以下是示例代码:
```java
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import javax.sql.DataSource;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
public class DataSourceSwitcher {
private static final ThreadLocal<String> dataSourceKey = new ThreadLocal<>();
public static void setDataSourceKey(String dataSource) {
dataSourceKey.set(dataSource);
}
public static String getDataSourceKey() {
return dataSourceKey.get();
}
public static void clearDataSourceKey() {
dataSourceKey.remove();
}
public static void executeWithDataSource(DataSource dataSource, Runnable runnable) {
DataSourceSwitcher.setDataSourceKey(dataSource.getKey());
try {
runnable.run();
} finally {
DataSourceSwitcher.clearDataSourceKey();
}
}
public void deleteAndInsert(List<User> userList) {
String dataSourceKey = DataSourceSwitcher.getDataSourceKey();
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(DataSourceRegistry.getDataSource(dataSourceKey));
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(DataSourceRegistry.getDataSource(dataSourceKey));
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition);
try {
// delete
jdbcTemplate.update("DELETE FROM user");
// batch insert
jdbcTemplate.batchUpdate("INSERT INTO user (id, name, age) VALUES (?, ?, ?)", new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
User user = userList.get(i);
ps.setString(1, user.getId());
ps.setString(2, user.getName());
ps.setInt(3, user.getAge());
}
@Override
public int getBatchSize() {
return userList.size();
}
});
transactionManager.commit(transactionStatus);
} catch (Exception e) {
transactionManager.rollback(transactionStatus);
throw e;
}
}
}
```
在上面的代码中,我们使用了若依框架的事务管理器来控制多个 SQL 语句的执行过程。同时,我们通过 `DataSourceSwitcher` 类来切换数据源,并在执行 SQL 语句时使用预编译语句,以提高执行效率。
需要注意的是,`DataSourceSwitcher` 类中的 `setDataSourceKey()` 方法需要在切换数据源时调用,`executeWithDataSource()` 方法用于执行需要切换数据源的操作。在具体的业务代码中,我们可以这样使用:
```java
DataSourceRegistry.registerDataSource("dataSource1", dataSource1);
DataSourceRegistry.registerDataSource("dataSource2", dataSource2);
// 切换到 dataSource1 数据源执行删除和插入操作
DataSourceSwitcher.executeWithDataSource(dataSource1, () -> {
List<User> userList = getUserList(); // 获取需要插入的用户列表
dataSourceSwitcher.deleteAndInsert(userList);
});
// 切换到 dataSource2 数据源执行查询操作
DataSourceSwitcher.executeWithDataSource(dataSource2, () -> {
List<User> userList = jdbcTemplate.query("SELECT * FROM user", new BeanPropertyRowMapper<>(User.class));
// do something with userList
});
```
在具体的业务代码中,我们可以根据需要切换不同的数据源,并执行相应的 SQL 语句。同时,我们也可以使用 `jdbcTemplate` 来执行单个 SQL 语句,以便更好地控制数据源的切换。
阅读全文