Posted in Working Skills, 技术

Angular JS 生成动态二维码

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!
“小步快跑,试错迭代” – 《腾讯传》

一、场景

二维码的场景,很多。这里是二维码一种小场景,比如分享一个链接,商品链接,项目链接,优惠券链接…
技术实现,如果用后端实现,需要构造输出一个图片流。或者后端生产二维码图片,给图片地址就好了。弊端,这个二维码就是一个链接,后端的文件 IO 操作,还得考虑存储。太费力。
如果前端实现,这样就很轻松了。这只是个分享二维码,分享出去给人家扫一扫。利用前端的 canvas,这里坐下调研。
jq 封装的 qrcode.js ,文章网上一大堆。
angular js :https://github.com/monospaced/angular-qrcode

二、使用

1.安装 angular-qrcode

git clone https://github.com/monospaced/angular-qrcode.git
cd angular-qrcode
npm install

2.引入 js 文件

<script src="/node_modules/qrcode-generator/js/qrcode.js"></script>
<script src="/node_modules/qrcode-generator/js/qrcode_UTF8.js"></script>
<script src="/node_modules/angular-qrcode/angular-qrcode.js"></script>

并在你 angular 配置中加入对这个模块的依赖:

angular
.module('your-module', [
'monospaced.qrcode',
]);

 

3.使用

在线案例:monospaced.github.io/angular-qrcode

使用元素:

<qrcode data="string"></qrcode>

具体配置参数:

<qrcode data="string" version="2" error-correction-level="Q" size="200" color="#fff" ba kground="#000"></qrcode>

 

作为可下载的图片:

<qrcode data="string" download></qrcode>

 

作为有链接的二维码:

<qrcode data="http://example.com" href="http://example.com"></qrcode>

 

download 和 href 互斥,不能同时使用。具体参数入下:

<qrcode version="{{version}}" error-correction-level="{{level}}" size="{{size}}" data="{{var}}" href="{{var}}" color="{{color}}" background="{{background}}" download></qrcode>

 

三、小结

二维码是个好东西。

推荐:《 Springboot 系列

欢迎扫一扫我的公众号关注 — 及时得到博客订阅哦!
— http://www.bysocket.com/ —
— https://github.com/JeffLi1993 —

Posted in Working Skills, 技术

【工作代码】复杂 JSON 值替换处理

总结下最近的工作遇到的点:
入参复杂 JSON 层层嵌套,Java 怎么优雅的处理。

一、关于 JSON

JSON 是类似 XML 用于存储和交互文本信息。但优于 XML ,其更小,更快,更易懂和解析。其是一个无序的”名称/值”对的集合。由

{ 左括号
"" 名称 String
:
值
} 右括号

组成。然后 名称值对 以逗号分隔。

二、场景描述

是一个正则匹配替换的操作。一个很长很复杂的 JSON 入参,通过正则匹配其 content 对应的值中的图片地址并替换。

三、思考

框架选型 – fastjson
(fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。)

a . 思路
Java 是面向对象的语言。我要利用 fastjson 把复杂的 JSON 写出其对应的 BO 对象,然后正则替换 content 内容(即 operatorContent 方法),然后重新生成 JSON 响应。即下面代码操作:

OperatorBO operatorBO = JSON.parseObject(jsonString, OperatorBO.class);
operatorBO.setContent(operatorContent(operatorBO.getContent()));
String newJsonString = JSON.toJSONString(operatorBO);

 

好处:代码易读,容易维护
坏处:BO 实在是太复杂,而且很多数组嵌数组。PHP -> Java 服务化过程中很多不可控,容易出 BUG。

涉及的API :
序列化对象到 JSON:

String jsonString = JSON.toJSONString(obj);

反序列化 JSON 到对象:

VO vo = JSON.parseObject("...", VO.class);
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

b . 思路
只是替换操作,所以不用太考虑代码易读性。直接利用 fastjson 直接转出 JSONArray 对象,然后操作该对象即可。JSONArray 对象本质就是一个 List<Object> 如下代码:

public class JSONArray extends JSON {
    private final List<Object> list;
    protected transient Object relatedArray;
}

具体伪代码如下:

