MySQL插入速度测试
一、测试环境1.1 硬件环境
名称
配置
操作系统
win7 64位
CPU
4核4线程 i5-4590
内存
16G
硬盘
128G SSD
MySQL
Version 5.6
1.2 数据库表结构CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL,
`sex` int(11) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`email` varchar(50) DEFAULT NULL,
`remark` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
二、插入实验2.1 普通插入
线程数
插入量(万)
...
深入理解Java线程池:ThreadPoolExecutor
看完ThreadPoolExecutor线程池源码准备写博客记录一下,但是发现一篇博客对ThreadPoolExecutor源码分析很详细,这里不再重复造轮子,所以直接转载了这篇文章。
原文地址:深入理解Java线程池:ThreadPoolExecutor
线程池介绍在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:
如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线程上花费的时间和消耗的系统资源要比处理实际的用户请求的时间和资源更多。
那么有没有一种办法使执行完一个任务,并不被销毁,而是可以继续执行其他的任务呢?
这就是线程池的目的了。线程池为线程生命周期的开销和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。
什么时候使用线程池?
单个任务处理时间比较短
需要处理的任务数量很大
使用线程池的好处
引用自 http://ifeve. ...
MySQL中MVCC是否真的能够解决幻读问题?
偶然间看到同事在看MySQL的MVCC问题,就随口插了一句,“MVCC模式解决了MySQL中的幻读问题”,但是
同事告诉我并没有,我说不可能,我清楚的记得在看《高性能MySQL 第3版》一书的事务隔离级别中的,在介绍**REPEATABLE READ **隔离级别时候提过,MVCC解决了幻读的问题。说完我还找到了书中内容给他看,内容如下:
英文原版:
REPEATABLE READ
REPEATABLE READ solves the problems that READ UNCOMMITTED allows. It guarantees that any rows a transaction reads will “look the same” in subsequent reads within the same transaction, but in theory it still allows another tricky problem: phantom reads. Simply put, a phantom read can happen ...
使用策略模式重构系统导入导出
合理的使用设计模式能提高代码的可维护性,但是往往一开始设计开发的时候没有考虑到业务的扩展性,在后期业务扩展的时候,需要在原有代码逻辑上增加新功能,这对开发人员来说无疑是非常痛苦的。刚好接到了在新的业务系统增加导入导出功能开发任务,在了解到系统原有导入导出复杂的逻辑后,决定利用策略模式来重构这一功能,降低开发的复杂度。
系统原有导入导出 系统原有使用异步导入导出方式,导入导出任务提交后,先将任务放到任务队列中去,使用一个线程不断从任务队列中获取待执行的任务交由任务线程池去执行。
精简后的部分代码如下:
FileTaskExecutor.java
// 任务分发器线程内部类
class Boss implements Runnable {
@Override
public void run() {
for (;;) {
FileTask task = null;
try {
task = taskQueue.take();
// 导入导出任务封装为Worker交 ...
基于Nginx实现三级域名访问和https访问
Nginx实现三级域名访问我的VPS上部署了MPOOM工作台、个人博客、文件共享平台三个系统,并且在阿里云平台购买了域名,想要通过nginx实现不同的三级域名访问不同的系统,例如:
MPOOM工作台:http://www.mpoon.cn
个人博客: http://blog.mpoom.cn
文件共享平台:http://m.mpoom.cn
ps:如果域名要解析到国内云服务器,域名要提前在工信部进行备案,但是如果解析到国外,则没有这个限制.
配置文件mpoom.conf如下:
# mpoom工作台
server {
listen 80;
server_name mpoom.cn www.mpoom.cn;
location / {
proxy_pass http://127.0.0.1:8090;
}
}
# 个人博客
server {
listen 80;
server_name blog.mpoo ...
Shiro简介及使用
Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications.
Apache Shiro™是一个功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理。 借助Shiro易于理解的API,您可以快速轻松地保护任何应用程序 - 从最小的移动应用程序到最大的Web和企业应用程序。
#一、Apache Shiro简介
Apache Shiro的首要目标是易于使用和理解。安全有时可能非常 ...
Java集合
早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。
虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。
集合框架被设计成要满足以下几个目标。
该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
对一个集合的扩展和适应必须是简单的。
为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Qu ...
Java类加载机制
一、类加载过程 类从被加载到虚拟机内存中开始,直到卸载出内存为止,它的整个生命周期包括了: 加载、验证、准备、解析、初始化、使用和卸载 这7个阶段。其中, 验证、准备和解析这三个部分统称为连接(linking) 。
其中,加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班的“开始”(仅仅指的是开始,而非执行或者结束,因为这些阶段通常都是互相交叉的混合进行,通常会在一个阶段执行的过程中调用或者激活另一个阶段),而解析阶段则不一定(它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定)。
加载“加载”(Loading)阶段是“类加载”(Class Loading)过程的第一个阶段,在此阶段,虚拟机需要完成以下三件事情:
1、 通过一个类的全限定名来获取定义此类的二进制字节流。
2、 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3、 在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。
加载阶段既可以使用系统提供的类加载器来完成 ...
Java中的强引用、软引用、弱引用和虚引用
Java中的强引用、软引用、弱引用和虚引用Java执行GC判断对象是否存活有两种方式其中一种是引用计数。
引用计数:Java堆中每一个对象都有一个引用计数属性,引用每新增1次计数加1,引用每释放1次计数减1。
在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于(reachable)可达状态,程序才能使用它。
从JDK 1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活地控制对象的生命周期。
Java中4种引用的级别和强度由高到低依次为:强引用 -> 软引用 -> 弱引用 -> 虚引用
引用类型
被垃圾回收时间
用途
生存时间
案例
强引用
从来不会
对象的一般状态
JVM停止运行时终止
通过new或反射创建的引用对象
软引用
当内存不足时
对象缓存
内存不足时终止
弱引用
正常垃圾回收时
对象缓存
垃圾回收后终止
虚引用
正常垃圾回收时
跟踪对象的垃圾回收
垃圾回收后终止
DirectByteBuffer堆外内存释放
参考文章
理解Java的强引用、软引用 ...
Java常用日志框架
Java常用日志框架介绍
Log4j Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创的,现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架之一。
Log4j2 Apache Log4j 2是apache开发的一款Log4j的升级产品。
Commons Logging Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名为Commons Logging。
Slf4j 类似于Commons Logging,是一套简易Java日志门面,本身并无日志的实现。(Simple Logging Facade for Java,缩写Slf4j)。
Logback 一套日志组件的实现(slf4j阵营)。
Jul (Java Util Logging),自Java1.4以来的官方日志实现。
Java常用框架历史
1996年早期,欧洲安全电子市场项目组决定编写它自己的程序跟踪API(Tracing API)。经过不断的完善,这个API终于成为一个十分受欢迎的J ...