当前位置: 首页 > news >正文

海港区网站快排seo网站怎么添加流量

海港区网站快排seo,网站怎么添加流量,做自媒体的网站名字,小影wordpress主题Mybatis-plus更新多张表,保证事务安全的情况下使用异步多线程实现(待验证) 文章目录 Mybatis-plus更新多张表,保证事务安全的情况下使用异步多线程实现(待验证)方案一:方案二:方案三:使用mybatis-plus更新数据库的五张不同的表,开启五个线程#xff0c;每个线程负责更新一张表…Mybatis-plus更新多张表,保证事务安全的情况下使用异步多线程实现(待验证) 文章目录 Mybatis-plus更新多张表,保证事务安全的情况下使用异步多线程实现(待验证)方案一:方案二:方案三:使用mybatis-plus更新数据库的五张不同的表,开启五个线程每个线程负责更新一张表如何在保证事务和线程安全的情况下做到异步更新编写详细的示例并详细说明方案四:方案五:方案六: 方案一: import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.IService; import lombok.extern.slf4j.Slf4j;import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;/*** 使用mybatis-plus更新多张表如何使用异步多线程更新多张表并且保证事务安全** author hubin* since 2018-08-20*/ Slf4j public class AsyncUpdateMultiTableExample {public static void main(String[] args) {// 创建线程池ExecutorService executorService Executors.newFixedThreadPool(10);// 创建service对象IServiceUser userService new UserServiceImpl();// 创建查询条件QueryWrapperUser queryWrapper Wrappers.query();queryWrapper.eq(id, 1);// 查询数据ListUser users userService.list(queryWrapper);// 使用异步多线程更新数据CompletableFuture.allOf(users.stream().map(user - {return CompletableFuture.runAsync(() - {// 更新数据userService.updateById(user);}, executorService);}).toArray(CompletableFuture[]::new)).join();// 关闭线程池executorService.shutdown();}/*** 用户表*/public static class User {private Long id;private String name;private Integer age;public Long getId() {return id;}public void setId(Long id) {this.id id;}}要使用异步多线程更新多张表并保证事务安全可以使用Spring框架的异步处理和事务管理功能。下面是一个简单的示例 首先需要在Spring配置文件中启用异步处理和事务管理。可以使用以下配置 task:annotation-driven executorasyncExecutor / task:executor idasyncExecutor pool-size10 / tx:annotation-driven /在Java代码中可以使用Async注解将方法标记为异步方法。在异步方法中可以使用Transactional注解来启用事务管理。例如 Service public class MyService { Autowired private MyMapper1 myMapper1; Autowired private MyMapper2 myMapper2; Async Transactional public void updateMultipleTables() { // 更新第一个表 myMapper1.updateTable1(); // 更新第二个表 myMapper2.updateTable2(); // 如果有其他需要更新的表可以继续添加相应的代码 } }在调用异步方法时可以使用Spring的AsyncTaskExecutor来执行异步任务。例如 Service public class MyOtherService { Autowired private MyService myService; Autowired private AsyncTaskExecutor asyncTaskExecutor; public void doUpdate() { // 异步执行多个表的更新操作 asyncTaskExecutor.submit(() - myService.updateMultipleTables()).get(); } }在上面的代码中submit()方法将异步任务提交给asyncTaskExecutor执行get()方法等待异步任务完成。由于异步任务使用了Transactional注解因此在异步任务中的所有数据库操作都将在一个事务中执行保证了事务的完整性和一致性。 需要注意的是异步任务的执行可能会影响系统的性能和稳定性。因此需要根据具体的情况进行评估和优化。 方案二: 在使用mybatis-plus更新多张表时可以使用异步多线程的方式来提高效率。以下是一个简单的实例演示如何使用异步多线程更新多张表并确保事务安全。 示例代码 Service public class UpdateService {Autowiredprivate AsyncService asyncService;Autowiredprivate TransactionTemplate transactionTemplate;public void updateMultipleTables(UpdateRequest request) {transactionTemplate.execute(new TransactionCallbackWithoutResult() {Overrideprotected void doInTransactionWithoutResult(TransactionStatus status) {asyncService.updateTableA(request.getTableAData());asyncService.updateTableB(request.getTableBData());asyncService.updateTableC(request.getTableCData());}});} }Service public class AsyncService {Autowiredprivate TableAService tableAService;Autowiredprivate TableBService tableBService;Autowiredprivate TableCService tableCService;Asyncpublic void updateTableA(TableAData data) {tableAService.update(data);}Asyncpublic void updateTableB(TableBData data) {tableBService.update(data);}Asyncpublic void updateTableC(TableCData data) {tableCService.update(data);} }在上面的代码中UpdateService 是一个服务类用于协调多个异步更新操作并确保它们在同一事务中执行。AsyncService 是一个异步服务类用于实际执行每个异步更新操作。 在 UpdateService 中使用 TransactionTemplate 来启用事务并在事务中调用异步服务类中的更新方法。由于更新方法被标记为异步因此它们将在一个独立的线程中执行。 在 AsyncService 中每个更新方法都被标记为异步并且使用相应的服务类来执行实际的更新操作。 注意Async 标注了每个更新方法这意味着每个更新操作将在独立的线程中执行。因此我们需要确保每个更新方法都是线程安全的并且能够在多个线程之间正确地共享数据。 总之使用异步多线程更新多张表可以提高系统的并发处理能力和效率。而使用事务模板可以确保多个更新操作在同一个事务中执行从而保证了事务安全。 方案三:使用mybatis-plus更新数据库的五张不同的表,开启五个线程每个线程负责更新一张表如何在保证事务和线程安全的情况下做到异步更新编写详细的示例并详细说明 在使用多线程更新多张表时需要注意以下几个方面 保证事务安全多个线程操作多张表需要保证事务的一致性即要么所有表的更新操作都成功要么所有表的更新操作都失败。因此在多个线程中需要使用同一个事务管理器并且在事务范围内执行更新操作。保证线程安全在多线程环境下多个线程并发地更新同一张表可能会导致数据不一致。因此在更新操作时需要使用线程同步机制例如使用synchronized关键字或者Lock接口。优化性能使用线程池可以有效地减少线程的创建和销毁提高程序的性能。 下面是一个使用mybatis-plus更新五张不同表的示例代码 Service public class UpdateService {Autowiredprivate TransactionTemplate transactionTemplate;Autowiredprivate ThreadPoolTaskExecutor taskExecutor;Autowiredprivate Table1Mapper table1Mapper;Autowiredprivate Table2Mapper table2Mapper;Autowiredprivate Table3Mapper table3Mapper;Autowiredprivate Table4Mapper table4Mapper;Autowiredprivate Table5Mapper table5Mapper;public void updateAllTables() {// 开启事务transactionTemplate.execute(new TransactionCallbackWithoutResult() {Overrideprotected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {// 使用线程池异步更新五张表taskExecutor.execute(() - updateTable1());taskExecutor.execute(() - updateTable2());taskExecutor.execute(() - updateTable3());taskExecutor.execute(() - updateTable4());taskExecutor.execute(() - updateTable5());}});}private synchronized void updateTable1() {// 更新表1table1Mapper.updateById(new Table1());}private synchronized void updateTable2() {// 更新表2table2Mapper.updateById(new Table2());}private synchronized void updateTable3() {// 更新表3table3Mapper.updateById(new Table3());}private synchronized void updateTable4() {// 更新表4table4Mapper.updateById(new Table4());}private synchronized void updateTable5() {// 更新表5table5Mapper.updateById(new Table5());} }在上述代码中我们使用了TransactionTemplate和ThreadPoolTaskExecutor来保证事务和线程安全。在updateAllTables方法中我们使用TransactionTemplate开启事务并使用线程池异步更新五张表。在每个更新方法中使用synchronized关键字来保证线程安全。 需要注意的是在使用线程池时线程池的大小需要根据系统的实际情况进行调整以避免线程池过大或过小导致的性能问题。 方案四: import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;Service public class UserService { Autowired private UserMapper userMapper;public void updateUser(int userId, String userName) {UpdateWrapperUser updateWrapper new UpdateWrapper();updateWrapper.eq(user_id, userId);updateWrapper.set(user_name, userName);userMapper.update(null, updateWrapper); }public void testAsyncUpdate() throws InterruptedException {// 创建一个 CountDownLatch 对象并设置计数器为 5CountDownLatch countDownLatch new CountDownLatch(5);// 创建一个线程池ExecutorService executorService Executors.newFixedThreadPool(5);// 启动 5 个线程每个线程负责更新一张表for (int i 0; i 5; i) {executorService.submit(() - {// 获取当前线程的 idint threadId Thread.currentThread().getId();// 获取要更新的表名String tableName user_ threadId;// 创建一个 QueryWrapper 对象QueryWrapperUser queryWrapper new QueryWrapper();// 设置查询条件queryWrapper.eq(user_id, threadId);// 查询数据User user userMapper.selectOne(queryWrapper);// 更新数据updateUser(threadId, user.getUserName() _update);// 计数器减一countDownLatch.countDown();});}// 等待所有线程执行完毕countDownLatch.await();// 关闭线程池executorService.shutdown();} }在上述示例中我们使用了 mybatis-plus 的 QueryWrapper 和 UpdateWrapper 对象来构建查询条件和更新条件。我们还使用了 CountDownLatch 对象来等待所有线程执行完毕。 在保证事务和线程安全的情况下做到异步更新可以通过以下方式实现 使用 synchronized 关键字来保证方法的线程安全。使用 Transactional 注解来开启事务。使用 ExecutorService 来创建线程池。使用 submit() 方法来启动线程。使用 countDownLatch.await() 方法来等待所有线程执行完毕。使用 countDownLatch.countDown() 方法来减小计数器 通过以上方式我们可以保证事务和线程安全的情况下做到异步更新。 方案五: import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.google.common.util.concurrent.CompletableFuture; import org.springframework.transaction.annotation.Transactional;import java.util.List; import java.util.concurrent.ExecutionException;public class MybatisPlusAsyncUpdateExample {private static final String NAMESPACE com.example.mybatisplus.mapper.UserMapper;Transactionalpublic static void main(String[] args) throws ExecutionException, InterruptedException {// 创建五个线程每个线程负责更新一张表ListCompletableFutureVoid futures new ArrayList();for (int i 0; i 5; i) {futures.add(updateAsync(i));}// 等待所有线程执行完成CompletableFuture.allOf(futures).join();}private static CompletableFutureVoid updateAsync(int tableIndex) {return CompletableFuture.runAsync(() - {// 获取 UserMapper 接口IServiceUser userService SpringContextHolder.getBean(NAMESPACE .UserService);// 创建 QueryWrapper 对象QueryWrapperUser queryWrapper new QueryWrapper();queryWrapper.eq(id, tableIndex);// 更新数据userService.update(queryWrapper);});}static class User {private Long id;private String name;} }在上述示例中我们使用了 CompletableFuture 来实现异步更新。CompletableFuture 是一个异步计算工具它可以让我们以异步的方式执行任务并在任务完成时获取结果。 在示例中我们创建了五个 CompletableFuture 对象每个 CompletableFuture 对象对应一个线程每个线程负责更新一张表。我们使用 CompletableFuture.allOf() 方法等待所有线程执行完成然后再继续执行后续的代码。 这样我们就实现了在保证事务和线程安全的情况下做到异步更新。 方案六: Service Transactional public class AsyncUpdateService {Autowiredprivate Table1Mapper table1Mapper;Autowiredprivate Table2Mapper table2Mapper;Autowiredprivate Table3Mapper table3Mapper;Autowiredprivate Table4Mapper table4Mapper;Autowiredprivate Table5Mapper table5Mapper;public void asyncUpdate() {CompletableFutureVoid future1 CompletableFuture.runAsync(() - {table1Mapper.updateTable1();});CompletableFutureVoid future2 CompletableFuture.runAsync(() - {table2Mapper.updateTable2();});CompletableFutureVoid future3 CompletableFuture.runAsync(() - {table3Mapper.updateTable3();});CompletableFutureVoid future4 CompletableFuture.runAsync(() - {table4Mapper.updateTable4();});CompletableFutureVoid future5 CompletableFuture.runAsync(() - {table5Mapper.updateTable5();});CompletableFuture.allOf(future1, future2, future3, future4, future5).join();} }在这个示例中我们使用了CompletableFuture.runAsync()方法来异步更新每张表。每个CompletableFuture都在自己的线程中执行保证了线程安全性。同时我们使用了CompletableFuture.allOf()方法来等待所有CompletableFuture完成保证了事务的一致性。 需要注意的是这个示例中使用了Transactional注解来保证事务的一致性。如果在实际项目中使用需要根据具体情况来选择是否需要事务。同时需要根据具体情况来调整线程池的大小以充分利用系统资源
http://www.zqtcl.cn/news/840245/