String jsonString = "[{" + "\"content\":\"content value 1\"" + "}]";
JSONArray itemDataJsonArr = JSON.parseArray(jsonString);
String content = itemDataJsonArr.getJSONObject(0).getString("content");
content = content + "23";
itemDataJsonArr.getJSONObject(0).put(CONTENT,content);

好处:不用关心其他复杂的键值对,目标只关注要替换的节点名称。
坏处:代码不易读,相对也还容易维护。

涉及的API :
替换对应的节点名称的值:

JSONObject.put("...",value);

反序列化 JSON 到 JSONArray 对象:

JSONArray jSONArray = JSON.parseObject("...");

思路 c d e …

 

四、小结

根据服务化场景,在不确定入参 JSON 的复杂度情况下,选择了思路 b.这篇其实是工作上的小小结。任何技术,任何框架的 API 是否好用优雅,是具体场景决定的。

如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

Posted in Working Skills, 技术

Java Web 工作技巧总结 16.10

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

在你成为领导者以前,成功只同自己的成长有关。
当你成为领导者以后,成功都同别人的成长有关。

1.聊聊并发插入&代码

场景:业务中有些ERP第三方调用该接口,导致多组同样的数据包会调用同一个插入接口。一般都是XXXParamList,一个批量插入的接口。

首先聊聊批量插入的代码,一般都会这样搞,伪代码

for(XXXParam xxx : XXXParamList)
validationXXXParam(xxx);
XXXDao.batchInsert(XXXParamList)

a.前端 – 灰色按钮
就是提交的时候控制,不能重复条form或者ajax。
b.后端 – 分布式锁
分布式锁的资料上次分享过:传送门 ->
http://www.cnblogs.com/PurpleDream/p/5559352.html
c.数据库 – UK
在数据库建表中设计时,设置 SQL UNIQUE 约束:传送门->
http://www.w3school.com.cn/sql/sql_unique.asp

2.继续说说数据库字段设计

技巧1 关系表 -> JSON Text字段
场景:比如商品详情页面,白色Apple,金色Apple…对应的图片显示。这样针对goods寸一条记录,记录着有个字段是 sku_image:
goodsid {[“白色”:“url”],[“金色”:“url”]}

而且Text字段是不对的。应该约定好大小,比如 VARCHAR(1000)
为啥呢?其实每次get都是流量,转换成流量方向想,那就是带宽,大字段如果在高流量高并发的情况下,容易造成查询量太大,会造成网关超过带宽。

有时候登录线上数据库PM后台,忘记了某表的字段,但只知道某表。我是这样干去取代 DESC table_name 或 SHOW CREATE TABLE table_name,SQL 很简单
SELECT * FROM XXX WHERE 1 LIMIT 1;
直接可以看到列名,修改下 WHERE 里面的条件就可以查询你想的查询的。

3.grep 命令

一般日志用过日志中心查询,但是更多情况下,单机下都会跑到服务器上直接找到自己想要的日志相关。
我是这样的,找到某异常XXXException
cat xxx.log grep ‘XXXException’
然后显示该行上下几行内容,使用 -C 参数输出匹配行的前后各4行
cat xxx.log grep ‘XXXException’ -C 4

grep 小命令 详解:传送门
https://linux.cn/article-5453-1.html

4.Maven 骨架工程

来到公司,发现小项目一个接一个地上。说罢就想起前东家的骨架工程。
很简单的就能生成 HelloWorld 项目,XXXarchetype 是我开发的估计工程依赖。生成骨架项目关键代码:
mvn archetype:generate -DgroupId=com.TT -DartifactId=helloworld -DarchetypeGroupId=com.TT -DarchetypeArtifactId=com.TT.XXXarchetype -DarchetypeVersion=0.0.1-SNAPSHOT -DinteractiveMode=false

详细教程,传送门->
http://www.voidcn.com/blog/aosica321/article/p-5764716.html

5.DO BO 互转工具

一般这种都是代码生成器,兼Java配置项。作用于两种业务model的互转:
mapstruct(效率最高)、orika(最快)、dozer(用的多)
详细教程,传送门
http://www.tianshouzhi.com/api/tutorials/mapstruct
http://blog.csdn.net/a258831020/article/details/48247187

如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

Posted in Working Skills, 技术

Java Web 工作技巧总结 16.8

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

四时不谢之兰,百节长青之竹,万古不败之石,千秋不变之人。


1. AOP – LOG
项目中,一个请求过来,一个响应回去。

