Msgpack简介
MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it's faster and smaller. Small integers are encoded into a single byte, and typical short strings require only one extra byte in addition to the strings themselves.
MessagePack是一个基于二进制高效的对象序列化Library用于跨语言通信。它可以像JSON那样,在许多种语言之间交换结构对象;但是它比JSON更快速也更轻巧。 支持Python、Ruby、Java、C/C++、Javascript等众多语言。 比Google Protocol Buffers还要快4倍。
Graddle依赖管理
// msgpack
compile 'org.msgpack:msgpack:0.6.12' // 依赖javassist和json-simple
//slf-logback
compile 'org.slf4j:jcl-over-slf4j:1.7.7'
compile 'org.slf4j:jcl-over-slf4j:1.7.7' // 依赖lf4j-api,故lf4j-api可以不单独配置
compile 'org.slf4j:slf4j-api:1.7.7'
// javassist
compile 'org.javassist:javassist:3.20.0-GA' // 如果其他有依赖,则可不单独配置
compile 'com.googlecode.json-simple:json-simple:1.1.1'
使用Msgpack解析yii2 session中的数据
yii2将session数据写入redis中,为了在java api中可以使用后台用户登录的信息,则需要通过java解析session数据。 先看看如何使用:
// sessionBytes是byte类型
if (null != sessionBytes) {
MessagePack pack = new MessagePack(); // new一个msgpack对象
Map map = null;
try {
map = (Map) pack.read(sessionBytes); // 通过Msgpack的read读取字节,强制转换为Map对象
} catch (IOException e) {
LOGGER.warn("get request user from redis failed: ", e);
}
if (!com.joyven.util.Utils.isEmpty(map)) {
map.forEach((k, v) -> {
String key = String.valueOf(k);
String value = String.valueOf(v);
if (Const.SESSION_KEY_UID.equals(key)) {
user.setUid(Long.parseLong(trim(value, USER_STRING_REDUNDANCY)));
}
if (Const.SESSION_KEY_USERNAME.equals(key)) {
user.setUsername(trim(value, USER_STRING_REDUNDANCY));
}
if (Const.SESSION_KEY_AVATAR.equals(key)) {
user.setAvatar(trim(value, USER_STRING_REDUNDANCY));
}
if (Const.SESSION_KEY_CST.equals(key)) {
user.setCraftsmanStatus(Integer.parseInt(trim(value,
USER_STRING_REDUNDANCY)) + 1);
}
if (Const.SESSION_KEY_MOBILE.equals(key)) {
user.setMobile(trim(value, USER_STRING_REDUNDANCY));
}
});
}
}
上述代码中常量的定义:
public static final String SESSION_KEY_UID = "\"uid\"";
public static final String SESSION_KEY_USERNAME = "\"un\"";
public static final String SESSION_KEY_AVATAR = "\"avt\"";
public static final String SESSION_KEY_CST = "\"cst\"";
public static final String SESSION_KEY_MOBILE = "\"mbl\"";
public static final String USER_STRING_REDUNDANCY = "\"";
php写入的数据是uid、un、avt、cst、mbl这样的key,经过Msgpack序列化后的key都加上了\"
,强制转换为Map对象后,map中的key并没有去掉这些转义字符,value也不例外,因此使用trim去掉了value两边的\"
。需要注意,如果是yii2的话,一般key都有前缀,此处作者把前缀删掉了,下面所有代码均如此。
此处的trim是经过封装的,和php中trim api类似。
上面的这块代码,Msgpack反序列化可以抽象封装为工具类:
@SuppressWarnings("unchecked")
public static Map getMessagePackValue(final byte[] bytes) throws IOException {
MessagePack pack = new MessagePack();
Map map = (Map) pack.read(bytes);
Map result = new HashMap<>();
if (null != map) {
map.forEach((k, v) -> result.put(trim(String.valueOf(k), USER_STRING_REDUNDANCY),
trim(String.valueOf(v), USER_STRING_REDUNDANCY)));
}
return result;
}
优化getMessagePackValue方法,不再使用trim处理数据
@SuppressWarnings("unchecked")
public static Map getMessagePackValue(final byte[] bytes) throws IOException {
MessagePack pack = new MessagePack();
Map map = (Map) pack.read(bytes, Templates.tMap(Templates.TString,
Templates.TValue));
Map result = new HashMap<>();
if (map != null) {
map.forEach((k, v) -> {
Object object = rawObjToObj(v);
result.put(k, object);
});
}
return result;
}
Msgpack有很多数据模板,这里使用TString模板和TValue模板。相关模板均在org.msgpack.template.Template
类中定义,诸如:TValue、TByte、TShort、TInteger、TLong、TCharacter、TBigInteger、TBigDecimal、TFloat、TBoolean、TString、TByteArray、TByteBuffer、TDate、tNotNullable、tList、tMap、tCollection、tOrdinalEnum。
private static Object rawObjToObj(Object obj) {
Object objResu = null;
if (obj instanceof IntegerValue) {
objResu = ((IntegerValue) obj).asIntegerValue();
} else if (obj instanceof ArrayValue) {
ArrayValue v = ((ArrayValue) obj).asArrayValue();
List ret = new ArrayList<>(v.size());
v.forEach(x -> ret.add(x));
objResu = ret;
} else if (obj instanceof BooleanValue) {
objResu = ((BooleanValue) obj).asBooleanValue();
} else if (obj instanceof FloatValue) {
objResu = ((FloatValue) obj).asFloatValue();
} else if (obj instanceof MapValue) {
MapValue value = ((MapValue) obj).asMapValue();
Map map = new HashMap<>(value.size());
value.forEach((k, v) -> {
map.put(k, rawObjToObj(v));
});
objResu = map;
} else {
objResu = ((RawValue) obj).asRawValue().getString();
}
return objResu;
}
优化后的使用方法
// appId 为php中的session id
public User getAdminUser(String appId) {
byte[] sessionKey = getSessionKey(appId).getBytes();
byte[] sessionAdmin;
User user = new User();
try (Jedis jedis = jedisPool.getResource()) {
jedis.select(RedisDB.DB12);
sessionAdmin = jedis.get(sessionKey);
user.setExpire(jedis.ttl(sessionKey));
}
if (sessionAdmin != null) {
Map map = new HashMap<>();
try {
map = Utils.getMessagePackValue(sessionAdmin);
} catch (IOException e) {
LOGGER.warn("parse session admin error: " + e.getMessage());
}
if (!isEmpty(map)) {
if (map.containsKey("id")) {
if (map.get("id") instanceof IntegerValue) {
user.setAid(((IntegerValue) map.get("id")).longValue());
} else if(!isEmpty((String) map.get("id"))){
user.setAid(Long.parseLong((String) map.get("id")));
} else {
user.setAid(0L);
}
}
if (map.containsKey("un")) {
user.setUsername((String) map.get("un"));
}
if (map.containsKey("rn")) {
user.setRealname((String) map.get("rn"));
}
}
}
return user;
}
错误:org.msgpack.type.intValueImpl cannot be cast to java.lang.Long
先看看这段代码:
if (map.containsKey("id")) {
if (map.get("id") instanceof IntegerValue) {
user.setAid(((IntegerValue) map.get("id")).longValue());
} else if(!isEmpty((String) map.get("id"))){
user.setAid(Long.parseLong((String) map.get("id")));
} else {
user.setAid(0L);
}
}
反序列化后获取id,因为User中id是Long类型,这里面id可能是String,也可能是Integer,因此需要注意。最开的代码是这样写的:
if (map.containsKey("id") && !isEmpty((String) map.get("id"))) {
user.setAid(Long.parseLong((String) map.get("id")));
}
通过Long.parseLong解析id报错,错误:org.msgpack.type.intValueImpl cannot be cast to java.lang.Long,于是修改为下面这般,如果是IntegerValue的实例,则强制转换为Long类型,但是依然报错:
if (map.containsKey("id")) {
if (map.get("id") instanceof IntegerValue) {
user.setAid((Long) map.get("id"));
} else if(!isEmpty((String) map.get("id"))){
user.setAid(Long.parseLong((String) map.get("id")));
} else {
user.setAid(0L);
}
}
最后强制类型转换IntegerValue,再获取longValue,即为上面函数中的那般才解决此错误。
参考资料
你可能感兴趣的:(msgpack,java)
Java——接口
六七_Shmily
java java python 开发语言
在Java中,接口(Interface)是一种特殊的引用类型,用于定义一组方法的规范(即方法签名),而不包含方法的实现。接口是Java实现多态和抽象的重要机制之一。以下是关于Java接口的详细说明:1.接口的定义接口使用interface关键字定义。它可以包含:抽象方法:没有方法体的方法。默认方法(Java8+):使用default关键字定义,可以有方法体。静态方法(Java8+):使用stati
每日一题之(多态 )三 学习java
座山雕~
学习 java
重要的几句话:(1)一个对象的编译类型和运行类型可以不一致如:Dog类是Anlimal的子类,Animalanimal=newDog();(2)编译类型在定义对象时,就确定了,不能改变。如:一旦创建,Animal就是编译类型,不会在改变Animalanimal=newDog();(3)运行类型是可以改变的如:此时,编译类型仍然是Animal,运行类型就从Dog变成Cat。Animalanimal=
jar、war、pom
JIU_WW
jar java
1.jar定义与用途用途:默认打包类型,生成JAR文件(JavaArchive),适用于普通Java应用或库。场景:开发工具类库(如commons-lang.jar)。构建可执行应用(通过java-jar运行)。关键行为构建流程:执行mvnpackage后,生成target/.jar。包含编译后的.class文件、资源文件(如.properties)和META-INF/MANIFEST.MF。依赖
【大厂面试题】大疆,最新面试题
扫地僧009
互联网大厂面试题 java 面试 spring
大疆一面(50分钟)开场三连问自我介绍?(自我介绍重点引导面试官想问你的技术栈和项目)对大疆有什么了解?(大家面试的时候,最好提前了解一些公司的业务,不然没话可说就尴尬了呢)为什么选择这个岗位?(先从工作/项目匹配度角度出发,然后再说公司和个人兴趣等原因)Java提供了有哪些支持互斥的工具?工具适用场景特点synchronized简单同步或低竞争环境代码简单,性能经过JVM优化(偏向锁、轻量级锁)
协程的基本实现原理详解以及在java中的使用
一个儒雅随和的男子
多线程 java 开发语言
前言接下来是Java中的协程实现。JDK17引入了虚拟线程(Fiber),属于用户态线程,由JVM管理。本文将深度讨论了第三方库如Quasar,Quasar通过字节码增强实现协程,使用Fiber类。并涉及到Kilim等库也是通过字节码生成实现的,以及Kotlin协程的代码示例,通过suspend函数和CoroutineScope管理。详细讲解了NtyCo库的实现,包括上下文切换和调度器。需要注意,
Java学习笔记——单元测试,面试必备
m0_64867152
程序员 面试 java 后端
assertEquals(“这是错误信息2”,12,m.getArea(3,4));}}@Test注解的方法每个@Test对应一个方法,这个方法会被识别为一个测试方法一个测试类里面可以有多个@Test,但是每个@Test对应的测试方法只会被执行一次通常我们会在@Test测试方法中使用assertEquals断言语句,来判断方法是否能够正常运行并且输出我们希望的结果assertEquals(“错误信
2025年投身Java培训的可行性分析——基于计算机科学与技术专业的视角
车载诊断工程师-小白
文章 java 开发语言
2025年投身Java培训的可行性分析——基于计算机科学与技术专业的视角2025年投身Java培训的可行性分析引言随着信息技术的快速发展,编程语言的需求和应用领域也在不断变化。Java作为一种广泛应用的编程语言,在企业级应用开发、安卓应用开发、大数据处理等多个领域中占据重要位置。对于计算机科学与技术专业的学生或从业者而言,掌握Java不仅有助于增强个人竞争力,还能拓宽职业发展路径。本文将从市场需求
CellWriteHandler is an interface in EasyExcel, a popular Java library for reading and writing Excel
hshpy
excel
CellWriteHandlerisaninterfaceinEasyExcel,apopularJavalibraryforreadingandwritingExcelfiles.ItisusedtocustomizehowdataiswrittentocellsduringtheExcelexportprocess.PurposeItallowsdeveloperstomodifycellva
华为od机试 - 服务器广播、需要广播的服务器数量(Java & Python& JS & C++ & C )
算法大师
最新华为OD机试 华为 服务器 c++ 华为od机试 javascript 华为OD机试E卷 python
最新华为OD机试真题目录:点击查看目录华为OD面试真题精选:点击立即查看题目描述服务器连接方式包括直接相连,间接连接。A和B直接连接,B和C直接连接,则A和C间接连接。直接连接和间接连接都可以发送广播。给出一个N*N数组,代表N个服务器,matrix[i][j]==1,则代表i和j直接连接;不等于1时,代表i和j不直接连接。matrix[i][i]==1,即
TypeScript与JavaScript的区别
本文我们要聊一聊TypeScript和JavaScript之间的区别。可能我们已经注意到,TypeScript是JavaScript的超集,那么它到底比JavaScript多了些什么?为什么我们要选择TypeScript,而不仅仅是写普通的JavaScript呢?本文我们就一起看看TypeScript和JavaScript的核心差异,让你对它们有个更加清晰的认识。3.1什么是TypeScript与
教妹学Java(三十八):instanceof 操作符的用法
工程师_axI
java python 开发语言
System.out.println(simpleinstanceofSimple);}}在上面这个例子中,我们使用instanceof判断simple这个引用变量是不是Simple类。输出结果如下所示:true一个子类的对象既是子类也是父类,来看下面这个示例:/**@author微信搜「沉默王二」,回复关键字PDF*/classAnimal{}publicclassDogextendsAnima
es部署报错找不到tools.jar
Gungnirss
elasticsearch jar 大数据
网上看了很多解决方法都不行,换版本,甚至用es内置的jdk都没解决问题。原因:系统在运行时会去环境变量里找JAVA_HOME,来找到JDK运行JVM,而JVM在运行时会根据classpath的设置来加载类和资源。此时如果你的classpath里面写了,需要加载tools.jar,而在Java高版本中(实测jdk21没有)是没有tools.jar的,因此会导致报错。解决办法:编辑环境变量-系统变量-
【Java 常用注解学习笔记1】——Java 常用注解全解析:从基础到实战
猿享天开
Java开发从入门到精通 java 学习 笔记
Java常用注解全解析:从基础到实战一、引言Java注解(Annotation)是现代化开发中提升代码简洁性、可维护性和与框架集成的重要工具。本文系统化梳理主流框架(Spring、MyBatis-Plus、Swagger等)的核心注解,通过分类解析、代码示例与最佳实践,帮助开发者精准掌握注解的应用场景与技巧。二、Lombok注解1.代码简化注解注解作用示例注意事项@Data生成getter/set
Java 登录框架
zerolbsony
spring boot java 后端
Java框架中常用的几种成熟的token生成框架对比-白露~-博客园SpringBoot整合sa-token,jwt登录及拦截器鉴权Demo_只有在集成sa-token-jwt插件后才可以使用extra扩展参数-CSDN博客推荐一款轻量级权限认证框架Sa-Token,集成JWT和Redis轻松实现认证鉴权_sa-tokenjwt-CSDN博客SpringBoot整合sa-token,jwt登录及拦
Java String 类
今天你慧了码码码码码码码码码码
JavaSE基础 java python 开发语言
JavaString类常用方法详解在Java编程里,字符串操作十分常见,而String类作为Java标准库的核心类,用于表示不可变的字符序列。任何对字符串的修改操作都会返回一个新的字符串对象,不会改变原始字符串。本文将详细介绍String类的常用方法,并结合示例代码帮助理解。一、String对象的创建String对象的创建主要有以下两种方式:1.直接赋值这是最常见的创建字符串的方式,使用双引号将一
Java 基础语法——关键字、变量和运算符
小志开发
JAVA java 开发语言
在Java编程中,掌握基础知识是理解更复杂功能的前提。本篇文章将详细讲解Java中的**关键字(keyword)、变量(variable)以及运算符(operator)**等基本概念,并通过示例代码帮助你理解和应用它们。一、关键字(keyword)在Java中,关键字用于定义类、方法、字段和其他语句结构。这些reservedwords是特殊的字符串,不能用作变量名或其他标识符。1.类和接口关键字p
A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction 报错
Dic-
# Android Studio IDE 单元测试 android studio android ide 编译报错 单元测试 JUnit AndroidJUnit
问题AndroidStudio编译应用报错:>Task:mergeDebugJavaResourceFAILEDExecutionfailedfortask':mergeDebugJavaResource'.>Afailureoccurredwhileexecutingcom.android.build.gradle.internal.tasks.MergeJavaResWorkAction>6f
Flutter-Android编译报错与解决方案汇总
ShawnRacine
flutter android
报错一:java.lang.NullPointerException:Cannotinvoke“String.length()”because“”isnull解决方案:IsolvedthisproblembyupgradingAndroidGradlePlugintoversion8.3.1.YoucanuseTools->AGPUpgradeAssistanttoupgradeAndroidGr
Promise_链式调用(解决回调函数地狱)
还是鼠鼠
javascript ajax 前端 vscode html5
目录介绍代码结构代码index.html(HTML部分)运行结果代码分析总结介绍本示例展示了如何使用JavaScript中的Promise对象解决传统回调函数嵌套(即“回调地狱”)的问题。通过链式调用的方式,使得多个异步操作变得更加线性和易于维护。代码演示了如何利用Promise按顺序获取省、市、区的信息,并将它们依次拼接成完整的地址。代码结构HTML部分:HTML代码主要提供一个简单的框架,包含
部署若依微服务遇到的坑
高树悲风
微服务 架构 云原生
1、用Windows部署nacosjava.nio.charset.MalformedInputException:Inputlength=1或Inputlength=2-CSDN博客我的解决方案:遇到这个问题修改也yml文件上的中文没用使用第二种File->Settings->FileEncodings
deepin Java开发环境搭建和主力使用体验(2021.02更)
我是你的橙子啊
软件安装类 推荐 deepin java intellij idea mysql linux
前言:之所以想体验一下deepin有2点原因1.美观(是的,没错,就是冲着好看去的)2.流畅(主要是一些编程软件比win下反应更快,体验更好)成果:1.UI整体风格我觉得OK(基本不用动手美化,原生的UI就够了)2.丝滑有些许夸大,流畅是一点不假(针对我常用的一些软件而言,ex,IDEA)so,符合预期,总体感觉良好,打算作为主力使用一段时间我的桌面时尚模式更好看一些,但是任务栏占的地方比较大,配
华为OD机试2024年E卷-TLV解码[100分]( Java | Python3 | C++ | C语言 | JsNode | Go )实现100%通过率
梅花C
华为OD题库 华为od
题目描述TLV编码是按[TagLengthValue]格式进行编码的,一段码流中的信元用Tag标识,Tag在码流中唯一不重复,Length表示信元Value的长度,Value表示信元的值。码流以某信元的Tag开头,Tag固定占一个字节,Length固定占两个字节,字节序为小端序。现给定TLV格式编码的码流,以及需要解码的信元Tag,请输出该信元的Value。输入码流的16进制字符中,不包括小写字母
MAC电脑 初始化 开发环境(Java + Node)
Kevin_K2
macos java 开发语言
1.后端1.1Java下载地址https://www.oracle.com/cn/java/technologies/javase/javase8-archive-downloads.html1.2Maven安装https://archive.apache.org/dist/maven/maven-3/1.3maven环境变量exportMAVEN_HOME=/Users/kevin/Soft/a
关于在mac中配置Java系统环境变量
我要最优解
macos java flutter
引言在macOS上开发Java或Flutter应用时,正确配置环境变量是至关重要的。环境变量不仅能让系统找到开发工具的位置,还能简化命令行操作。本文将手把手教你从零开始安装JavaSDK,并详细配置环境变量,涵盖常见问题解决和优化技巧。在macOS系统中配置Java环境变量的详细步骤如下:一、配置Java环境变量1.安装JavaJDKmacOS默认可能未安装JDK(或版本较旧),以下是两种安装方式
十个Scala的小知识
啊喜拔牙
scala 大数据 开发语言 python java
#1.与Java的互操作性Scala与Java有很好的互操作性。可以在Scala项目中直接使用Java类库,也可以将Scala代码编译后供Java项目使用。例如,一个Java框架可以轻松地集成Scala编写的代码模块。#2.强大的集合库Scala拥有功能丰富的集合库。像List、Set、Map等集合类型有很多实用的操作方法。例如,可以使用flatten方法将嵌套的集合扁平化为一个层次的集合。```
请谈谈 React 中的虚拟 DOM,如何通过 Diff 算法最小化真实DOM 更新次数?
程序员黄同学
前端开发 JavaScript Java面试题 react.js 算法 javascript
一、虚拟DOM核心原理与Diff算法机制1.虚拟DOM的本质虚拟DOM是轻量级的JavaScript对象,用于描述真实DOM结构。每次组件状态变化时,React会生成新的虚拟DOM树,通过对比新旧树差异(Diffing)来最小化DOM操作。//虚拟DOM对象结构示例constvNode={type:'div',props:{className:'container',children:[{type
centOS 7.9 安装JDK MYSQL
he25819
centos java mysql
jdk:JavaArchiveDownloads-JavaSE17.0.12andearlierCentOS安装JDK17教程(完整版)-秦胜飞-博客园sudoyumupdatewgethttps://download.oracle.com/java/17/archive/jdk-17.0.3.1_linux-x64_bin.rpmyuminstall./jdk-17.0.3.1_linux-x6
“[object Object]“ is not valid JSON 的解决方案
dushky
json 前端
1错误描述:使用JSON.parse()时,经常会提示:"[objectObject]"isnotvalidJSON。有2种解决方案:1.1不需要使用JSON.parse()方法JSON.parse()的工作是将JSON转换回JavaScript,所以如果从服务器响应中获取JSON,但在到达您的代码之前已经转换为JavaScript了,就不需要JSON.parse()!//ERROR!已经是jav
华山论剑:C#对Java
dbvbuv3014
c# java 内存管理
C#(C-Sharp)是Microsoft的新编程语言,被誉为“C/C++家族中第一种面向组件的语言”。然而,不管它自己宣称的是什么,许多人认为C#更像是Java的一种克隆,或者是Microsoft用来替代Java的产品。事实是否是这样的呢?本文的比较结果表明,C#不止是Java的同胞那么简单。如果你是一个Java开发者,想要学习C#或者了解更多有关C#的知识,那么本文就是你必须把最初10分钟投入
日常整理系列——笔试刷题00002
Cutepingping
前端h5+css JavaScript语言 笔试题库
1.RegExp对象的方法JavaScriptRegExp对象有3个方法:test()、exec()和compile()。(1)test()方法用来检测一个字符串是否匹配某个正则表达式,如果匹配成功,返回true,否则返回false;(2)exec()方法用来检索字符串中与正则表达式匹配的值。exec()方法返回一个数组,其中存放匹配的结果。如果未找到匹配的值,则返回null;(3)compile
二分查找排序算法
周凡杨
java 二分查找 排序 算法 折半
一:概念 二分查找又称
折半查找(
折半搜索/
二分搜索),优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而 查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表 分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步
java中的BigDecimal
bijian1013
java BigDecimal
在项目开发过程中出现精度丢失问题,查资料用BigDecimal解决,并发现如下这篇BigDecimal的解决问题的思路和方法很值得学习,特转载。
原文地址:http://blog.csdn.net/ugg/article/de
Shell echo命令详解
daizj
echo shell
Shell echo命令
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:
echo string
您可以使用echo实现更复杂的输出格式控制。 1.显示普通字符串:
echo "It is a test"
这里的双引号完全可以省略,以下命令与上面实例效果一致:
echo Itis a test 2.显示转义
Oracle DBA 简单操作
周凡杨
oracle dba sql
--执行次数多的SQL
select sql_text,executions from (
select sql_text,executions from v$sqlarea order by executions desc
) where rownum<81;
&nb
画图重绘
朱辉辉33
游戏
我第一次接触重绘是编写五子棋小游戏的时候,因为游戏里的棋盘是用线绘制的,而这些东西并不在系统自带的重绘里,所以在移动窗体时,棋盘并不会重绘出来。所以我们要重写系统的重绘方法。
在重写系统重绘方法时,我们要注意一定要调用父类的重绘方法,即加上super.paint(g),因为如果不调用父类的重绘方式,重写后会把父类的重绘覆盖掉,而父类的重绘方法是绘制画布,这样就导致我们
线程之初体验
西蜀石兰
线程
一直觉得多线程是学Java的一个分水岭,懂多线程才算入门。
之前看《编程思想》的多线程章节,看的云里雾里,知道线程类有哪几个方法,却依旧不知道线程到底是什么?书上都写线程是进程的模块,共享线程的资源,可是这跟多线程编程有毛线的关系,呜呜。。。
线程其实也是用户自定义的任务,不要过多的强调线程的属性,而忽略了线程最基本的属性。
你可以在线程类的run()方法中定义自己的任务,就跟正常的Ja
linux集群互相免登陆配置
林鹤霄
linux
配置ssh免登陆
1、生成秘钥和公钥 ssh-keygen -t rsa
2、提示让你输入,什么都不输,三次回车之后会在~下面的.ssh文件夹中多出两个文件id_rsa 和 id_rsa.pub
其中id_rsa为秘钥,id_rsa.pub为公钥,使用公钥加密的数据只有私钥才能对这些数据解密 c
mysql : Lock wait timeout exceeded; try restarting transaction
aigo
mysql
原文:http://www.cnblogs.com/freeliver54/archive/2010/09/30/1839042.html
原因是你使用的InnoDB 表类型的时候,
默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,
因为有的锁等待超过了这个时间,所以抱错.
你可以把这个时间加长,或者优化存储
Socket编程 基本的聊天实现。
alleni123
socket
public class Server
{
//用来存储所有连接上来的客户
private List<ServerThread> clients;
public static void main(String[] args)
{
Server s = new Server();
s.startServer(9988);
}
publi
多线程监听器事件模式(一个简单的例子)
百合不是茶
线程 监听模式
多线程的事件监听器模式
监听器时间模式经常与多线程使用,在多线程中如何知道我的线程正在执行那什么内容,可以通过时间监听器模式得到
创建多线程的事件监听器模式 思路:
1, 创建线程并启动,在创建线程的位置设置一个标记
2,创建队
spring InitializingBean接口
bijian1013
java spring
spring的事务的TransactionTemplate,其源码如下:
public class TransactionTemplate extends DefaultTransactionDefinition implements TransactionOperations, InitializingBean{
...
}
TransactionTemplate继承了DefaultT
Oracle中询表的权限被授予给了哪些用户
bijian1013
oracle 数据库 权限
Oracle查询表将权限赋给了哪些用户的SQL,以备查用。
select t.table_name as "表名",
t.grantee as "被授权的属组",
t.owner as "对象所在的属组"
【Struts2五】Struts2 参数传值
bit1129
struts2
Struts2中参数传值的3种情况
1.请求参数绑定到Action的实例字段上
2.Action将值传递到转发的视图上
3.Action将值传递到重定向的视图上
一、请求参数绑定到Action的实例字段上以及Action将值传递到转发的视图上
Struts可以自动将请求URL中的请求参数或者表单提交的参数绑定到Action定义的实例字段上,绑定的规则使用ognl表达式语言
【Kafka十四】关于auto.offset.reset[Q/A]
bit1129
kafka
I got serveral questions about auto.offset.reset. This configuration parameter governs how consumer read the message from Kafka when there is no initial offset in ZooKeeper or
nginx gzip压缩配置
ronin47
nginx gzip 压缩范例
nginx gzip压缩配置 更多
0
nginx
gzip
配置
随着nginx的发展,越来越多的网站使用nginx,因此nginx的优化变得越来越重要,今天我们来看看nginx的gzip压缩到底是怎么压缩的呢?
gzip(GNU-ZIP)是一种压缩技术。经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用
java-13.输入一个单向链表,输出该链表中倒数第 k 个节点
bylijinnan
java
two cursors.
Make the first cursor go K steps first.
/*
* 第 13 题:题目:输入一个单向链表,输出该链表中倒数第 k 个节点
*/
public void displayKthItemsBackWard(ListNode head,int k){
ListNode p1=head,p2=head;
Spring源码学习-JdbcTemplate queryForObject
bylijinnan
java spring
JdbcTemplate中有两个可能会混淆的queryForObject方法:
1.
Object queryForObject(String sql, Object[] args, Class requiredType)
2.
Object queryForObject(String sql, Object[] args, RowMapper rowMapper)
第1个方法是只查
[冰川时代]在冰川时代,我们需要什么样的技术?
comsci
技术
看美国那边的气候情况....我有个感觉...是不是要进入小冰期了?
那么在小冰期里面...我们的户外活动肯定会出现很多问题...在室内呆着的情况会非常多...怎么在室内呆着而不发闷...怎么用最低的电力保证室内的温度.....这都需要技术手段...
&nb
js 获取浏览器型号
cuityang
js 浏览器
根据浏览器获取iphone和apk的下载地址
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" content="text/html"/>
<meta name=
C# socks5详解 转
dalan_123
socket C#
http://www.cnblogs.com/zhujiechang/archive/2008/10/21/1316308.html 这里主要讲的是用.NET实现基于Socket5下面的代理协议进行客户端的通讯,Socket4的实现是类似的,注意的事,这里不是讲用C#实现一个代理服务器,因为实现一个代理服务器需要实现很多协议,头大,而且现在市面上有很多现成的代理服务器用,性能又好,
运维 Centos问题汇总
dcj3sjt126com
云主机
一、sh 脚本不执行的原因
sh脚本不执行的原因 只有2个
1.权限不够
2.sh脚本里路径没写完整。
二、解决You have new mail in /var/spool/mail/root
修改/usr/share/logwatch/default.conf/logwatch.conf配置文件
MailTo =
MailFrom
三、查询连接数
Yii防注入攻击笔记
dcj3sjt126com
sql WEB安全 yii
网站表单有注入漏洞须对所有用户输入的内容进行个过滤和检查,可以使用正则表达式或者直接输入字符判断,大部分是只允许输入字母和数字的,其它字符度不允许;对于内容复杂表单的内容,应该对html和script的符号进行转义替换:尤其是<,>,',"",&这几个符号 这里有个转义对照表:
http://blog.csdn.net/xinzhu1990/articl
MongoDB简介[一]
eksliang
mongodb MongoDB简介
MongoDB简介
转载请出自出处:http://eksliang.iteye.com/blog/2173288 1.1易于使用
MongoDB是一个面向文档的数据库,而不是关系型数据库。与关系型数据库相比,面向文档的数据库不再有行的概念,取而代之的是更为灵活的“文档”模型。
另外,不
zookeeper windows 入门安装和测试
greemranqq
zookeeper 安装 分布式
一、序言
以下是我对zookeeper 的一些理解: zookeeper 作为一个服务注册信息存储的管理工具,好吧,这样说得很抽象,我们举个“栗子”。
栗子1号:
假设我是一家KTV的老板,我同时拥有5家KTV,我肯定得时刻监视
Spring之使用事务缘由(2-注解实现)
ihuning
spring
Spring事务注解实现
1. 依赖包:
1.1 spring包:
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.
iOS App Launch Option
啸笑天
option
iOS 程序启动时总会调用application:didFinishLaunchingWithOptions:,其中第二个参数launchOptions为NSDictionary类型的对象,里面存储有此程序启动的原因。
launchOptions中的可能键值见UIApplication Class Reference的Launch Options Keys节 。
1、若用户直接
jdk与jre的区别(_)
macroli
java jvm jdk
简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。
JDK就是Java Development Kit JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者,而不是开发者。 如果安装了JDK,会发同你
Updates were rejected because the tip of your current branch is behind
qiaolevip
学习永无止境 每天进步一点点 众观千象 git
$ git push joe prod-2295-1
To git@git.dianrong.com:joe.le/dr-frontend.git
! [rejected] prod-2295-1 -> prod-2295-1 (non-fast-forward)
error: failed to push some refs to 'git@git.dianron
[一起学Hive]之十四-Hive的元数据表结构详解
superlxw1234
hive hive元数据结构
关键字:Hive元数据、Hive元数据表结构
之前在 “[一起学Hive]之一–Hive概述,Hive是什么”中介绍过,Hive自己维护了一套元数据,用户通过HQL查询时候,Hive首先需要结合元数据,将HQL翻译成MapReduce去执行。
本文介绍一下Hive元数据中重要的一些表结构及用途,以Hive0.13为例。
文章最后面,会以一个示例来全面了解一下,
Spring 3.2.14,4.1.7,4.2.RC2发布
wiselyman
Spring 3
Spring 3.2.14、4.1.7及4.2.RC2于6月30日发布。
其中Spring 3.2.1是一个维护版本(维护周期到2016-12-31截止),后续会继续根据需求和bug发布维护版本。此时,Spring官方强烈建议升级Spring框架至4.1.7 或者将要发布的4.2 。
其中Spring 4.1.7主要包含这些更新内容。