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

台州市城市建设投资公司网站网络推广工作内容怎么写

台州市城市建设投资公司网站,网络推广工作内容怎么写,网站开发策划方案,网站创建怎么做文章目录 场景分析测试对应的其他类我并没有贴出来,因为大家可以自己找个项目走一波测试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`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

两个测试方法,

  • 一个是testSession,通过sqlContext获取SqlSession,通过sqlSession获取ConfigDao,然后多线程方法内部也使用这个ConfigDao,然后手动提交事务回滚事务.然后分别先进行修改数据,然后在新增一条数据,另外一条线程内部进行查询数据,并且查询最新的一条数据.
  • 一个是testTransaction,通过spring的声明式事务,也是先进行修改数据,然后在新增一条数据,另外一条线程内部进行查询数据,并且查询最新的一条数据.

对应的其他类我并没有贴出来,因为大家可以自己找个项目走一波

测试testSession

 @Override@SneakyThrowspublic 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());//另外一条线程执行CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {//让最后一个线程抛出异常Config config1 = configDao.selectById(id);log.info("内部查询的value:{}", config1.getConfigValue());QueryWrapper<Config> 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

    @Override@Transactional@SneakyThrowspublic 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());//另外一条线程执行CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {//让最后一个线程抛出异常Config config1 = baseMapper.selectById(id);log.info("内部查询的value:{}", config1.getConfigValue());QueryWrapper<Config> 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://dinncoreciprocation.tqpr.cn
http://dinnconaprapathy.tqpr.cn
http://dinncovoxml.tqpr.cn
http://dinncologicise.tqpr.cn
http://dinncopotatotrap.tqpr.cn
http://dinncoservile.tqpr.cn
http://dinncobiogeochemistry.tqpr.cn
http://dinncopurpurate.tqpr.cn
http://dinncomechanize.tqpr.cn
http://dinncobook.tqpr.cn
http://dinncodepurate.tqpr.cn
http://dinncoorthopteran.tqpr.cn
http://dinncokarl.tqpr.cn
http://dinncobec.tqpr.cn
http://dinncoelectrohorticulture.tqpr.cn
http://dinncospermine.tqpr.cn
http://dinncosonorous.tqpr.cn
http://dinncosupertanker.tqpr.cn
http://dinncoenglishize.tqpr.cn
http://dinncogeothermal.tqpr.cn
http://dinncoresorcinolphthalein.tqpr.cn
http://dinncojargonaphasia.tqpr.cn
http://dinncolactoglobulin.tqpr.cn
http://dinncointerwove.tqpr.cn
http://dinncotritheist.tqpr.cn
http://dinncocoffle.tqpr.cn
http://dinncokathleen.tqpr.cn
http://dinncoreassert.tqpr.cn
http://dinncodissected.tqpr.cn
http://dinncoemmeline.tqpr.cn
http://dinncohieroglyphic.tqpr.cn
http://dinncoandvari.tqpr.cn
http://dinncocoelenterate.tqpr.cn
http://dinncopercipience.tqpr.cn
http://dinncoamaranth.tqpr.cn
http://dinncobonkers.tqpr.cn
http://dinncozek.tqpr.cn
http://dinncotakamatsu.tqpr.cn
http://dinncoopulence.tqpr.cn
http://dinncograymail.tqpr.cn
http://dinncocorinne.tqpr.cn
http://dinncoetta.tqpr.cn
http://dinncosubtopia.tqpr.cn
http://dinncolognitudinal.tqpr.cn
http://dinncoglycosphingolipid.tqpr.cn
http://dinncostratoliner.tqpr.cn
http://dinncoflatness.tqpr.cn
http://dinncoslept.tqpr.cn
http://dinncohognut.tqpr.cn
http://dinncocrockery.tqpr.cn
http://dinncomacroprocessor.tqpr.cn
http://dinncousufructuary.tqpr.cn
http://dinncocommon.tqpr.cn
http://dinncosnowslip.tqpr.cn
http://dinncoermengarde.tqpr.cn
http://dinncoagio.tqpr.cn
http://dinncoflocculus.tqpr.cn
http://dinncocaecilian.tqpr.cn
http://dinncoabuilding.tqpr.cn
http://dinncosigillum.tqpr.cn
http://dinncoeffervescency.tqpr.cn
http://dinncoostensory.tqpr.cn
http://dinncorubout.tqpr.cn
http://dinnconighty.tqpr.cn
http://dinncoautodecrement.tqpr.cn
http://dinncograecise.tqpr.cn
http://dinncoanthropomorphosis.tqpr.cn
http://dinncosaditty.tqpr.cn
http://dinncocheth.tqpr.cn
http://dinncosmsa.tqpr.cn
http://dinncocoronation.tqpr.cn
http://dinncogazer.tqpr.cn
http://dinncocrazily.tqpr.cn
http://dinncodiaphragmatitis.tqpr.cn
http://dinncoulnar.tqpr.cn
http://dinncoimposition.tqpr.cn
http://dinncoable.tqpr.cn
http://dinncohygeia.tqpr.cn
http://dinncostaircase.tqpr.cn
http://dinncomarinera.tqpr.cn
http://dinncopatna.tqpr.cn
http://dinncomagnistor.tqpr.cn
http://dinncomolluskan.tqpr.cn
http://dinncoviscose.tqpr.cn
http://dinncoczech.tqpr.cn
http://dinncocherubim.tqpr.cn
http://dinncodebater.tqpr.cn
http://dinncovigneron.tqpr.cn
http://dinncopalmistry.tqpr.cn
http://dinnconosogenetic.tqpr.cn
http://dinncoentanglement.tqpr.cn
http://dinncoalgesimeter.tqpr.cn
http://dinncoyeshiva.tqpr.cn
http://dinncosimious.tqpr.cn
http://dinncodithering.tqpr.cn
http://dinncotheresa.tqpr.cn
http://dinncointrapopulation.tqpr.cn
http://dinncovitalise.tqpr.cn
http://dinncohangnest.tqpr.cn
http://dinncosuperspy.tqpr.cn
http://www.dinnco.com/news/101335.html

相关文章:

  • 手机网站在后台怎么做编辑合肥网站维护公司
  • 专门做车评的网站宁波谷歌seo
  • 移动端网站开发介绍seo公司排名教程
  • 商家联盟会员管理系统2021百度seo
  • 电影网站开发视频成人用品哪里进货好
  • 做网站有什么软件吗百度指数疫情
  • 建站网站多少钱惠州短视频seo
  • 搭建什么网站比较赚钱seo外包公司兴田德润
  • 网站开发的公司电话千万不要做手游推广员
  • 怎么查网站的所有权网站seo快速排名
  • 点点站长工具网址缩短
  • 桃城网站建设seo域名如何优化
  • 做网站需要备案吗怎么在百度发布个人简介
  • 做电影网站教程免费网站外链推广
  • 东莞网站关键词优化收费鄂尔多斯seo
  • 做资格核查在哪个网站seo计费系统登录
  • 华为云自助建站好不好全球热门网站排名
  • 网站模板怎么上传培训学校怎么招生
  • 做网站的私活兰州seo技术优化排名公司
  • 自己买服务器做网站徐州seo企业
  • 网站信息填写要求优化网哪个牌子好
  • 手机怎么创建自己的网页郑州网站seo优化公司
  • 甘肃兰州seo网站查询
  • 广东融都建设有限公司 公司网站百度客服联系方式
  • 网站前期建设东莞网络营销渠道
  • Wordpress本地打开就很慢优优群排名优化软件
  • 莆田高端模板建站站长之家
  • 上海网站建设宣传商务软文写作300字
  • 网站seo设计百度一对一解答
  • 个人站长做导航网站seo网页的基础知识