1_thumb3.png

经常我们需要记录请求过来的对应的 类,方法名,请求参数和IP等一些信息,还有响应出去的,如果是 JSON 结果集的话。比如现在一般暴露给前端(前后端分离),或者其他模块基本走 Restful 接口。那怎么优雅的去记录这些东西呢?

beta 1.0
@Path("user/get")
public ListResult<User> getUser(@BeanParam GetUserParam getUserParam){
    LOGGER.info(getUserParam.toString());
    ListResult<User> userList = userService.getUserList(getUserParam);
    LOGGER.info(userList.toString());

    return userList;
}
同样,硬编码加入了两句打印的代码,其实这个没这么简单。可能日志需要输出到日志平台,可能获取IP或者请求来源的一些信息。那怎么升级会优雅呢?Annotation + AOP可能不错哦!
realease 1.0
@Path("user/get")
@ApiAdvice
public ListResult<User> getUser(@BeanParam GetUserParam getUserParam){
 ListResult<User> userList = userService.getUserList(getUserParam);

 return userList;
}

ApiAvice 的实现原理是基于 Spring AOP 和 SPring 自定义注解完成。具体这篇文章写得差不多:http://www.xdemo.org/springmvc-aop-annotation/

 

2. 出、入参封装

上一点说到了,请求入参和响应出参。
入参提供一个 BaseParam,包含了 IP ,请求来源机器,机型等各种。PagerParam 继承 BaseParam 类,增加了分页相关的参数。比如,用户的参数 UserGetPagerParam..
出参提供一个 BaseResult,包含返回码,返回信息及请求 IP等。PlainResult 单个结果集,ListResult 列表结果集,MapResult… 
同样,两者需要实现序列化。序列化的可以看看这个文章 http://www.infoq.com/cn/articles/serialization-and-deserialization
 
3. LIMIT
在处理线上问题的时候,有时候会有脏数据要进行处理。自然 DDL 操作,需要通过审批什么的。这里就不说了。主要在 UPDATE 操作的时候,注意 SQL 的写法。防止一条 SQL 误操作了其他正确的数据,加个 LIMIT 限制语句。例如
UPDATE user SET name = "BYSocket" WHERE name = "Jeff" LIMIT 1.

http://database.51cto.com/art/201005/200401.htm


4.Guava EventBus
Guava EventBus 是基于事件处理机制,是设计模式中的生产消费模式的实现。使用的场景:多半在异步的场景上。但是基于 JVM 内存上实现的,通俗的说是单机模式。需要评估好,这个异步是否是非常快速可以处理完毕。具体使用见
http://www.cnblogs.com/peida/p/EventBus.html

5.GC常用分析命令
这个总结来自有次 FullGC 特别多,OOM 的场景。然后是这样操作分析的:
jps -lvm // 查看JVM进程中的状态,并得知 JVM 的具体配置
jstat -gcutil {pid} 1000 // 每秒钟打印 GC 信息,可以看下 full GC,各种区的 实时信息
jmap -F -heap {pid} // 查看内存对象信息
主要是
jmap -dump:format=b,file=dump.bin {pid} // 导出内存对象 dump 文件

然后分析工具很多,这里用IBM HeapAnalyzer 具体使用看: http://blog.csdn.net/alexbxp/article/details/6756411

JVM 相关也看看

如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

Posted in Working Skills, 技术

Java Web dev搭建经验总结

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

回馈分析法使我看到,我对专业技术人员,不管是工程师、会计师还是市场研究人员,都容易从直觉上去理解他们。这令我大感意外。它还使我看到,我其实与那些涉猎广泛的通才没有什么共鸣。

总结下,新Mac电脑的环境搭建及推荐一些老司机的玩具(软件)

一、玩具篇(软件)

1. Google Chrome / Chrome 插件 -Draw.io Desktop 、Postman、FeHelper、Website IP、Isometric Contributions、Octotree、Momentum

Chrome 的 F12 ,调试神器。

Draw.io 我是用来画图的。Postman 测试 Rest API 接口 。FeHelper一个小工具集合体。三个是经常戳戳点击的。

还有 Website IP 显示 IP。Git Hub 两个小工具:Isometric Contributions 纯好看,Octotree 左侧出现代码目录。Momentum 在空的 Tab 加入了赏心悦目的图片。