相关文章:

  • 肇庆做网站aspaccess做网站
  • 郑州网站建设索q479185700wordpress输出用户中心链接
  • 网站重要三要素网站建设 找vx cp5173
  • 河北网站开发价格三个字简洁的公司名称
  • 网站建设案例分析wordpress 页面固定
  • 杭州网站备案机械加工网站有哪些
  • 360网站运营wordpress 免费版广告
  • 龙文网站建设有域名可以自己做网站吗
  • 东莞优化网站建设肥猫网站建设
  • 东莞住房和建设局网站dedecms如何做网站
  • 广州商城网站建设地址义马网站开发
  • 全球购物网站排名高端网站定制开发设计制作
  • 软件开发专业课程有哪些seo比较好的优化
  • 重庆网站建设坤思特seo关键词报价查询
  • 重庆装修公司排名前十口碑推荐南京做网站seo
  • 佛山网站优化美姿姿seo网站策划方案 优帮云
  • 阿里巴巴国际站网站做销售方案东莞营销推广
  • 电子商城网站开发流程wordpress 文章发布时间
  • 莆田建网站公司盱眙县住房和城乡建设局网站
  • 2018年的网站制作室内设计网站哪些号
  • 做网站有包括哪些东西抖音seo关键词优化排名
  • 网站建设费无形资产做招聘网站需要什么
  • 长沙企业做网站网页制作教程免费下载
  • 重庆北碚网站建设空包网站分站怎么做
  • 北京神州网站建设湖北响应式网站建设费用
  • 环保网站设计价格建设网站对公司起什么作用
  • 做乒乓球网站的图片大全学网页设计哪个培训学校好
  • 婚礼做的好的婚庆公司网站用手机能创建网站吗
  • 广州网站开发平台.net做的网站代码
  • 地图网站设计建立公司网站视频