目录
二级缓存的定义
二级缓存扩展性需求
二级缓存的结构
SynchronizedCache线程同步缓存区
LoggingCache统计命中率以及打印日志
ScheduledCache过期清理缓存区
LruCache(最近最少使用)防溢出缓存区
FifoCache(先进先出)防溢出缓存区
二级缓存的使用(命中条件)
二级缓存的配置
二级缓存为什么要提交之后才能命中缓存?
二级缓存执行流程
二级缓存的定义
二级缓存也称作是应用级缓存,与一级缓存不同的是它的作用范围是整个应用,而且可以跨线程使用。所以二级缓存有更高的命中率,适合缓存一些修改比较少的数据。
二级缓存扩展性需求
二级缓存的生命周期是整个应用,所以必须限制二级缓存的容量,在这里mybatis使用的是溢出淘汰机制。而一级缓存是会话级的生命周期非常短暂是没有必要实现这些功能的。相比较之下,二级缓存机制更加完善。
二级缓存的结构
二级缓存在结构设计上采用装饰器+责任链模式
1)二级缓存是如何组装这些装饰器的呢?
这里我们先介绍一下CacheBuilder类顾名思义这是一个缓存构建类。该类就是二级缓存的构建类里面定义了一些上图装饰器类型的属性,以及构建组合这些装饰器的行为。
源码分析:
public Cache build() {
this.setDefaultImplementations();
Cache cache = this.newBaseCacheInstance(this.implementation, this.id);
this.setCacheProperties((Cache)cache);
if (PerpetualCache.class.equals(cache.getClass())) {
Iterator var2 = this.decorators.iterator();
while(var2.hasNext()) {
Class decorator = (Class)var2.next();
cache = this.newCacheDecoratorInstance(decorator, (Cache)cache);
this.setCacheProperties((Cache)cache);
}
cache = this.setStandardDecorators((Cache)cache);
} else if (!LoggingCache.class.isAssignableFrom(cache.getClass())) {
cache = new LoggingCache((Cache)cache);
}
return (Cache)cache;
}
private void setDefaultImplementations() {
if (this.implementation == null) {
this.implementation = PerpetualCache.class;
if (this.decorators.isEmpty()) {
this.decorators.add(LruCache.class);
}
}
}
private Cache setStandardDecorators(Cache cache) {
try {
MetaObject metaCache = SystemMetaObject.forObject(cache);
if (this.size != null && metaCache.hasSetter("size")) {
metaCache.setValue("size", this.size);
}
if (this.clearInterval != null) {
cache = new ScheduledCache((Cache)cache);
((ScheduledCache)cache).setClearInterval(this.clearInterval);
}
if (this.readWrite) {
cache = new SerializedCache((Cache)cache);
}
Cache cache = new LoggingCache((Cache)cache);
cache = new SynchronizedCache(cache);
if (this.blocking) {
cache = new BlockingCache((Cache)cache);
}
return (Cache)cache;
} catch (Exception var3) {
throw new CacheException("Error building standard cache decorators. Cause: " + var3, var3);
}
}
SynchronizedCache线程同步缓存区
实现线程同步功能,与序列化缓存区共同保证二级缓存线程安全。若blocking=false关闭则SynchronizedCache位于责任链的最前端,否则就位于BlockingCache后面而BlockingCache位于责任链的最前端,从而保证了整条责任链是线程同步的。
源码分析:只是对于操作缓存的方法进行了线程同步功能
LoggingCache统计命中率以及打印日志
统计二级缓存命中率并输出打印,由以下源码可知:日志中出现了“Cache Hit Ratio”便表示命中了二级缓存。
源码分析:
public class LoggingCache implements Cache {
private final Log log;
private final Cache delegate;
protected int requests = 0;
protected int hits = 0;
public LoggingCache(Cache delegate) {
this.delegate = delegate;
this.log = LogFactory.getLog(this.getId());
}
public Object getObject(Object key) {
++this.requests;//执行一次查询加一次
Object value = this.delegate.getObject(key);//查询缓存中是否已经存在
if (value != null) {
++this.hits;//命中一次加一次
}
if (this.log.isDebugEnabled()) {//开启debug日志
this.log.debug("Cache Hit Ratio [" + this.getId() + "]: " + this.getHitRatio());
}
return value;
}
private double getHitRatio() {//计算命中率
return (double)this.hits / (double)this.requests;//命中次数:查询次数
}
}
ScheduledCache过期清理缓存区
@CacheNamespace(flushInterval=100L)设置过期清理时间默认1个小时,
若设置flushInterval为0代表永远不进行清除。
源码分析:操作缓存时都会进行检查缓存是否过期
public class ScheduledCache implements Cache {
private final Cache delegate;
protected long clearInterval;
protected long lastClear;
public ScheduledCache(Cache delegate) {
this.delegate = delegate;
this.clearInterval = 3600000L;
this.lastClear = System.currentTimeMillis();
}
public void clear() {
this.lastClear = System.currentTimeMillis();
this.delegate.clear();
}
private boolean clearWhenStale() {
//判断当前时间与上次清理时间差是否大于设置的过期清理时间
if (System.currentTimeMillis() - this.lastClear > this.clearInterval) {
this.clear();//一旦进行清理便是清理全部缓存
return true;
} else {
return false;
}
}
}
LruCache(最近最少使用)防溢出缓存区
内部使用链表(增删比较快)实现最近最少使用防溢出机制
源码分析:
public void setSize(final int size) {
this.keyMap = new LinkedHashMap(size, 0.75F, true) {
private static final long serialVersionUID = 4267176411845948333L;
protected boolean removeEldestEntry(Entry eldest) {
boolean tooBig = this.size() > size;
if (tooBig) {
LruCache.this.eldestKey = eldest.getKey();
}
return tooBig;
}
};
}
//每次访问都会遍历一次key进行重新排序,将访问元素放到链表尾部。
public Object getObject(Object key) {
this.keyMap.get(key);
return this.delegate.getObject(key);
}
FifoCache(先进先出)防溢出缓存区
源码分析:内部使用队列存储key实现先进先出防溢出机制。
public class FifoCache implements Cache {
private final Cache delegate;
private final Deque keyList;
private int size;
public FifoCache(Cache delegate) {
this.delegate = delegate;
this.keyList = new LinkedList();
this.size = 1024;
}
public void putObject(Object key, Object value) {
this.cycleKeyList(key);
this.delegate.putObject(key, value);
}
public Object getObject(Object key) {
return this.delegate.getObject(key);
}
private void cycleKeyList(Object key) {
this.keyList.addLast(key);
if (this.keyList.size() > this.size) {//比较当前队列元素个数是否大于设定值
Object oldestKey = this.keyList.removeFirst();//移除队列头元素
this.delegate.removeObject(oldestKey);//根据移除元素的key移除缓存区中的对应元素
}
}
}
二级缓存的使用(命中条件)
1)会话提交后
2)sql语句、参数相同
3)相同的statementID
4)RowBounds相同
注意:设置为自动提交事务并不会命中二级缓存。
二级缓存的配置
二级缓存为什么要提交之后才能命中缓存?
会话一与会话二原本是两条隔离的事务,但由于二级缓存的存在导致彼此可见会发生脏读。若会话二的修改直接填充到二级缓存,会话一查询时缓存中存在即直接返回数据,此时会话二回滚会话一读到的数据就是脏数据。为了解决这一问题mybatis二级缓存机制就引入了事务管理器(暂存区),所有变动的数据都会暂时存放到事务管理器的暂存区中,只有执行提交动作后才会真正的将数据从暂存区中填充到二级缓存中。
1)会话:事务缓存管理器:暂存区=1:1:N
2)暂存区:缓存区=1:1(一个暂存区对应唯一一个缓存区)
3)会话关闭,事务缓存管理器也会关闭,暂存区也会被清空
4)一个事务缓存管理器管理多个暂存区
5)有多少个暂存区取决于你访问了多少个Mapper文件(缓存的key是Mapper文件全路径ID)
二级缓存执行流程
1)查询是实时查询缓存区的。
2)所有对二级缓存的实时变动都是通过暂存区来实现的。
3)暂存区清理完会进行标识,但此时二级缓存中数据并未清理,只有执行commit后才会真正清理二级缓存中的数据。
4)查询会实时查询缓存区,若暂存区清理标识为true就算从缓存区中查询到数据也会返回一个null,重新查询数据库(暂存区清理标识为true也会返回null是为了防止脏读,一旦提交清空掉二级缓存中的数据此时读取到的就是脏数据,因此返回null重新查询数据库得到的才是正确数据)。
源码分析:
a1、若开启二级缓存进行查询方法的时候会走到类CachingExecutor中的query方法
public List query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {
Cache cache = ms.getCache();//获得Cache
if (cache != null) {
this.flushCacheIfRequired(ms);//判断是否配置了flushCache=true,若配置了清空暂存区
if (ms.isUseCache() && resultHandler == null) {
this.ensureNoOutParams(ms, boundSql);
List list = (List)this.tcm.getObject(cache, key);//获得缓存
if (list == null) {//若为空查询数据库并将数据填充到暂存区
list = this.delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
this.tcm.putObject(cache, key, list);
}
return list;
}
}
return this.delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);
}
a2、根据上一步中的tcm.getObject(cache, key)方法查询二级缓存
public Object getObject(Object key) {
Object object = this.delegate.getObject(key);//查询二级缓存
if (object == null) {//为空也是为了先设置一个值防止缓存穿透
this.entriesMissedInCache.add(key);
}
//判断暂存区清空标识是否为true,若为true直接返回null重新查询数据库防止脏读
return this.clearOnCommit ? null : object;
}
你可能感兴趣的:(Mybatis,mybatis,缓存,java)
【Java实现数组的插入优化】
长安归故里♬
java 算法 开发语言
头插,尾插的插入效率在之前的插入中是【直接让currentIndex++我们在填入数据】现在我们把他们分为头插和尾插和中间插入中间插入:【在插入index的位置以后移动一位然后在index的位置中插入我们的数据】publicvoidadd(intdata,intindex){//是否扩容currentIndex++;if(currentIndex>nums.length-2){inttager[]
了解Javascript中的异步等待
Brook_
JavaScript javascript 异步
在本文中,我们将探讨async/await对于每个Javascript开发人员来说,异步编程的首选工具。如果您不熟悉javascript,请不要担心,本文将帮助您async/await从头开始理解。介绍async/await是javascript中的一种模式,可使您的代码以同步方式执行,但又不影响javascript的异步行为。定义异步功能要定义一个异步函数,您所要做的只是在函数定义之前添加一个a
玩转网页交互:用JavaScript打造灵动手风琴特效
skyksksksksks
综合个人杂记 javascript 交互 jquery html5 css 前端
一、手风琴特效:网页中的魔法折叠术想象一下你在音乐厅看到的手风琴演奏——轻轻一拉,风箱便如波浪般起伏展开。在网页世界中,手风琴特效正是这种优雅互动的数字化身!当用户点击某个标题时,对应的内容就像被施了魔法般缓缓展开,其他内容则默契地折叠收起。这种设计不仅节省空间,更能让用户像探索藏宝图一样,逐步揭开内容的奥秘。在电商网站的商品详情页,在知识平台的问答专区,甚至在个人作品集网站,手风琴特效都扮演着重
解释一下this在异步函数中的行为
祈澈菇凉
前端 javascript 开发语言
在JavaScript中,this关键字在异步函数中的行为可能会让人感到困惑。异步函数的执行方式与普通函数不同,这会影响this的指向。下面将详细阐述this在异步函数中的行为,以及如何正确管理this。一、this的基本行为回顾在JavaScript中,this的指向取决于函数的调用方式:全局上下文:在全局作用域中,this指向全局对象(在浏览器中是window)。对象方法:当函数作为对象的方法
初始java常见模板
xx2534
java 开发语言
Java是一种适用于多种应用程序的编程语言,支持各种不同类型和规模的开发项目,其模板也相对较多,以下是Java的一些常见模板:基础的HelloWorld模板:publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println("Hello,World!");}}2.类和对象模板:publicclassPerson{
使用EasyExcel和多线程实现高效数据导出
刘_sy
java工具类 数据库 java excel 批量导出Excel EasyExcel
使用EasyExcel和多线程实现高效数据导出1.概述在企业级应用中,数据导出是一个常见的需求。为了提高导出效率,尤其是在处理大量数据时,我们可以结合使用EasyExcel库和多线程技术。本文将详细介绍如何通过EasyExcel和多线程技术实现高效的数据导出功能。2.环境准备2.1Java版本Java版本:本项目基于Java开发。2.2依赖库com.alibaba:easyexcel:用于Exce
java nio编程实例_Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
weixin_39723010
java nio编程实例
1、BIO编程1.1、传统的BIO编程网络编程的基本模型是C/S模型,即两个进程间的通信。服务端提供IP和监听端口,客户端通过连接操作想服务端监听的地址发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接字进行通信。传统的同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起连接操作。连接成功后,双方通过输入和输出流进行同步阻塞式通信。简单
es6箭头函数和普通函数的区别
vvilkim
es6 前端 ecmascript
在JavaScript中,函数是执行特定任务的代码块。函数可以被定义并且随后被调用。JavaScript中有两种主要的函数定义方式:普通函数声明和箭头函数表达式。下面是这两种函数的定义方式及其区别和使用场景:普通函数声明普通函数可以通过函数声明或函数表达式的方式来定义。函数声明是最简单的方式,通常如下所示:function函数名(参数1,参数2,...){//函数体}示例:functiongree
java 输入输出模板
wangzhuo0978
模板
importjava.io.*;importjava.util.StringTokenizer;publicclassMain{publicstaticvoidmain(String[]args){InputStreaminputStream=System.in;OutputStreamoutputStream=System.out;InputReaderin=newInputReader(inp
Maven 与 Spring Boot 项目的集成
drebander
Maven maven spring boot java
在Java开发中,Maven和SpringBoot是最常见的工具和框架。Maven用于构建和管理项目的依赖,而SpringBoot提供了简化的Spring应用开发方式。将Maven和SpringBoot集成,可以帮助我们更高效地构建和部署SpringBoot应用。本文将介绍如何将Maven与SpringBoot集成,并通过Maven构建和管理SpringBoot项目。1.什么是SpringBoot
基于python sanic框架,使用Nacos进行微服务管理
一醉千秋
python+银河麒麟 微服务 java 架构
微服务软件系统构建方式,已经很普及了,通过开源的sanic进行微服务管理,便捷,技术也比较成熟,而在项目实际应用过程中,微服务类型不仅有java的,还有nodejs、python等,尤其是结合算法模型构建的python接口,需要在Nacos进行注册管理。本文内容耗时2天踏坑,亲测一切ok。参考资源Docker安装nacos(图文并茂,避免踩坑,一步到位)_docker创建nacos容器需要挂载哪些
JDBC之JAVA连接数据库方法5
倾心凝望
JDBC java 数据库 开发语言
文章目录方式5.使用数据库连接池获取连接方式5.使用数据库连接池获取连接下载依赖添加方式1:pom.xml文件中引入com.alibabadruid1.2.24添加方式2:druid-1.2.24.jar包引入下载网址:https://download.csdn.net/download/qq_44042106/90399318jar包引入同方法4:第三方组件读取properties文件连接编写配
GcExcel
arguments_zd
spreadjs 前端 前端框架
GcExcel简述:GcExcelJava是一款基于Java平台,支持批量创建、编辑、打印、导入/导出Excel文件的服务端表格组件,能够高性能处理和高度兼容Excel。功能特性(图1)文档查询(图2)
介绍一下常用的代码规范工具,如ESLint和Prettier
祈澈菇凉
代码规范
代码规范工具是现代软件开发中不可或缺的一部分,它们帮助开发者维持代码质量、提高可读性并确保一致性。以下是两种常用的代码规范工具:ESLint和Prettier的详细介绍。ESLint1.概述ESLint是一个用于JavaScript代码的静态代码分析工具,主要用于识别和报告代码中的问题。它可以帮助开发者发现潜在的错误、提高代码质量并保持代码风格的一致性。2.主要功能代码检查:ESLint可以检测语
async/await与Generator函数相比有什么区别?
编程微刊
前端 javascript 开发语言
async/await和Generator函数都是JavaScript中处理异步编程的重要工具,但它们在语法、使用方式和背后的机制上存在显著差异。以下是它们之间的主要区别:一、基本概念1.Generator函数Generator函数是通过function*关键字定义的特殊函数,可以暂停和恢复执行。它们返回一个迭代器对象,通过调用.next()方法逐步执行函数中的代码。示例function*gene
jvm的内存分配机制
四条腿
java虚拟机 jvm 内存分配 内存
在学习jvm的内存分配的时候,看到的这篇博客,该博客对jvm的内存分配总结的很好,同时也利用jvm的内存模型解释了java程序中有关参数传递的问题。博客出处:http://www.cnblogs.com/hellocsl/p/3969768.html?utm_source=tuicool&utm_medium=referral看了此博客后,发现应该去深入学习下jvm的内存模型,就是去认真学习下《深
【Java进阶篇】——第11篇:Java 8 新特性及使用
猿享天开
Java开发从入门到精通 java 开发语言
第11篇:Java8新特性及使用Java8是一次里程碑式的更新,引入了多项革新特性,极大地提升了开发效率和代码表现力。本文将从Lambda表达式、StreamAPI、时间日期API、Optional类等核心特性出发,结合实战场景和最佳实践,全面解析Java8的核心功能。1.Lambda表达式与函数式编程1.1Lambda表达式基础Lambda表达式允许以简洁的语法实现函数式接口(仅含一个抽象方法的
华为OD机试 - Excel 单元格数值统计(Python) | 机试题算法思路 【2023】
梦想橡皮擦
excel 华为 python 算法 华为od
最近更新的博客华为OD机试题-最短耗时(JavaScript)华为OD机试题-机器人走迷宫(JavaScript)华为OD机试-新员工座位安排系统(Python)|机试题算法思路华为OD机试-能力组队(Python)|机试题算法思路华为OD机试-内存池(Python)|机试题算法思路使用说明参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。华为OD清单查看地址:bl
新数据结构(10)——Java抽象类和接口
Ut Relinquam
java 数据结构 算法
抽象类抽象类产生原因子类可以重写父类中的方法并覆盖父类中的变量抽象类会将子类里共有的代码逻辑进行提取和抽象化抽象类通常被设计作为父类来实现代码复用抽象类的特点抽象类只需要做方法的定义,不需要实现一个被abstract修饰的类被称为抽象类,一个由abstract修饰的方法则被称为抽象方法。由abstract修饰的抽象方法,通常不在抽象类本身中实现,而是作为必须由子类覆盖和实现的方法的定义存在。只有抽
【论文投稿-第五届人工智能与工业技术应用国际学术会议(AIITA 2025)】编程语言大比拼:C、C++、Python 和 Java
禁默
话题探讨 学术会议 c语言 c++ python
第五届人工智能与工业技术应用国际学术会议(AIITA2025)将于2025年3月28-30日在中国西安举行。会议旨在为从事人工智能、智能制造、自动化等领域的专家学者、工程技术人员、研发人员提供一个共享科研成果和前沿技术,了解学术发展趋势,拓宽研究思路,加强学术研究和探讨,促进学术成果产业化合作的平台。编辑AIITA2025已上线至IEEE官方列表,详情请点击....大会时间:2025年3月28日-
软件测试技术之跨平台的移动端UI自动化测试(上)
学掌门
软件测试 IT ui 软件测试
摘要:本文提出一种跨平台的UI自动化测试方案,一方面使用像素级的截图对比技术,解决传统UI自动化测试难以验证页面样式的问题;另一方面用统一部署在服务器端的JavaScript测试代码代替Android和iOS测试代码,大大提高编写测试代码的效率。该方案经过实际验证,具有效率高、质量好、便于维护等多方面优点,文中将阐述具体设计思路以及各关键步骤的实现方法,为同类测试提供借鉴。一、背景当前金融服务数字
深入理解 Java 模板模式:代码复用与架构优化的利器
疯狂的键盘侠
设计模式 java java 设计模式
深入理解Java模板模式:代码复用与架构优化的利器在Java编程世界中,设计模式如同智慧的结晶,帮助开发者应对各种复杂的软件开发需求。其中,模板模式(TemplatePattern)以其独特的代码复用和流程标准化能力,成为构建灵活且可维护系统的关键工具。今天,让我们一同深入探究Java中的模板模式。一、模板模式:概念初窥模板模式属于行为型设计模式,它定义了一个操作中的算法骨架,将一些步骤延迟到子类
Yarn 常见问题及排查指南
艳艳子呀
javascript 前端 yarn
介绍Yarn是一个高效、可靠的JavaScript依赖管理工具,但在使用过程中,可能会遇到各种问题。本文总结了一些常见的Yarn错误及其排查方法,帮助你快速定位并解决问题。1.网络相关问题❌错误1:网络超时errorAnunexpectederroroccurred:"https://registry.yarnpkg.com/...:ETIMEDOUT".可能原因✅网络不稳定,导致请求超时✅公司或
Go分布式爬虫笔记(五)_golang分布式爬虫架构
2401_87198107
golang 分布式 爬虫
系统级别优化与架构设计:如何对服务进行拆分如何将服务链接在一起服务调用的关系以及调用频率各种问题:如何让服务随着负载的增加具有可扩展性?是否采用DDD的架构设计?如何进行分布式的协调?选择何种中间件、缓存数据库与存储数据库?使用何种通信方式?如何设计缓存与数据库的关系,才能避免缓存失效之后大量数据直接打到数据库导致的服务响应变慢甚至服务雪崩的问题呢?分布式系统中数据的一致性,如果业务能够接受读取到
实用教程:用微服务搭建你的2025项目
zxzy_org
微服务 架构 云原生 算法
微服务架构为构建现代化项目提供了灵活且高效的解决方案。在2025年,如果你计划采用微服务搭建项目,可以参考以下步骤:首先,明确项目的核心需求,合理划分服务边界。一个好的微服务设计需要确保服务粒度适中,不会因为服务过细而增加不必要的复杂性。接着,选择合适的技术栈,主流的语言如Java、Python和GoLang依然是微服务开发的首选。其次,容器化部署是必不可少的步骤,Docker和Kubernete
深入剖析模型推理:原理、技术与挑战
♢.*
人工智能 模型推理
亲爱的小伙伴们,在求知的漫漫旅途中,若你对深度学习的奥秘、Java与Python的奇妙世界,亦或是读研论文的撰写攻略有所探寻,那不妨给我一个小小的关注吧。我会精心筹备,在未来的日子里不定期地为大家呈上这些领域的知识宝藏与实用经验分享。每一个点赞,都如同春日里的一缕阳光,给予我满满的动力与温暖,让我们在学习成长的道路上相伴而行,共同进步✨。期待你的关注与点赞哟!引言在当今人工智能飞速发展的时代,模型
java进行pdf文件压缩
后端
pdf文件压缩添加依赖com.luhuiguoaspose-pdf23.1publicclassOptimizePdf{publicstaticvoidoptimize(Stringsource,Stringtarget){Documentdoc=newDocument(source);//设置压缩属性OptimizationOptionsopt=newOptimizationOptions();
Jackson ObjectMapper
背景在最近写邓白氏项目的时候遇到一个需求,就是JSON字符串和Java对象之间相互转换,这就是涉及到数据反序列化。概述JacksonObjectMapper是Java中处理JSON数据的强大工具,具有以下主要功能:JSON与Java对象的相互转换:ObjectMapper可以将JSON数据转换为Java对象,以及将Java对象转换为JSON格式。这种转换过程称为序列化和反序列化。通过ObjectM
04---java面试八股文——spring-----注解-------10题
20250205
Java面试刷题 java 面试 spring
31、@ComponentScan注解的作用@ComponentScan注解用于指定Spring容器在启动时要扫描的基础包路径,以及要扫描的包路径下应该被自动注册为Springbean的类。具体来说,@ComponentScan注解的作用有以下几个方面:组件扫描:@ComponentScan注解告诉Spring容器在哪些包及其子包下搜索组件,Spring将会自动扫描并注册被特定注解标记的类(如@C
并发编程利器 - CountDownLatch
小马不敲代码
Java 并发编程
什么是CountDownLatch?CountDownLatch是Java并发包(java.util.concurrent)中的一个实用类,它允许一个或多个线程等待其他线程完成一组操作。CountDownLatch在初始化时设置一个计数值(count),这个值表示需要等待完成的操作数量。每当一个操作完成时,CountDownLatch的计数就会减1。当计数到达0时,等待的线程就会被唤醒,继续执行后
web前段跨域nginx代理配置
刘正强
nginx cms Web
nginx代理配置可参考server部分
server {
listen 80;
server_name localhost;
spring学习笔记
caoyong
spring
一、概述
a>、核心技术 : IOC与AOP
b>、开发为什么需要面向接口而不是实现
接口降低一个组件与整个系统的藕合程度,当该组件不满足系统需求时,可以很容易的将该组件从系统中替换掉,而不会对整个系统产生大的影响
c>、面向接口编口编程的难点在于如何对接口进行初始化,(使用工厂设计模式)
Eclipse打开workspace提示工作空间不可用
0624chenhong
eclipse
做项目的时候,难免会用到整个团队的代码,或者上一任同事创建的workspace,
1.电脑切换账号后,Eclipse打开时,会提示Eclipse对应的目录锁定,无法访问,根据提示,找到对应目录,G:\eclipse\configuration\org.eclipse.osgi\.manager,其中文件.fileTableLock提示被锁定。
解决办法,删掉.fileTableLock文件,重
Javascript 面向对面写法的必要性?
一炮送你回车库
JavaScript
现在Javascript面向对象的方式来写页面很流行,什么纯javascript的mvc框架都出来了:ember
这是javascript层的mvc框架哦,不是j2ee的mvc框架
我想说的是,javascript本来就不是一门面向对象的语言,用它写出来的面向对象的程序,本身就有些别扭,很多人提到js的面向对象首先提的是:复用性。那么我请问你写的js里有多少是可以复用的,用fu
js array对象的迭代方法
换个号韩国红果果
array
1.forEach 该方法接受一个函数作为参数, 对数组中的每个元素
使用该函数 return 语句失效
function square(num) {
print(num, num * num);
}
var nums = [1,2,3,4,5,6,7,8,9,10];
nums.forEach(square);
2.every 该方法接受一个返回值为布尔类型
对Hibernate缓存机制的理解
归来朝歌
session 一级缓存 对象持久化
在hibernate中session一级缓存机制中,有这么一种情况:
问题描述:我需要new一个对象,对它的几个字段赋值,但是有一些属性并没有进行赋值,然后调用
session.save()方法,在提交事务后,会出现这样的情况:
1:在数据库中有默认属性的字段的值为空
2:既然是持久化对象,为什么在最后对象拿不到默认属性的值?
通过调试后解决方案如下:
对于问题一,如你在数据库里设置了
WebService调用错误合集
darkranger
webservice
Java.Lang.NoClassDefFoundError: Org/Apache/Commons/Discovery/Tools/DiscoverSingleton
调用接口出错,
一个简单的WebService
import org.apache.axis.client.Call;import org.apache.axis.client.Service;
首先必不可
JSP和Servlet的中文乱码处理
aijuans
Java Web
JSP和Servlet的中文乱码处理
前几天学习了JSP和Servlet中有关中文乱码的一些问题,写成了博客,今天进行更新一下。应该是可以解决日常的乱码问题了。现在作以下总结希望对需要的人有所帮助。我也是刚学,所以有不足之处希望谅解。
一、表单提交时出现乱码:
在进行表单提交的时候,经常提交一些中文,自然就避免不了出现中文乱码的情况,对于表单来说有两种提交方式:get和post提交方式。所以
面试经典六问
atongyeye
工作 面试
题记:因为我不善沟通,所以在面试中经常碰壁,看了网上太多面试宝典,基本上不太靠谱。只好自己总结,并试着根据最近工作情况完成个人答案。以备不时之需。
以下是人事了解应聘者情况的最典型的六个问题:
1 简单自我介绍
关于这个问题,主要为了弄清两件事,一是了解应聘者的背景,二是应聘者将这些背景信息组织成合适语言的能力。
我的回答:(针对技术面试回答,如果是人事面试,可以就掌
contentResolver.query()参数详解
百合不是茶
android query()详解
收藏csdn的博客,介绍的比较详细,新手值得一看 1.获取联系人姓名
一个简单的例子,这个函数获取设备上所有的联系人ID和联系人NAME。
[java]
view plain
copy
public void fetchAllContacts() {
ora-00054:resource busy and acquire with nowait specified解决方法
bijian1013
oracle 数据库 kill nowait
当某个数据库用户在数据库中插入、更新、删除一个表的数据,或者增加一个表的主键时或者表的索引时,常常会出现ora-00054:resource busy and acquire with nowait specified这样的错误。主要是因为有事务正在执行(或者事务已经被锁),所有导致执行不成功。
1.下面的语句
web 开发乱码
征客丶
spring Web
以下前端都是 utf-8 字符集编码
一、后台接收
1.1、 get 请求乱码
get 请求中,请求参数在请求头中;
乱码解决方法:
a、通过在web 服务器中配置编码格式:tomcat 中,在 Connector 中添加URIEncoding="UTF-8";
1.2、post 请求乱码
post 请求中,请求参数分两部份,
1.2.1、url?参数,
【Spark十六】: Spark SQL第二部分数据源和注册表的几种方式
bit1129
spark
Spark SQL数据源和表的Schema
case class
apply schema
parquet
json
JSON数据源 准备源数据
{"name":"Jack", "age": 12, "addr":{"city":"beijing&
JVM学习之:调优总结 -Xms -Xmx -Xmn -Xss
BlueSkator
-Xss -Xmn -Xms -Xmx
堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。典型设置:
java -Xmx355
jqGrid 各种参数 详解(转帖)
BreakingBad
jqGrid
jqGrid 各种参数 详解 分类:
源代码分享
个人随笔请勿参考
解决开发问题 2012-05-09 20:29 84282人阅读
评论(22)
收藏
举报
jquery
服务器
parameters
function
ajax
string
读《研磨设计模式》-代码笔记-代理模式-Proxy
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/*
* 下面
应用升级iOS8中遇到的一些问题
chenhbc
ios8 升级iOS8
1、很奇怪的问题,登录界面,有一个判断,如果不存在某个值,则跳转到设置界面,ios8之前的系统都可以正常跳转,iOS8中代码已经执行到下一个界面了,但界面并没有跳转过去,而且这个值如果设置过的话,也是可以正常跳转过去的,这个问题纠结了两天多,之前的判断我是在
-(void)viewWillAppear:(BOOL)animated
中写的,最终的解决办法是把判断写在
-(void
工作流与自组织的关系?
comsci
设计模式 工作
目前的工作流系统中的节点及其相互之间的连接是事先根据管理的实际需要而绘制好的,这种固定的模式在实际的运用中会受到很多限制,特别是节点之间的依存关系是固定的,节点的处理不考虑到流程整体的运行情况,细节和整体间的关系是脱节的,那么我们提出一个新的观点,一个流程是否可以通过节点的自组织运动来自动生成呢?这种流程有什么实际意义呢?
这里有篇论文,摘要是:“针对网格中的服务
Oracle11.2新特性之INSERT提示IGNORE_ROW_ON_DUPKEY_INDEX
daizj
oracle
insert提示IGNORE_ROW_ON_DUPKEY_INDEX
转自:http://space.itpub.net/18922393/viewspace-752123
在 insert into tablea ...select * from tableb中,如果存在唯一约束,会导致整个insert操作失败。使用IGNORE_ROW_ON_DUPKEY_INDEX提示,会忽略唯一
二叉树:堆
dieslrae
二叉树
这里说的堆其实是一个完全二叉树,每个节点都不小于自己的子节点,不要跟jvm的堆搞混了.由于是完全二叉树,可以用数组来构建.用数组构建树的规则很简单:
一个节点的父节点下标为: (当前下标 - 1)/2
一个节点的左节点下标为: 当前下标 * 2 + 1
&
C语言学习八结构体
dcj3sjt126com
c
为什么需要结构体,看代码
# include <stdio.h>
struct Student //定义一个学生类型,里面有age, score, sex, 然后可以定义这个类型的变量
{
int age;
float score;
char sex;
}
int main(void)
{
struct Student st = {80, 66.6,
centos安装golang
dcj3sjt126com
centos
#在国内镜像下载二进制包
wget -c http://www.golangtc.com/static/go/go1.4.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.4.1.linux-amd64.tar.gz
#把golang的bin目录加入全局环境变量
cat >>/etc/profile<
10.性能优化-监控-MySQL慢查询
frank1234
性能优化 MySQL慢查询
1.记录慢查询配置
show variables where variable_name like 'slow%' ; --查看默认日志路径
查询结果:--不用的机器可能不同
slow_query_log_file=/var/lib/mysql/centos-slow.log
修改mysqld配置文件:/usr /my.cnf[一般在/etc/my.cnf,本机在/user/my.cn
Java父类取得子类类名
happyqing
java this 父类 子类 类名
在继承关系中,不管父类还是子类,这些类里面的this都代表了最终new出来的那个类的实例对象,所以在父类中你可以用this获取到子类的信息!
package com.urthinker.module.test;
import org.junit.Test;
abstract class BaseDao<T> {
public void
Spring3.2新注解@ControllerAdvice
jinnianshilongnian
@Controller
@ControllerAdvice,是spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强。让我们先看看@ControllerAdvice的实现:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Co
Java spring mvc多数据源配置
liuxihope
spring
转自:http://www.itpub.net/thread-1906608-1-1.html
1、首先配置两个数据库
<bean id="dataSourceA" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close&quo
第12章 Ajax(下)
onestopweb
Ajax
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
BW / Universe Mappings
blueoxygen
BO
BW Element
OLAP Universe Element
Cube Dimension
Class
Charateristic
A class with dimension and detail objects (Detail objects for key and desription)
Hi
Java开发熟手该当心的11个错误
tomcat_oracle
java 多线程 工作 单元测试
#1、不在属性文件或XML文件中外化配置属性。比如,没有把批处理使用的线程数设置成可在属性文件中配置。你的批处理程序无论在DEV环境中,还是UAT(用户验收
测试)环境中,都可以顺畅无阻地运行,但是一旦部署在PROD 上,把它作为多线程程序处理更大的数据集时,就会抛出IOException,原因可能是JDBC驱动版本不同,也可能是#2中讨论的问题。如果线程数目 可以在属性文件中配置,那么使它成为
推行国产操作系统的优劣
yananay
windows linux 国产操作系统
最近刮起了一股风,就是去“国外货”。从应用程序开始,到基础的系统,数据库,现在已经刮到操作系统了。原因就是“棱镜计划”,使我们终于认识到了国外货的危害,开始重视起了信息安全。操作系统是计算机的灵魂。既然是灵魂,为了信息安全,那我们就自然要使用和推行国货。可是,一味地推行,是否就一定正确呢?
先说说信息安全。其实从很早以来大家就在讨论信息安全。很多年以前,就据传某世界级的网络设备制造商生产的交