2. Evernote/为知笔记

印象笔记我喜欢记录生活,记录IDEA,记录。。。。

为知笔记记录代码,记录技术,记录工作相关的。。。

3. Shadowsocks

代理。提供个代理服务器吧

 

server:45.78.48.253
port:4433

password:NWNmNzQ2ZT

4. SwitchHosts

Host修改。很多类似的。

5. IDEA

Java 吃饭的家伙,不多说。

二、环境

1/ zsh 安装

sh -c"$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

2/ JDK 8 安装

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载jdk-xxx.dmg。

然后设置 JAVA_HOME 环境变量,vim 文件’~/.zshrc’或’~/.bash_profile’,加入下面代码

 

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

export PATH=${JAVA_HOME}/bin:$PATH

java -version 验证下。

3/ Git 安装

https://sourceforge.net/projects/git-osx-installer/下载安装即可。

git –version验证下。

4/ Maven 安装

https://maven.apache.org/download.cgi下载 apache-maven-x.x.x-bin.zip。

设置 Maven 环境变量,和 JDK 环境一样,vim 文件’~/.zshrc’或’~/.bash_profile’,加入下面代码

export M2_HOME={Maven解压目录}/apache-maven-x.x.x

export PATH=$PATH:$M2_HOME/bin

mvn -version 验证下

项目一般都是 maven 项目,启动都基本用 maven 插件集成 jetty 启动。所以不涉及到 tomcat jetty这种安装。

5/ mysql 安装

下载 http://rj.baidu.com/soft/detail/25675.html?ald

# 移动解压后的二进制包到安装目录
sudo mv mysql-5.6.24-osx10.9-x86_64 /usr/local/mysql

# 更改 mysql 安装目录所属用户与用户组
cd /usr/local
sudo chown -R root:wheel mysql

sudo bin/mysqld --initialize --user=mysql

cd /usr/local/mysql

# 启动
sudo support-files/mysql.server start

# 重启
sudo support-files/mysql.server restart

# 停止
sudo support-files/mysql.server stop

# 检查 MySQL 运行状态
sudo support-files/mysql.server status

vim 文件’~/.zshrc’或’~/.bash_profile’,加入下面代码:

# MySQL
export PATH=${PATH}:/usr/local/mysql/bin

如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

 

Posted in Working Skills, 技术

配置Maven

采用maven管理模块工程的编译、发布。通俗的讲,就是利用maven来管理各项目。

一、Maven下载

Maven官网地址:http://maven.apache.org

二、Maven环境搭建

Windows 用户配置如下:右键”计算机” —  “属性” — “高级系统设置” — “环境变量” — “系统变量”

1. 下载 apache-maven-3.1.1.zip

2. 配置环境变量

     M2_HOME  — 配置Maven安装路径

     PATH           — 配置Maven命令文件的位置 (%M2_HOME%\bin;)

三、校验环境是否配置完毕

“win键” — 运行”cmd” ,在控制台中输入 mvn -version。如果出现下面界面,则说明环境配置完成。

 

Maven的settings.xml配置

使用默认即可。

常用指令

mvn

├── clean  清理项目

├── install 安装jar到本地仓库

├── archetype:generate  创建maven项目目录

一般利用 mvn archetype:generate 创建生成骨架工程。还有开发或构建项目,经常使用到clean和install。

Posted in Working Skills, 技术

ApacheBench压测 那点事儿

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!

“我总是希望自己不要过于草率地去批评一个人” -《傲慢与偏见》

写代码,到处是指标和数据的。在写完接口,为了保证代码在一定压力下没问题,我们需要对接口进行压测。比如写完一模块的RestAPI,就需要用Web压测工具进行压测。压测工具有很多,新潮的getling,还有Old版的ApacheBench压测。

一、 什么是ApacheBench(AB)?

ApacheBench (ab) is a single-threaded command line computerprogram for measuring the performance of HTTP web servers.

AB是一个测试HTTP WEB服务器性能的单线程命令程序。实战才是真理,但需要学会怎么使用AB命令。

 

二、 AB命令参数

通过简单的指令 ab -h ,就可以得到AB命令参数列表。如下:

ab -h

