系列
mybatis-3.4.6 配置介绍
mybatis-3.4.6 顶层配置解析
mybatis-3.4.6 子配置解析
mybatis-3.4.6 mapper解析
mybatis-3.4.6 SQL执行流程
mybatis-3.4.6 SqlSession执行过程
mybatis-3.4.6 缓存介绍
mybatis-3.4.6 自增主键
mybatis-3.4.6 foreach 自增主键
mybatis-3.4.6 事务管理
开篇
1、一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。
2、二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
3、对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。
4、从Cache的层面来说,二级缓存在一级缓存之前生效 。
mybatis一级缓存
public abstract class BaseExecutor implements Executor {
// localCache作为mybatis的一级缓存
protected PerpetualCache localCache;
public List query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId());
if (queryStack == 0 && ms.isFlushCacheRequired()) {
clearLocalCache();
}
List list;
try {
queryStack++;
// 先从localCache查询
list = resultHandler == null ? (List) localCache.getObject(key) : null;
if (list != null) {
// 如果已经存在则直接返回
handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);
} else {
// 缓存不存在就查询DB
list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
}
} finally {
queryStack--;
}
return list;
}
private List queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
List list;
localCache.putObject(key, EXECUTION_PLACEHOLDER);
try {
list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql);
} finally {
localCache.removeObject(key);
}
// 保存到本地缓存
localCache.putObject(key, list);
if (ms.getStatementType() == StatementType.CALLABLE) {
localOutputParameterCache.putObject(key, parameter);
}
return list;
}
}
mybatis一级缓存在SimpleExecutor级别的,BaseExecutor作为SimpleExecutor的父类。
BaseExecutor的localCache用来进行缓存,先查询缓存后查询DB,查询完DB保存到localCache当中。
public class PerpetualCache implements Cache {
private final String id;
private Map cache = new HashMap();
}
mybatis一级缓存是通过PerpetualCache来进行存储的。
mybatis二级缓存
public class CachingExecutor implements Executor {
public List query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)
throws SQLException {
// 通过MappedStatement来进行查询
Cache cache = ms.getCache();
if (cache != null) {
flushCacheIfRequired(ms);
if (ms.isUseCache() && resultHandler == null) {
ensureNoOutParams(ms, boundSql);
@SuppressWarnings("unchecked")
List list = (List) tcm.getObject(cache, key);
// 缓存不存在的情况下由SimpleExecutor来执行query
if (list == null) {
list = delegate. query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
tcm.putObject(cache, key, list); // issue #578 and #116
}
return list;
}
}
// 缓存不允许的情况下由SimpleExecutor来执行query
return delegate. query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
}
}
二级缓存在CachingExecutor层被使用。
二级缓存是MappedStatement级别的,从MappedStatement当中查询Cache对象。
在允许使用二级缓存的场景下优先查询二级缓存,没有的情况下通过SimpleExecutor查询DB。
二级缓存是由TransactionalCache进行管理的。
public class TransactionalCache implements Cache {
private static final Log log = LogFactory.getLog(TransactionalCache.class);
private final Cache delegate;
private boolean clearOnCommit;
private final Map entriesToAddOnCommit;
private final Set entriesMissedInCache;
public TransactionalCache(Cache delegate) {
this.delegate = delegate;
this.clearOnCommit = false;
this.entriesToAddOnCommit = new HashMap();
this.entriesMissedInCache = new HashSet();
}
public Object getObject(Object key) {
// issue #116
Object object = delegate.getObject(key);
if (object == null) {
entriesMissedInCache.add(key);
}
// issue #146
if (clearOnCommit) {
return null;
} else {
return object;
}
}
@Override
public void putObject(Object key, Object object) {
entriesToAddOnCommit.put(key, object);
}
}
TransactionalCache的entriesToAddOnCommit负载保存二级缓存的数据。
mybatis二级缓存的MappedStatement
public final class MappedStatement {
// 省略其他变量
// 二级缓存的cache对象
private Cache cache;
// 是否使用二级缓存
private boolean useCache;
}
MappedStatement内部保存是否使用二级缓存的配置信息。
public class XMLStatementBuilder extends BaseBuilder {
public void parseStatementNode() {
String id = context.getStringAttribute("id");
String databaseId = context.getStringAttribute("databaseId");
// 针对SELECT的命令行
boolean isSelect = sqlCommandType == SqlCommandType.SELECT;
// 针对SELECT的命令默认是不刷新cache的
boolean flushCache = context.getBooleanAttribute("flushCache", !isSelect);
// 针对SELECT的命令默认是使用cache的
boolean useCache = context.getBooleanAttribute("useCache", isSelect);
builderAssistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType,
fetchSize, timeout, parameterMap, parameterTypeClass, resultMap, resultTypeClass,
resultSetTypeEnum, flushCache, useCache, resultOrdered,
keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets);
}
}
在生成MappedStatement对象时候,针对select操作flushCache默认为false,useCache默认是开启。
public class XMLStatementBuilder extends BaseBuilder {
private void configurationElement(XNode context) {
try {
String namespace = context.getStringAttribute("namespace");
if (namespace == null || namespace.equals("")) {
throw new BuilderException("Mapper's namespace cannot be empty");
}
builderAssistant.setCurrentNamespace(namespace);
cacheRefElement(context.evalNode("cache-ref"));
// 负责解析cache节点
cacheElement(context.evalNode("cache"));
parameterMapElement(context.evalNodes("/mapper/parameterMap"));
resultMapElements(context.evalNodes("/mapper/resultMap"));
sqlElement(context.evalNodes("/mapper/sql"));
buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
} catch (Exception e) {
throw new BuilderException("Error parsing Mapper XML. The XML location is '" + resource + "'. Cause: " + e, e);
}
}
private void cacheElement(XNode context) throws Exception {
if (context != null) {
String type = context.getStringAttribute("type", "PERPETUAL");
Class typeClass = typeAliasRegistry.resolveAlias(type);
String eviction = context.getStringAttribute("eviction", "LRU");
Class evictionClass = typeAliasRegistry.resolveAlias(eviction);
Long flushInterval = context.getLongAttribute("flushInterval");
Integer size = context.getIntAttribute("size");
boolean readWrite = !context.getBooleanAttribute("readOnly", false);
boolean blocking = context.getBooleanAttribute("blocking", false);
Properties props = context.getChildrenAsProperties();
// 设置是否使用Cache
builderAssistant.useNewCache(typeClass, evictionClass, flushInterval, size, readWrite, blocking, props);
}
}
}
public class MapperBuilderAssistant extends BaseBuilder {
public Cache useNewCache(Class typeClass,
Class evictionClass,
Long flushInterval,
Integer size,
boolean readWrite,
boolean blocking,
Properties props) {
Cache cache = new CacheBuilder(currentNamespace)
.implementation(valueOrDefault(typeClass, PerpetualCache.class))
.addDecorator(valueOrDefault(evictionClass, LruCache.class))
.clearInterval(flushInterval)
.size(size)
.readWrite(readWrite)
.blocking(blocking)
.properties(props)
.build();
configuration.addCache(cache);
currentCache = cache;
return cache;
}
}
XMLStatementBuilder的cacheElement(context.evalNode("cache"))负责创建二级缓存的cache对象。
public class MapperBuilderAssistant extends BaseBuilder {
public MappedStatement addMappedStatement(
String id,
SqlSource sqlSource,
StatementType statementType,
SqlCommandType sqlCommandType,
Integer fetchSize,
Integer timeout,
String parameterMap,
Class parameterType,
String resultMap,
Class resultType,
ResultSetType resultSetType,
boolean flushCache,
boolean useCache,
boolean resultOrdered,
KeyGenerator keyGenerator,
String keyProperty,
String keyColumn,
String databaseId,
LanguageDriver lang,
String resultSets) {
id = applyCurrentNamespace(id, false);
boolean isSelect = sqlCommandType == SqlCommandType.SELECT;
MappedStatement.Builder statementBuilder = new MappedStatement.Builder(configuration, id, sqlSource, sqlCommandType)
.resource(resource)
.fetchSize(fetchSize)
.timeout(timeout)
.statementType(statementType)
.keyGenerator(keyGenerator)
.keyProperty(keyProperty)
.keyColumn(keyColumn)
.databaseId(databaseId)
.lang(lang)
.resultOrdered(resultOrdered)
.resultSets(resultSets)
.resultMaps(getStatementResultMaps(resultMap, resultType, id))
.resultSetType(resultSetType)
.flushCacheRequired(valueOrDefault(flushCache, !isSelect))
// 设置是否使用cache
.useCache(valueOrDefault(useCache, isSelect))
.cache(currentCache);
ParameterMap statementParameterMap = getStatementParameterMap(parameterMap, parameterType, id);
if (statementParameterMap != null) {
statementBuilder.parameterMap(statementParameterMap);
}
MappedStatement statement = statementBuilder.build();
configuration.addMappedStatement(statement);
return statement;
}
}
configuration.addMappedStatement(statement)负责保存MappedStatement对象。
参考文章
源码参考
mybatis官网介绍
深入理解mybatis原理
Mybatis3.4.x技术内幕
mybatis 3.x源码深度解析与最佳实践
你可能感兴趣的:(mybatis-3.4.6 缓存介绍)
Elasticsearch平台介绍
yzhujue
elasticsearch
1简介Elasticsearch是一个实时分布式搜索和分析引擎。它能以很高的速度处理数据。它用于全文搜索、结构化搜索、分析以及将这三者混合使用。Ø维基百科使用Elasticsearch提供全文搜索并高亮关键字,以及输入实时搜索(search-as-you-type)和搜索纠错(did-you-mean)等搜索建议功能。Ø英国卫报使用Elasticsearch结合用户日志和社交网络数据提供给他们的编
YashanDB分布式部署
数据库
本文内容来自YashanDB官网,原文内容请见https://doc.yashandb.com/yashandb/23.3/zh/%E5%AE%89%E8%A3%85%...本文以典型规格(3台服务器,1个MN组、2个CN、1个DN组,DN组和MN组均为1主2备)为例,介绍分布式部署形态的安装步骤。执行安装部署前,请以安装用户(yashan)登录192.168.1.2服务器,并进入/home/ya
YashanDB共享集群部署
数据库
本文内容来自YashanDB官网,原文内容请见https://doc.yashandb.com/yashandb/23.3/zh/%E5%AE%89%E8%A3%85%...本文以典型规格(2台服务器,1共享存储且包含3个及以上LUN)为例,介绍共享集群部署形态的安装步骤。执行安装部署前,请以安装用户(yashan)登录192.168.1.2服务器,并进入/home/yashan/install安
Qt中的核心机制--信号与槽
追烽少年x
Qt基础 qt
Qt中的核心机制—信号与槽一、信号与槽介绍**信号(Signal)*就是特定情况下被发射的事件。**槽(Slot)*就是对信号响应的函数。信号与槽进行关联是用QObject::connect()函数实现的,其基本格式是:QObject::connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));connect()函数是QObject类的一个静态函
HTML到PDF转换,11K Star 的pdfmake.js轻松应对
在Web开发中,将HTML页面转换为PDF文件是一项常见的需求。无论是生成报告、发票、还是其他任何需要打印或以PDF格式分发的文档,开发者都需要一个既简单又可靠的解决方案。幸运的是,pdfmake.js库以其轻量级、高性能和易用性,成为了许多开发者的首选。本文将介绍如何使用这个拥有11KStar的GitHub项目来实现HTML到PDF的转换。什么是pdfmake.jspdfmake.js是一个基于
智能优化算法应用:基于旗鱼算法与双伽马校正的图像自适应增强算法
智能算法研学社(Jack旭)
智能优化算法应用 图像增强 算法 计算机视觉 人工智能
智能优化算法应用:基于旗鱼算法与双伽马校正的图像自适应增强算法-附代码文章目录智能优化算法应用:基于旗鱼算法与双伽马校正的图像自适应增强算法-附代码1.全局双伽马校正2.旗鱼算法3.适应度函数设计4.实验与算法结果5.参考文献6.Matlab代码摘要:本文主要介绍基于旗鱼算法与双伽马校正的图像自适应增强算法。1.全局双伽马校正设图像的灰度值范围被归一化到[0,1]范围之内,基于全局亮度的双伽马调整
Elasticsearch 学习
Anthonywish
java 后端 elasticsearch springdata 全文检索
内容摘要安装Elasticsearch使用Rest的API操作索引使用Rest的API查询数据使用Rest的API聚合数据SpringDataElasticsearch使用1.Elasticsearch介绍和安装用户访问我们的首页,一般都会直接搜索来寻找自己想要购买的商品。而商品的数量非常多,而且分类繁杂。如果能正确的显示出用户想要的商品,并进行合理的过滤,尽快促成交易,是搜索系统要研究的核心。面
qt.network.ssl: QSslSocket: cannot call unresolved function 问题解决
清海风缘
Qt qt.network.ssl
转:Qt5.4.2实现一个简单的浏览器及相关问题的解决首先,介绍一下我使用的Qt版本:QtCreator3.4.1(opensource)BasedonQt5.4.2(MSVC2013,32bit)BuiltonMay28201519:07:19运行平台为Windows。至于linux平台,以后再说吧。主要使用的是Qt中的QtWebKit和QWebView。这里Qt5做了相应的调整,可视化的QWe
基于Stm32单片机的串口通信协议
日富一日,加油
stm32 嵌入式硬件 单片机
目录一、串口介绍1、电平标准2、串口参数及时序二、串口收发功能实现1、配置串口原理2、代码实现三、串口数据包发送1、状态机2、代码实现一、串口介绍串口:是一种应用十分广泛的通讯接口,串口成本低,容易使用,通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机,单片机与电脑,单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。使用起来比较简单:
从 XMLHttpRequest 到 Fetch:现代 Web 请求技术的演进
vvilkim
JavaScript 现代WEB技术 前端 javascript 信息与通信
在现代Web开发中,与服务器进行数据交互是必不可少的一部分。无论是加载动态内容、提交表单数据,还是实现实时更新,都需要通过HTTP请求来完成。本文将介绍两种主流的Web请求技术:XMLHttpRequest和FetchAPI,探讨它们的优缺点、使用场景以及如何选择合适的技术。1.XMLHttpRequest:Web请求的基石什么是XMLHttpRequest?XMLHttpRequest是一个Ja
关于redis同步的简单理解
m0_71908411
redis
其实像一般的情况,直接从数据库层面去删除和修改,然后清空缓存。但是像视频播放需要频繁提交记录,就需要合并写操作,这个时候往往会在缓存中去修改或者删除,然后用异步延迟任务去修改数据库。以上两种情况是有区别滴!
Redis面试——redis基础、5种数据类型、持久化、主从模式、哨兵
丢丢diu丢
Redis面试 分布式 数据库
问题目录1.5种基本数据类型2.分布式锁3.缓存一致性4.缓存穿透、击穿、雪崩5.跳表1.Redis前言0.Redis为什么这么快?1.纯内存操作:读取不需要进行磁盘I/O,所以比传统数据库要快上不少;(但不要有误区说磁盘就一定慢,例如Kafka就是使用磁盘顺序读取但仍然较快)2.单线程,无锁竞争:这保证了没有线程的上下文切换,不会因为多线程的一些操作而降低性能;3.多路I/O复用模型,非阻塞I/
如何禁止用户调试你的页面?
乐闻x
前端知识图谱 chrome 前端 web javascript
前言在当今互联网时代,保护网页的源代码和用户数据变得愈发重要。但我们都知道,用户可以通过浏览器的开发者工具轻松查看和调试网页源代码。本文将介绍几种常见的方法,帮助你禁止用户调试你的页面。当然,需要指出的是,这些方法并不能百分之百地完全阻止用户,但可以增加他们的调试难度。实现方式一、禁用右键菜单禁用右键菜单是最常见也是最简单的一种方法。通过禁用右键菜单,可以阻止用户直接右键查看网页源代码。实现方法:
华为云数据库GaussDB(for Cassandra)揭秘:内存异常增长的排查经历
科技说
jvm java 开发语言
内存异常增长的排查经历背景介绍华为云数据库GaussDB(forCassandra)是一款基于计算存储分离架构,兼容Cassandra生态的云原生NoSQL数据库;它依靠共享存储池实现了强一致,保证数据的安全可靠。核心特点是:存算分离、低成本、高性能。问题描述GaussDB(forCassandra)自研架构下遇到一些挑战性问题,比如cpu过高,内存泄漏,内存异常增长,时延高等问题,这些也都是开发
TypeScript系列01-类型系统全解析
Mr.NickJJ
Typescript系列 typescript 前端 javascript
本文总结了TypeScript的类型系统基础,涵盖了:TypeScript的价值:静态类型检查为JavaScript添加了类型安全保障基本类型系统:从原始类型到特殊类型(any、unknown、never)的完整介绍类型注解与推断:理解何时依赖自动推断,何时显式标注类型类型兼容性:掌握TypeScript结构类型系统的核心规则1.TypeScript介绍1.1与JavaScript的关系TypeS
Redis雪崩、穿透、击穿及其解决方案
Good Note
redis 数据库 缓存 开发语言 golang 面试 SQL
大家好,这里是编程Cookbook,关注公众号「编程Cookbook」,获取更多面试资料。本文先简要介绍为什么需要使用Redis,以及过期键的删除策略,进而详细介绍Redis雪崩、穿透、击穿的发生场景和解决方案。文章目录前情提要为什么使用redis?Redis的过期键删除策略数据读取流程三种问题及解决方案1.缓存雪崩2.缓存穿透3.缓存击穿对比总结历史文章MySQL数据库Redis前情提要关注公众
MySQL数据库笔记——主从复制
Good Note
MySQL数据库笔记 数据库 mysql 笔记 sql 数据库架构
大家好,这里是编程Cookbook,关注公众号「编程Cookbook」,获取更多面试资料。本文详细介绍MySQL的主从复制,从原理到配置再到同步过程。文章目录简介核心组件主从复制的原理作用主从复制的线程模型主从复制的模式形式一主一从一主多从多主一从双主复制级联复制复制的方式基于语句的逻辑复制(Statement-BasedReplication,SBR)基于行的物理复制(Row-BasedRepl
Python 3.8.10 for Windows:开启编程之旅的完美选择
裴涓斐Kathy
Python3.8.10forWindows:开启编程之旅的完美选择python3.8.zip项目地址:https://gitcode.com/open-source-toolkit/dd07d项目介绍Python3.8.10forWindows是一款专为Windows用户设计的Python安装包,旨在为Windows7及更高版本的操作系统提供稳定、高效的Python环境。无论您是Python编程
推荐开源项目:NeoTerm - 21世纪的Android终端模拟器
纪亚钧
推荐开源项目:NeoTerm-21世纪的Android终端模拟器项目地址:https://gitcode.com/gh_mirrors/ne/NeoTerm1、项目介绍在今天的数字化时代,一款高效且设计现代的终端模拟器是开发者和高级用户的必备工具。【NeoTerm】正是这样一个专为Android设备打造的创新型解决方案,它的目标是成为安卓平台上最出色的终端应用。我们的承诺不同于传统的终端模拟器,N
手把手教你学simulink实例--基于Simulink的电动汽车智能驾驶辅助系统场景适应性与鲁棒性仿真
小蘑菇二号
手把手教你学 MATLAB 专栏 手把手教你学 Simulink SIMULINK
目录基于Simulink的电动汽车智能驾驶辅助系统场景适应性与鲁棒性仿真基于Simulink的电动汽车智能驾驶辅助系统场景适应性与鲁棒性仿真1.背景介绍1.1项目背景随着自动驾驶技术的快速发展,智能驾驶辅助系统(ADAS,AdvancedDriverAssistanceSystems)在电动汽车中的应用越来越广泛。这些系统通过感知环境、规划路径和控制车辆来提高
Redis数据库面试——数据结构类型知识
Good Note
数据库 redis 面试 开发语言 春招 缓存 SQL
大家好,这里是GoodNote,关注公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Redis提供的5种基本数据结构类型和4种特殊类型,除此之外,还有8种底层数据结构,每种结构类型有其特点和适用场景。文章目录基本数据类型1.String(字符串)使用场景缓存计数器ID生成器分布式锁2.Hash(哈希)3.List(链表/列表)4.Set(集合)5.SortedSet(有序集合)特殊
C语言高效内存管理:对齐、缓存与位域
全栈ing小甘
C语言 c语言 缓存优化 内存对齐 内存模型与布局
C语言高效内存管理:对齐、缓存与位域一、内存对齐1.内存对齐的概念内存对齐(MemoryAlignment)是指数据在内存中存储时,其起始地址遵循特定的规则,使得数据能够被高效地访问。CPU通常以固定的字节数(对齐边界)读取内存数据,未对齐的数据访问可能导致性能下降或硬件异常。对齐边界:数据类型的大小通常决定了其对齐边界。例如,4字节(32位)的float通常要求4字节对齐,8字节(64位)的do
[前端笔记——HTML介绍] 3.<head>标签里有什么?
弓早早o_O
前端 # 前端 html
[前端笔记——HTML介绍]3.head标签里有什么?1.标题2.元数据:元素3.在站点增加自定义图标4.HTML中应用CSS和JavaScript5.为文档设定主语言元素的内容不会再浏览器中显示,它的作用是保存页面的一些元数据。接下来介绍几个head中重要的常用元素:1.标题元素可以为文档添加标题。注意和的区别:元素在页面加载完毕时显示在页面中,是为body添加标题的,通常只出现一次,用来标记页
鸿蒙HarmonyOS NEXT实战开发:自定义视图实现Tab效果案例
前端_王华QAQ
鸿蒙 鸿蒙next实战 harmonyos 华为 鸿蒙系统 鸿蒙 android
介绍本示例介绍使用Text、List等组件,添加点击事件onclick,动画,animationTo实现自定义Tab效果。效果预览图使用说明点击页签进行切换,选中态页签字体放大加粗,颜色由灰变黑,起到强调作用,同时,底部颜色条横线位移到当前选中页签下方,内容区翻页到当前选中页签对应区域。实现思路页签实现:添加onClick方法,记录点击的index,index变化后,改变页签颜色、字体大小,使用a
Go编程基础——详细讲解Golang的语法特性和运行机制
AI天才研究院
一天一门编程语言 Golang实战 自然语言处理 人工智能 语言模型 编程实践 开发语言 架构设计
作者:禅与计算机程序设计艺术1.简介Go语言(又称Golang)是Google开发的一门新的开源编程语言,在2009年发布。它主要被用于构建简单、可靠且高效的分布式系统应用。本书旨在帮助读者快速掌握Go语言的使用方法并理解其特性,能够写出更加健壮和可维护的程序。《Go编程基础》一书由五个部分构成,分别介绍了Go语言中的数据类型、流程控制语句、函数、接口、并发编程等方面的知识。每章的最后还有一个练习
双链路提升网络传输的可靠性扩展可用带宽
月光技术杂谈
WIFI 网络 双链路 可靠性 链路聚合 带宽叠加 冗余通信
为了提升网络传输的可靠性或增加网络可用带宽,通常使用双链路冗余备份或者双链路聚合的方式。本文介绍几种双链路网络通信的案例。5G+WiFi冗余传输双Socket绑定不同网络接口:通过Android的ConnectivityManager绑定5G蜂窝网络和WiFi的Socket连接,实现双链路并行传输。动态切换策略:根据信号强度(RSSI)和带宽实时切换主链路(如5G用于大流量传输,WiFi用于低延迟
CI/CD工具链实战:如何让研发效能飙升300%?
开车不喝九
devops ci/cd 容器 docker 运维 ezone
在DevOps成熟度调研中,82%的高效能团队已将CI/CD工具链升级为智能编排平台(数据来源:2023DevOps年度报告)。本文深度解析ezPipeline如何通过六大创新设计,帮助研发团队突破传统工具的效能瓶颈。本文将介绍CI/CD工具链的核心理念、如何助力研发效能提升,并推荐两三款优秀的工具供大家参考。什么是CI/CD?CI/CD是指持续集成(ContinuousIntegration)、
Cocos Creator3.8.6拖拽物体的几种方式
Felix_Fly2021
Cocos 游戏引擎 CocosCreator Cocos
文章目录前言一、第一种通过UILocation二、第二种通过UIDelta实现总结前言在游戏开发中,拖拽物体是一个非常常见的交互功能,无论是用于UI元素的拖动,还是场景中物体的移动,拖拽操作都能极大地提升用户体验。CocosCreator3.8.6作为一款强大的游戏开发引擎,提供了多种实现拖拽功能的方式,开发者可以根据具体需求选择最适合的方案。本文将详细介绍在CocosCreator3.8.6中实
Java后端面试到底要如何准备?
财高八斗者
Java程序员 Java Java编程 java 面试 jvm
我把面试准备拆成以下几个步骤:1.写简历2.整理好自己最熟悉的项目,相对有代表性的项目。3.整理自己的技术栈4.收拾好自己的自我介绍5.被八股文6.模拟面试7.针对模拟面试表现出来的问题进行改进8.开始投投简历本人10年开发经验,做过coder、做过领导、也做过架构师,面试过500人+。现在全职做技术分享和面试辅导。针对自己多年的面试经验,以及被面试的经验,我自己整理了一份面试小抄:《面试小抄》《
前端vue面试题
微微的猪食小窝
vue面试题 ajax node.js vue.js
一.自我介绍(我是谁来自哪里,今天来的目的,面试的岗位是什么,几年的工作经验,掌握的技术栈有哪些,开发过什么项目,项目中负责的板块是什么)面试官您好!我叫XXX,来自XXX,很荣幸能来我们公司面试,我从事前端开发有3年了,目前掌握的技术有html,css,js,ajax,vue,小程序,参与过各种类型的项目。我做过的项目有A,B,C,D,E那么最近做的一个项目是XXX在这个项目中我主要负责的板块是
Nginx负载均衡
510888780
nginx 应用服务器
Nginx负载均衡一些基础知识:
nginx 的 upstream目前支持 4 种方式的分配
1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)、weight
指定轮询几率,weight和访问比率成正比
RedHat 6.4 安装 rabbitmq
bylijinnan
erlang rabbitmq redhat
在 linux 下安装软件就是折腾,首先是测试机不能上外网要找运维开通,开通后发现测试机的 yum 不能使用于是又要配置 yum 源,最后安装 rabbitmq 时也尝试了两种方法最后才安装成功
机器版本:
[root@redhat1 rabbitmq]# lsb_release
LSB Version: :base-4.0-amd64:base-4.0-noarch:core
FilenameUtils工具类
eksliang
FilenameUtils common-io
转载请出自出处:http://eksliang.iteye.com/blog/2217081 一、概述
这是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的类FilenameUtils跟FileUtils,其中FilenameUtils是对文件名操作的封装;FileUtils是文件封装,开发中对文件的操作,几乎都可以在这个框架里面找到。 非常的好用。
xml文件解析SAX
不懂事的小屁孩
xml
xml文件解析:xml文件解析有四种方式,
1.DOM生成和解析XML文档(SAX是基于事件流的解析)
2.SAX生成和解析XML文档(基于XML文档树结构的解析)
3.DOM4J生成和解析XML文档
4.JDOM生成和解析XML
本文章用第一种方法进行解析,使用android常用的DefaultHandler
import org.xml.sax.Attributes;
通过定时任务执行mysql的定期删除和新建分区,此处是按日分区
酷的飞上天空
mysql
使用python脚本作为命令脚本,linux的定时任务来每天定时执行
#!/usr/bin/python
# -*- coding: utf8 -*-
import pymysql
import datetime
import calendar
#要分区的表
table_name = 'my_table'
#连接数据库的信息
host,user,passwd,db =
如何搭建数据湖架构?听听专家的意见
蓝儿唯美
架构
Edo Interactive在几年前遇到一个大问题:公司使用交易数据来帮助零售商和餐馆进行个性化促销,但其数据仓库没有足够时间去处理所有的信用卡和借记卡交易数据
“我们要花费27小时来处理每日的数据量,”Edo主管基础设施和信息系统的高级副总裁Tim Garnto说道:“所以在2013年,我们放弃了现有的基于PostgreSQL的关系型数据库系统,使用了Hadoop集群作为公司的数
spring学习——控制反转与依赖注入
a-john
spring
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。
用spool+unixshell生成文本文件的方法
aijuans
xshell
例如我们把scott.dept表生成文本文件的语句写成dept.sql,内容如下:
set pages 50000;
set lines 200;
set trims on;
set heading off;
spool /oracle_backup/log/test/dept.lst;
select deptno||','||dname||','||loc
1、基础--名词解析(OOA/OOD/OOP)
asia007
学习基础知识
OOA:Object-Oriented Analysis(面向对象分析方法)
是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。
OOA(面向对象的分析)模型由5个层次(主题层、对象类层、结构层、属性层和服务层)
浅谈java转成json编码格式技术
百合不是茶
json编码 java转成json编码
json编码;是一个轻量级的数据存储和传输的语言
在java中需要引入json相关的包,引包方式在工程的lib下就可以了
JSON与JAVA数据的转换(JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非
常适合于服务器与 JavaScript 之间的数据的交
web.xml之Spring配置(基于Spring+Struts+Ibatis)
bijian1013
java web.xml SSI spring配置
指定Spring配置文件位置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-dao-bean.xml,/WEB-INF/spring-resources.xml,
/WEB-INF/
Installing SonarQube(Fail to download libraries from server)
sunjing
Install Sonar
1. Download and unzip the SonarQube distribution
2. Starting the Web Server
The default port is "9000" and the context path is "/". These values can be changed in &l
【MongoDB学习笔记十一】Mongo副本集基本的增删查
bit1129
mongodb
一、创建复本集
假设mongod,mongo已经配置在系统路径变量上,启动三个命令行窗口,分别执行如下命令:
mongod --port 27017 --dbpath data1 --replSet rs0
mongod --port 27018 --dbpath data2 --replSet rs0
mongod --port 27019 -
Anychart图表系列二之执行Flash和HTML5渲染
白糖_
Flash
今天介绍Anychart的Flash和HTML5渲染功能
HTML5
Anychart从6.0第一个版本起,已经逐渐开始支持各种图的HTML5渲染效果了,也就是说即使你没有安装Flash插件,只要浏览器支持HTML5,也能看到Anychart的图形(不过这些是需要做一些配置的)。
这里要提醒下大家,Anychart6.0版本对HTML5的支持还不算很成熟,目前还处于
Laravel版本更新异常4.2.8-> 4.2.9 Declaration of ... CompilerEngine ... should be compa
bozch
laravel
昨天在为了把laravel升级到最新的版本,突然之间就出现了如下错误:
ErrorException thrown with message "Declaration of Illuminate\View\Engines\CompilerEngine::handleViewException() should be compatible with Illuminate\View\Eng
编程之美-NIM游戏分析-石头总数为奇数时如何保证先动手者必胜
bylijinnan
编程之美
import java.util.Arrays;
import java.util.Random;
public class Nim {
/**编程之美 NIM游戏分析
问题:
有N块石头和两个玩家A和B,玩家A先将石头随机分成若干堆,然后按照BABA...的顺序不断轮流取石头,
能将剩下的石头一次取光的玩家获胜,每次取石头时,每个玩家只能从若干堆石头中任选一堆,
lunce创建索引及简单查询
chengxuyuancsdn
查询 创建索引 lunce
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Docume
[IT与投资]坚持独立自主的研究核心技术
comsci
it
和别人合作开发某项产品....如果互相之间的技术水平不同,那么这种合作很难进行,一般都会成为强者控制弱者的方法和手段.....
所以弱者,在遇到技术难题的时候,最好不要一开始就去寻求强者的帮助,因为在我们这颗星球上,生物都有一种控制其
flashback transaction闪回事务查询
daizj
oracle sql 闪回事务
闪回事务查询有别于闪回查询的特点有以下3个:
(1)其正常工作不但需要利用撤销数据,还需要事先启用最小补充日志。
(2)返回的结果不是以前的“旧”数据,而是能够将当前数据修改为以前的样子的撤销SQL(Undo SQL)语句。
(3)集中地在名为flashback_transaction_query表上查询,而不是在各个表上通过“as of”或“vers
Java I/O之FilenameFilter类列举出指定路径下某个扩展名的文件
游其是你
FilenameFilter
这是一个FilenameFilter类用法的例子,实现的列举出“c:\\folder“路径下所有以“.jpg”扩展名的文件。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
C语言学习五函数,函数的前置声明以及如何在软件开发中合理的设计函数来解决实际问题
dcj3sjt126com
c
# include <stdio.h>
int f(void) //括号中的void表示该函数不能接受数据,int表示返回的类型为int类型
{
return 10; //向主调函数返回10
}
void g(void) //函数名前面的void表示该函数没有返回值
{
//return 10; //error 与第8行行首的void相矛盾
}
in
今天在测试环境使用yum安装,遇到一个问题: Error: Cannot retrieve metalink for repository: epel. Pl
dcj3sjt126com
centos
今天在测试环境使用yum安装,遇到一个问题:
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
处理很简单,修改文件“/etc/yum.repos.d/epel.repo”, 将baseurl的注释取消, mirrorlist注释掉。即可。
&n
单例模式
shuizhaosi888
单例模式
单例模式 懒汉式
public class RunMain {
/**
* 私有构造
*/
private RunMain() {
}
/**
* 内部类,用于占位,只有
*/
private static class SingletonRunMain {
priv
Spring Security(09)——Filter
234390216
Spring Security
Filter
目录
1.1 Filter顺序
1.2 添加Filter到FilterChain
1.3 DelegatingFilterProxy
1.4 FilterChainProxy
1.5
公司项目NODEJS实践0.1
逐行分析JS源代码
mongodb nginx ubuntu nodejs
一、前言
前端如何独立用nodeJs实现一个简单的注册、登录功能,是不是只用nodejs+sql就可以了?其实是可以实现,但离实际应用还有距离,那要怎么做才是实际可用的。
网上有很多nod
java.lang.Math
liuhaibo_ljf
java Math lang
System.out.println(Math.PI);
System.out.println(Math.abs(1.2));
System.out.println(Math.abs(1.2));
System.out.println(Math.abs(1));
System.out.println(Math.abs(111111111));
System.out.println(Mat
linux下时间同步
nonobaba
ntp
今天在linux下做hbase集群的时候,发现hmaster启动成功了,但是用hbase命令进入shell的时候报了一个错误 PleaseHoldException: Master is initializing,查看了日志,大致意思是说master和slave时间不同步,没办法,只好找一种手动同步一下,后来发现一共部署了10来台机器,手动同步偏差又比较大,所以还是从网上找现成的解决方
ZooKeeper3.4.6的集群部署
roadrunners
zookeeper 集群 部署
ZooKeeper是Apache的一个开源项目,在分布式服务中应用比较广泛。它主要用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步、集群管理、配置文件管理、同步锁、队列等。这里主要讲集群中ZooKeeper的部署。
1、准备工作
我们准备3台机器做ZooKeeper集群,分别在3台机器上创建ZooKeeper需要的目录。
数据存储目录
Java高效读取大文件
tomcat_oracle
java
读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path)); 这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致
微信支付api返回的xml转换为Map的方法
xu3508620
xml map 微信api
举例如下:
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><