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

网站后台怎么用ftp打开临沂做网站设计的公司

网站后台怎么用ftp打开,临沂做网站设计的公司,山西专业制作网站,深圳网站建设 设计文章目录 场景分析测试对应的其他类我并没有贴出来,因为大家可以自己找个项目走一波测试testSession测试testTransaction 注意使用同一个sqlsession会导致线程安全问题,testSession方法就是在另外线程里面能读取到数据库里面没有的数据.但是有时候业务就是这么奇怪.扩展总结 场… 文章目录 场景分析测试对应的其他类我并没有贴出来,因为大家可以自己找个项目走一波测试testSession测试testTransaction 注意使用同一个sqlsession会导致线程安全问题,testSession方法就是在另外线程里面能读取到数据库里面没有的数据.但是有时候业务就是这么奇怪.扩展总结 场景 有一天邱大神问我 业务很简单比如我新增一个user使用事务然后再这个事务里面创建了个线程,新增另外一个表的数据 我要在第二个事务里面查询到第一个事务里面的user新增的数据 分析 如果在同一个事务里面的话,那么先提交了一个用户,后面的线程查询就能查询得到. 那只需要这个方法使用的都是同一个SqlSession即可; 测试 创建个SqlContext获取SqlSession: import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.stereotype.Component;import javax.annotation.Resource;Component public class SqlContext {Resourceprivate SqlSessionTemplate sqlSessionTemplate;public SqlSession getSqlSession(){SqlSessionFactory sqlSessionFactory sqlSessionTemplate.getSqlSessionFactory();return sqlSessionFactory.openSession();} }好比我有个config表就建的key,value CREATE TABLE config (id int NOT NULL AUTO_INCREMENT,config_key varchar(20) NOT NULL,config_value varchar(500) NOT NULL,modified_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,created_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,remark varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 备注,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT8 DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;两个测试方法, 一个是testSession,通过sqlContext获取SqlSession,通过sqlSession获取ConfigDao,然后多线程方法内部也使用这个ConfigDao,然后手动提交事务回滚事务.然后分别先进行修改数据,然后在新增一条数据,另外一条线程内部进行查询数据,并且查询最新的一条数据.一个是testTransaction,通过spring的声明式事务,也是先进行修改数据,然后在新增一条数据,另外一条线程内部进行查询数据,并且查询最新的一条数据. 对应的其他类我并没有贴出来,因为大家可以自己找个项目走一波 测试testSession OverrideSneakyThrowspublic Config testSession(Long id) {// 获取数据库连接,获取sqlSessionSqlSession sqlSession sqlContext.getSqlSession();Connection connection sqlSession.getConnection();try {// 设置手动提交connection.setAutoCommit(false);ConfigDao configDao sqlSession.getMapper(ConfigDao.class);Config config configDao.selectById(id);String testSession testSession: RandomUtil.randomString(3);config.setConfigValue(testSession);log.info(修改的value为:{}, testSession);configDao.updateById(config);Config insertConfig new Config();insertConfig.setConfigKey(new DateTime().toString(HH:mm:ss));insertConfig.setConfigValue(new DateTime().toString(HH:mm:ss));configDao.insert(insertConfig);log.info(新增的id: insertConfig.getId());//另外一条线程执行CompletableFutureVoid future CompletableFuture.runAsync(() - {//让最后一个线程抛出异常Config config1 configDao.selectById(id);log.info(内部查询的value:{}, config1.getConfigValue());QueryWrapperConfig wrapper new QueryWrapper();wrapper.orderByDesc(id).last(limit 1);Config config2 configDao.selectOne(wrapper);log.info(查询最新的id: config2.getId());});future.get();connection.commit();log.info(修改完毕);return config;} catch (Exception e) {connection.rollback();log.info(error, e);throw e;} finally {connection.close();}} 返回结果:跟我们预想的一样,相当于使用的同一个事务,可以看看打印的线程名称不同,一个是main,一个是onPool-worker-9; 2023-09-07 15:15:02.238 INFO 2448 [ main] c.s.s.service.impl.ConfigServiceImpl [52] : 修改的value为:testSession:owg 2023-09-07 15:15:02.354 INFO 2448 [ main] c.s.s.service.impl.ConfigServiceImpl [59] : 新增的id:10 2023-09-07 15:15:02.365 INFO 2448 [onPool-worker-9] c.s.s.service.impl.ConfigServiceImpl [66] : 内部查询的value:testSession:owg 2023-09-07 15:15:02.399 INFO 2448 [onPool-worker-9] c.s.s.service.impl.ConfigServiceImpl [71] : 查询最新的id:10 2023-09-07 15:15:02.407 INFO 2448 [ main] c.s.s.service.impl.ConfigServiceImpl [76] : 修改完毕测试testTransaction OverrideTransactionalSneakyThrowspublic Config testTransaction(Long id) {Config config baseMapper.selectById(id);String testSession testSession: RandomUtil.randomString(3);config.setConfigValue(testSession);log.info(修改的value为:{}, testSession);baseMapper.updateById(config);Config insertConfig new Config();insertConfig.setConfigKey(new DateTime().toString(HH:mm:ss));insertConfig.setConfigValue(new DateTime().toString(HH:mm:ss));baseMapper.insert(insertConfig);log.info(新增的id: insertConfig.getId());//另外一条线程执行CompletableFutureVoid future CompletableFuture.runAsync(() - {//让最后一个线程抛出异常Config config1 baseMapper.selectById(id);log.info(内部查询的value:{}, config1.getConfigValue());QueryWrapperConfig wrapper new QueryWrapper();wrapper.orderByDesc(id).last(limit 1);Config config2 baseMapper.selectOne(wrapper);log.info(查询最新的id: config2.getId());});future.get();log.info(修改完毕);return config;}返回结果: 2023-09-07 15:18:44.025 INFO 29104 [ main] c.s.s.service.impl.ConfigServiceImpl [94] : 修改的value为:testSession:pl8 2023-09-07 15:18:44.171 INFO 29104 [ main] c.s.s.service.impl.ConfigServiceImpl [101] : 新增的id:11 2023-09-07 15:18:44.189 INFO 29104 [onPool-worker-9] c.s.s.service.impl.ConfigServiceImpl [108] : 内部查询的value:testSession:owg 2023-09-07 15:18:44.242 INFO 29104 [onPool-worker-9] c.s.s.service.impl.ConfigServiceImpl [113] : 查询最新的id:10 2023-09-07 15:18:44.243 INFO 29104 [ main] c.s.s.service.impl.ConfigServiceImpl [117] : 修改完毕注意使用同一个sqlsession会导致线程安全问题,testSession方法就是在另外线程里面能读取到数据库里面没有的数据.但是有时候业务就是这么奇怪. 扩展总结 可以看看我的mybatis的简单解析: mybatis的源码解析:https://blog.csdn.net/qq_38366063/category_8574377.html 为什么DefaultSqlSession线程不安全 首先由于JDBC的Connection对象本身不是线程安全的,而session中又只有一个connection,所以不是线程安全的 一次SqlSession的执行最终只会产生一个connection所以我们设想一下在两个线程通过同一个sqlsession来执行crud那么就有可能我先跑完的线程把唯一的这一个连接给关闭掉从而造成另一条线程的逻辑不被成功执行所以在方法里面通过创建SqlSession来执行数据库操作是线程不安全的。就会导致testSession方法的现象. 为什么使用的mapper就不会出现线程安全问题? 因为注入到service类里面的mapper是MapperProxy的代理类,内部是SqlSessionTemplate,而SqlSessionTemplate是线程安全的,因为每次执行方法都会走SqlSessionInterceptor拦截器,创建一个新的SqlSession其实是从当前事务之外得到一个SqlSession如果没有就创造一个新的。然后如果事务被打开且事务管理器是SpringManagedTransactionFactory时将得到的SqlSession同当前事务同步也就是说开启了事务那么SqlSession就是当前事务内的那个SqlSession所有开启了事务仍有一级缓存不开启事务那么每次都新建一个SqlSession那么此时一级缓存就会失效
http://www.w-s-a.com/news/308745/

相关文章:

  • 婚纱摄影网站设计模板如何做好网站内容
  • cdn网站加速招商计划书模板ppt
  • 我在某网站网站做代理开发小程序外包
  • 设计网站国外商城网站的建设费用
  • 网站开发工作需要什么专业学做网站游戏教程
  • 电子商务网站规划 分析 设计杭州网站优化平台
  • 汕头企业自助建站系统网站后台登陆验证码无法显示
  • 宁波网站制作服务做外贸推广自己网站
  • php 微信 网站开发青岛网站互联网公司
  • 网站软件免费下载大全网站建设开发价格高吗
  • asp网站制作软件上海做网站制作
  • 福田区住房和建设局网站好搜搜索引擎
  • 平面设计师看的网站济南机场建设
  • 俄文网站开发翻译平台页面设计模板
  • 建设在线购物网站淮南电商网站建设价格
  • 龙泉市旅游门户网站建设wordpress faq插件
  • 网站的流程图贵阳做网站方舟网络
  • c 做网站开发实例wordpress 加上index
  • 济南seo网站推广搜索广告推广
  • 有关于网站建设的参考文献宁波seo网络推广公司
  • 网站设配色个人主页介绍文案
  • 网站seo相关设置优化网站建设的好处
  • 上海市建设工程安全生产协会网站郴州网站设计公司
  • 网站大型网页游戏自己搭建服务器做视频网站
  • 建立网站企业wordpress用户名密码破解
  • 网站管理助手建站教程国外网站做acm题目比较好
  • 网站开发框架排行专业网页制作服务商
  • 企业网站建设入账政务网站建设信息
  • 网络平台建设是什么江门排名优化怎么做
  • 响应式旅游网站模板下载网址做