Usage: ab [options] [http[s]://]hostname[:port]/path

Options are:

    -n requests     Number of requests to perform

    -c concurrency  Number of multiple requests to make at a time

    -t timelimit    Seconds to max. to spend on benchmarking

                    This implies -n 50000

    -s timeout      Seconds to max. wait for each response

                    Default is 30 seconds

    -b windowsize   Size of TCP send/receive buffer, in bytes

    -B address      Address to bind to when making outgoing connections

    -p postfile     File containing data to POST. Remember also to set -T

    -u putfile      File containing data to PUT. Remember also to set -T

    -T content-type Content-type header to use for POST/PUT data, eg.

                    'application/x-www-form-urlencoded'

                    Default is 'text/plain'

    -v verbosity    How much troubleshooting info to print

    -w              Print out results in HTML tables

    -i              Use HEAD instead of GET

    -x attributes   String to insert as table attributes

    -y attributes   String to insert as tr attributes

    -z attributes   String to insert as td or th attributes

    -C attribute    Add cookie, eg. 'Apache=1234'. (repeatable)

    -H attribute    Add Arbitrary header line, eg. 'Accept-Encoding: gzip'

                    Inserted after all normal header lines. (repeatable)

    -A attribute    Add Basic WWW Authentication, the attributes

                    are a colon separated username and password.

    -P attribute    Add Basic Proxy Authentication, the attributes

                    are a colon separated username and password.

    -X proxy:port   Proxyserver and port number to use

    -V              Print version number and exit

    -k              Use HTTP KeepAlive feature

    -d              Do not show percentiles served table.

    -S              Do not show confidence estimators and warnings.

    -q              Do not show progress when doing more than 150 requests

    -l              Accept variable document length (use this for dynamic pages)

    -g filename     Output collected data to gnuplot format file.

    -e filename     Output CSV file with percentages served

    -r              Don't exit on socket receive errors.

    -m method       Method name

    -h              Display usage information (this message)

    -Z ciphersuite  Specify SSL/TLS cipher suite (See openssl ciphers)

    -f protocol     Specify SSL/TLS protocol

                    (SSL3, TLS1, TLS1.1, TLS1.2 or ALL)

常用命令参数如下:

-n 测试的请求数量

-c 同时请求数量(并发数)

-t 测试时间

以上一般搭配 -n & -c 或者 -n & -t

-k HTTP保持Keep-Alive方式(长连接)

-p POST方式下发送的数据

-T POST或PUT方式下的Content-type

 

三、简单例子

从常用命令参数中,我们用案例说话:

a. 同时10个请求,连续点击1000次(每次Request完毕自动销毁,重新请求)

ab -n 1000 -c 10 http://www.test.com/index.html

b. 同时10个请求,连续点击1000次,并保持Keep-Alive方式(保持长连接的方式)

ab -n 1000 -c 10 -k http://www.test.com/index.html

c. 同时10个请求,请求测试时间为20s

ab -c 10 -t 20 http://www.test.com/index.html

d. 将请求性能详情输出到CSV档文件

ab -e output.csv -n 1000 -c 10 http://www.test.com/index.html

out.csv: {请求序号 – 请求耗时ms}

e. 包含Post的数据的文件,例如POST发送JSON格式数据

ab -p p.json -T application/json -n 1000 -c 10 http://www.test.com/index.html

p.json:

{"mallId" : 1, "itemIds" : [9102,9101]}

四、返回参数详解

比如 我们拿简单案例第一个测试,得到了返回报告如下:

Server Software:        nginx/1.9.15

Server Hostname:        www.test.com

Server Port:            80

Document Path:          /index.html

Document Length:        161 bytes

Concurrency Level:      10

Time taken for tests:   5.760 seconds

Complete requests:      100

Failed requests:        0

Non-2xx responses:      100

Total transferred:      35200 bytes

HTML transferred:       16100 bytes

Requests per second:    17.36 [#/sec] (mean)

Time per request:       575.955 [ms] (mean)

Time per request:       57.595 [ms] (mean, across all concurrent requests)

Transfer rate:          5.97 [Kbytes/sec] received

Connection Times (ms)

              min  mean[+/-sd] median   max

Connect:      179  197  28.3    187     320

Processing:   179  240 236.8    186    2074

Waiting:      179  231 229.2    186    2073

Total:        360  437 238.4    374    2263

Percentage of the requests served within a certain time (ms)

  50%    374

  66%    381

  75%    418

  80%    427

  90%    513

  95%    567

  98%   1685

  99%   2263

 100%   2263 (longest request)

指标太多,我们要去看关键指标,比如

—-关键指标—-

Failed requests  失败的请求数。如果太多证明Web服务器稳定度不够

Request per second 每秒请求的次数。代表web服务器的承载量,即吞吐量(不考虑带宽限制)

Time per request:855.897 [ms] (mean)用户平均请求等待时间。可以通过1000ms/Time per request算出每秒的事务数 QPS ,mean是平均值

Time per request:85.590 [ms] (mean, across all concurrent requests) 服务器平均处理每一个并发请求的时间。可以1000ms/Time per request算出平均事务响应时间,mean是平均值

详细解释如下:

Server Software:  服务器名称(从http响应数据的头信息获取)

Server Hostname:  服务器Host名称(从http请求数据的头信息获取)

Server Port:      服务器端口

Document Path:    请求的根绝对路径, 默认为 /

Document Length:  响应数据的正文大小, 单位为 Byte

Concurrency Level: 并发用户数(命令中表现为-c后面跟着的参数)

Time taken for tests: 所有请求测试的总耗时(如果是 -t 参数,则为该数值;如果是 -n 请求,一般来说 值越大,耗时越多)

Complete requests: 总请求数(-n 参数值)

Failed requests:   失败的请求数(2XX失败的请求除外)

Write errors:      写入失败的数量

Total transferred: 数据传输量

HTML transferred:  所有请求的响应数据长度总和

Requests per second: 每秒请求的次数。代表web服务器的承载量,即吞吐量(不考虑带宽限制)

Time per request:  用户平均请求等待时间

Time per request:  服务器平均处理每一个并发请求的时间

Transfer rate:     请求在单位时间内从服务器获取的数据长度

五、机器Top命令 & 压测建议

压测中,我们要关注服务器的性能,一般28原则。即

1. 压测要将某个指标压到 80%左右。比如Linux服务器 top命令,实时查看服务器性能:

top - 15:22:08 up 41 days, 23:39,  1 user,  load average: 0.21, 0.05, 0.02

Tasks: 392 total,   1 running, 391 sleeping,   0 stopped,   0 zombie

Cpu0  :  1.0%us,  0.0%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  P COMMAND

24425 root      20   0 13728 1580  944 R  1.0  0.1   0:00.98 0 top

关键指标达到 80% ,得出报告最准确。

load average (0.21, 0.05, 0.02)- 系统负载,即 1分钟、5分钟、15分前的任务队列的平均长度,所以可以看第一个是否达到80%

Cpu0 CPU占用百分比

wa 等待输入输出的CPU时间百分比,即网络IO操作

2. 循序渐进:同时请求数阶梯式加进去。达到上面某个指标的域

3. 服务器压测服务器,不用多说

4. 排除带宽限制、多台服务器测试


如以上文章或链接对你有帮助的话,别忘了在文章结尾处评论哈~ 你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章。

 

Posted in Working Skills, 技术

数据库必会必知 之 SQL四种语言:DDL DML DCL TCL

作者:泥瓦匠
今天群里面讨论,DDL 还是 DML,我这种小白还是总结下他们的区别吧。

1. DDL – Data Definition Language

数据库定义语言:定义数据库的结构。

其主要命令有CREATE,ALTER,DROP等,下面用例子详解。该语言不需要commit,因此慎重。

CREATE – to create objects in the database   在数据库创建对象

例:CREATE DATABASE test; // 创建一个名为test的数据库

ALTER – alters the structure of the database   修改数据库结构

例:ALTER TABLE test ADD birthday date; // 修改test表,新增date类型的birthday列

DROP – delete objects from the database   从数据库中删除对象

例:DROP DATABASE test;// 删除test数据库

还有其他的:

TRUNCATE – 截断表内容(开发期,还是挺常用的)

COMMENT – 为数据字典添加备注

 

2. DML – Data Manipulation Language

数据库操作语言:SQL中处理数据库中的数据

其主要命令有INSERT,UPDATE,DELETE等,这些例子大家常用就不一一介绍了。该语言需要commit。还有常用的 LOCK TABLE ,记得写过锁的博客 – 传送门

还有其他不熟悉的:

CALL – 调用一个PL/SQL或Java子程序
EXPLAIN PLAN – 解析分析数据访问路径

 

3. DCL – Data Control Language

数据库控制语言:授权,角色控制等

GRANT – 为用户赋予访问权限

REVOKE – 撤回授权权限

 

4. TCL – Transaction Control Language

事务控制语言

COMMIT – 保存已完成的工作

SAVEPOINT – 在事务中设置保存点,可以回滚到此处

ROLLBACK – 回滚

SET TRANSACTION – 改变事务选项

例子:Java中JDBC封装了对事务的支持。比如我们首先新建一个表:test

test.sql

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `city`
-- ----------------------------
DROP TABLE IF EXISTS `city`;
CREATE TABLE `city` (
  `id` int(11) NOT NULL DEFAULT '0' COMMENT '城市ID',
  `name` varchar(20) DEFAULT NULL COMMENT '名称',
  `state` varchar(20) DEFAULT NULL COMMENT '状态',
  `country` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

SET FOREIGN_KEY_CHECKS = 1;

JDBC事务回滚第一个例子 -JDBC数据库事务回滚:

/**
 * 描述:JDBC数据库事务回滚
 *
 * Created by bysocket on 16/6/6.
 */
public class TransactionRollBack extends BaseJDBC {

    public static void main(String[] args) throws SQLException {
        Connection conn = null;
        try {
            // 加载数据库驱动
            Class.forName(DRIVER);
            // 数据库连接
            conn = DriverManager.getConnection(URL,USER,PWD);

            // 关闭自动提交的事务机制
            conn.setAutoCommit(false);
            // 设置事务隔离级别 SERIALIZABLE
            conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

            Statement stmt = conn.createStatement();
            int rows = stmt.executeUpdate("INSERT INTO city VALUES (3,'china',1,'cc')");
            rows = stmt.executeUpdate("UPDATE city set country = 'TAIWAN' WHERE id = 4");

            // 提交事务
            conn.commit();
        } catch (Exception e) {
            e.printStackTrace();
            // 回滚事务
            if (conn != null) {
                conn.rollback();
            }
        } finally {
            /** 关闭数据库连接 */
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

第 19 行:设置了事务隔离级别为 SERIALIZABLE 底层调用的是TCL语言的SET TRANSACTION

第 22 行:执行通过,插入数据

第 23 行:执行不通过,没有主键为4的记录,直接抛出异常

第 31 行:事务回滚,封装的就是 TCL 语句的ROLLBACK

休息下,一个例子不够,再来一个。代码都在github主页上。https://github.com/JeffLi1993/jee-component-learning

JDBC事务回滚第二个例子-JDBC数据库事务回滚,回滚到特定的保存点:

/**
 * 描述:JDBC数据库事务回滚,回滚到特定的保存点
 *
 * Created by bysocket on 16/6/6.
 */
public class TransactionRollBack2 extends BaseJDBC {
    public static void main(String[] args) throws SQLException {
        Connection conn = null;
        Savepoint svpt = null;
        try {
            // 加载数据库驱动
            Class.forName(DRIVER);
            // 数据库连接
            conn = DriverManager.getConnection(URL,USER,PWD);

            // 关闭自动提交的事务机制
            conn.setAutoCommit(false);
            // 设置事务隔离级别 SERIALIZABLE
            conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

            Statement stmt = conn.createStatement();
            int rows = stmt.executeUpdate("INSERT INTO city VALUES (3,'china',1,'cc')");
            // 设置事务保存点
            svpt = conn.setSavepoint();
            rows = stmt.executeUpdate("UPDATE city set country = 'TAIWAN' WHERE id = 4");

            // 提交事务
            conn.commit();
        } catch (Exception e) {
            e.printStackTrace();
            // 回滚事务
            if (conn != null) {
                conn.rollback(svpt);
            }
        } finally {
            /** 关闭数据库连接 */
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

和第一个例子重复的就不提了。

第 9 行:声明了一个保存点

第 24 行:设置了保存点

第 33 行:回滚事务到该保存点

上面的代码涉及到的是 TCL语言中的 SAVEPOINT

 

最后来张图总结:(SELECT属于DQL哈。)

QQ20160612-0


如以上文章或链接对你有帮助的话,别忘了分享到朋友圈,让更多的人阅读这篇文章。