MyBatis 关键代码分析
如何创建 SqlSessionorg.apache.ibatis.session.defaults.DefaultSqlSessionFactory 12345678910111213141516171819202122232425262728// 在应用程序中通过sqlSessionFactory获取一个SqlSession对象执行CRUD操作SqlSession sqlSession = sqlSessionFactory.openSession(true);// 在DefaultSqlSessionFactory中获取SqlSession对象@Overridepublic SqlSession openSession(boolean autoCommit) { return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, autoCommit);}// 通过MyBatis配置参数构建SqlSession对象private SqlSession openS...
JDBC 问题
JDBC URL参数解析参考《mysql JDBC URL参数解析》 JDBC数据源配置.xmind jdbc 调用层次在创建事务的时候,调用 createTransaction 会先 getConnection。一开始的时候先试用发出两条语句:select 1;set autocommit=1;测试连接可用性。 12345678910112 = {StackTraceElement@24652} "com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)"3 = {StackTraceElement@24653} "com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2482)"4 = {StackTraceElement@24654} "com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java...
《2021年上半年互联网财产保险市场研究报告》解读
《2021年上半年互联网财产保险市场研究报告》 背景:新冠疫情、平台经济反垄断。特点:业务恢复性增长、产品业态丰富化、市场发展规范化。 业务恢复性增长行业只有70余家财产保险公司。上半年互联网财产保险保费规模排名,前三名为【众安保险】、泰康在线和人保财险。 产品业态丰富**互联网车险凭借其优于线下传统渠道的运营效率和客户服务体验,有效吸引了客户。**这是互联网的技术优势。 互联网意外健康险(也被算在财产险里?):规模占比超40%,产品创新迫在眉睫。尤其是短期健康险,由于其价格低、保额高、保障范围相对较广等特点,在近三年呈现高速增长。以百万医疗险、城市定制型补充医疗保险(以下简称“惠民保”)等为代表的短期健康险的逐步普及,为提高大众风险保障意识起到了积极作用。 互联网信用保证险:助力实体经济,保费实现高速增长。 场景保险值得注意的有: 酒店取消险。 退货运费险。 宠物保险。 这些保险要解决数据积累、风险识别、理赔标准建立、反欺诈管控、服务提升等问题。特别要小心逆选择。 《互联网保险业务监管办法》下发后,行业经营更加规范化,专业中介机构保费占比上升。2021年上半年,互联网财产保...
JDK 的广泛分支
Oracle Hospot JDKjava 8 特定版本以后就不再免费了。 现有的JDK8,2019.1之前的更新都可以免费获取正常使用。 Oracle JDK11是一个长期支持的版本,用于商业环境需要付费。 Azul Zulu builds of OpenJDKZulu 是Azul公司基于OpenJDK发布的Java SE产品,它没有Oracle JDK对使用场景上的诸多限制,可以放心免费下载和使用。它的核心部分就是原汁原味的OpenJDK,没有任何额外的改动——Azul有时候也会对OpenJDK做bug fix,但这些都是通过提交回到OpenJDK去然后再进入到Zulu Java SE产品中的。它与“自己下载OpenJDK源码,自己build”的最大区别是:Azul会在每次发布Zulu产品之前进行充分的测试,build出来的二进制版本符合Java的兼容性测试;同时,Azul有与Oracle签订合作协议,在critical security fix的方面会比公开发布的OpenJDK源码要更早获得补丁,提前做好build与测试工作,基本上可以跟Oracle在同一时间发布打...
Java 并发编程笔记
写在前面的话并发编程最早的实践都在操作系统里。 理论和实践之间是有鸿沟的,要弥合这种鸿沟,通常需要我们去学习别人的实践。比如并发的标准设计思想来自于操作系统里的管程,我们应当学习管程,进而了解标准的并发模型。 juc.xmind Java 线程状态 线程状态列举NEW没有启动过的线程。 RUNNABLE 正在执行的线程。 可以被执行但没有拿到处理器资源。 BLOCKEDblocked 其实是 blocked waiting。1 等待 monitor,进入 synchronized method/block2 或者等 wait()/await()以后再次进入 synchronized method/block(注意这一点,解除 wait 以后以后不是直接 runnable,而是进入 blocked,但这一步非常短暂,几乎不可能用程序观察到)。 WAITING在调用这三种不计时方法以后,线程进入 waiting 态: Object.wait Thread.join LockSupport.park 我们经常在文档里看到的 thread lies do...
SRE-谷歌运维揭秘
SRE-谷歌运维揭秘.xmind
Unix 与 coredump
coredump 是什么当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。 我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。 core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。 为什么会产生coredump文件core产生的原因很多,比如过去一些Unix的版本不支持现代Linux上这种gdb直接附着到进程上进行调试的机制,需要先向进程发送终止信号,然后用工具阅读core文件。在Linux上,我们就可以使用kill向一个指定的进程发送信号或者使用gcore命令来使其主动出core并退出。 如果从浅层次的原因上来讲,出core意味着当前进程存在BUG,需要程序员修复。 从深层次的原因上讲,是当前进程触犯...
基本编程范式、模型和风格
盒子模型表达式由一系列盒子组成,这些盒子相互决定位置和大小。 流水线模型模式-动作范式一系列的输入会被每个模式所检查,模式匹配时,执行相应的输入。 复杂流程总-分架构流程被分为:step1、step2、step3;stage1、stage2、stage3;phase1、phase2、phase3。 数据只要可以在同层内串联,每一层就可能被抽象成 step。如果 step 的输入输出是无关的,则需要使用 context 模式;否则使用 stream 模式,每个 step 可以由<T,R>指定输入输出类型,每个 step 的输出会成为下一个阶段的输入。。每一步如果可以在实现上变化,可以使用策略模式,如果需要实现差异化的聚合,需要使用组合模式。 我们使用 Step 的时候最好先指定<T,R>。
蔡康永的说话之道
阅读本来是赏心悦目的事情。 透过说话,懂得把别人放在心上,这就是我相信的、蔡康永的说话之道。 做自己和没礼貌,常在一线之间。刺耳并不等于简单的“直”。 把话练好,是最划算的事情。把话练好,就是练练把人放在心上。 你有没有能力想象听你讲话的人是什么心情,想听到什么。 练习说话很方便。说话其实就关乎你和别人的想法的交流。单单研究话是没有用的,研究人和人的想法有用。 我们心里其实藏了很多,我们自己都没法搞清楚的事情。 我们应当尽量把我们相信的事,和我们说的话变为一体。 能够打动别人的话,包含了很多“生命能量”,而不只是巧言令色,别有居心。 梦想拥有天使的外表,不如修炼一颗天使的心。与其嫉恶如仇,不如隐恶扬善。 已经很讨人喜欢的你,在未来会更讨人喜欢 转述第三方的赞美,更可信。 你说什么样的话,你就是什么样的人 人把自己内心深处的想法隐藏起来,只会让自己错乱、分裂。 说话和想法的因果有时候会反直觉。 不要简单责备人,修复问题的效果不一定好。 外表好不好看,绝对不是人生的决胜点 讨不讨人喜欢,还比较重要一点。甚至超越一般的、基于能力的量化评价标准。 别人并不是为了伺候你而存在的。要...
基本业务架构设计方法
如何实现自己的 validation123456789101112131415161718192021222324252627282930313233343536373839// 抛出异常private void validateParam(Map<String, String> paramValues) { boolean validate = MapUtils.isEmpty(paramValues) || !paramValues.containsKey(ParamConstant.CUSTOMER_N0) || StringUtils.isEmpty(paramValues.get(ParamConstant.CUSTOMER_N0)); if (validate) { throw new DataBusinessException(ResultCodeEnum.PARAM_NULL); } }...