分类目录归档:技术文章

浅析MySql Innodb引擎的加锁机制

MySQL数据库提供了好几种引擎,比如ISAM、MyISAM、HEAP、InnoDB和Berkley DB(BDB),比较常用的就是Innodb了。Innodb主要有以下几种锁,分别用在不同的场景里。

共享锁和排它锁(Shared and Exclusive Locks)
意图锁(Intention Locks)
记录锁(Record Locks)
区间锁(Gap Locks)
Next-Key Locks

共享锁和排它锁
首先需要指出的是这两种锁都是针对行(row)而言的,是innodb在行级锁(row-level locking)方面的两个实现。共享锁(shared (S) locks),每当读取一行记录时会加上一个共享锁。排它锁(exclusive (X) lock ),每当update或者delete一条记录时都会加上一个排它锁。当事务T1对某一行R拥有了一个读锁时,另一个事务T2对该条记录可以立即获得共享锁,但是不能获得排他锁。当事务T1对某一行R拥有了一个排他锁时,另一个事务T2无论是申请排他锁还是共享锁都需要等待T1释放锁。他们之间的关系如下表所示:[……]

继续阅读

使用Apache POI生成Word文档不能被office读取的问题

近期应一个妹子的邀请做一些跟了一些和Word,excel相关的读写研究。需求很简单,就是从excel表格里读取一些白名单,然后在Word表格里找到这些匹配项再做相应的处理。因为每次手动操作很麻烦,所以呢妹子就找到了我,问下我能不能写个程序来做这件事。我一想这玩意儿应该挺简单的啊,肯定有开源的库来读写excel和Word,而且能提高妹子的工作效率,所以就欣然答应下来了。
之后就Google了一番看看有木有什么开源的库可以用,果不其然第一个就是Apache的POI项目,然后去官网看API文档。总的来说这个库使用起来还是蛮方便,下面介绍下读写Word和excel的代码:

这个只是读取excel的代码,值得一提是由WorkbookFactory创建出来的Workbook是支持xls和xlsx两种格式的文档,开发者不再需要区分是03还是07格式的excel文件,非常方便。然后读取Word文档却不像读取excel这么方便,他有两套API,一个是HWPFDocument只支持03格式的Word(后缀:doc)[……]

继续阅读

java序列化版本号

在写java程序的时候经常会看到类中会有一个序列化版本号:serialVersionUID。这个值有的类是1L,有的又是很长的数值,通常是这样声明的:

或者:

这是为什么呢?今天来总结下这个序列化版本号的作用。
先说说序列化,java的序列化指的是把java对象转化为字节序列(bytes)的过程,而反序列化就是把字节序列转化为java对象的过程。这个功能主要的作用是把java对象存储在磁盘上或者在网络上传输,如果没有这个功能你想要传输对象的话只能通过字符串拼接了。至于具体是怎么实现的查下api就知道,很简单,不再赘述了。正是因为有了反序列化机制,所以jvm需要判断需要转化的两个类是不是同一个类,于是就需要一个序列化版本号。如果在反序列化的时候两个类的serialVersionUID不一样则jvm会抛出InvalidCastException的异常;如果serialVersionUID一致则表明可以转换。
下面再来讨论下这个字段的值。
首先这个值是可[……]

继续阅读

RMDB中的事务隔离级别

网上关于这部分的介绍很多,这里写下自己对这几个隔离级别的理解。
首先解释下什么是隔离性(isolation):DB中的隔离性指的是一个操作产生的影响什么时候以哪种方式可以对其他并发操作可见。

然后再介绍几个容易混淆的概念:幻读,脏读和不可重复读
脏读(dirty reads)
某一个事务读取了另一个事务中已经修改了的但是尚未commit的数据,这就是脏读。一旦另一个事务发生回滚,则读取的值就是脏读了。
幻读(phantom reads):
A phantom read occurs when, in the course of a transaction, two identical queries are executed, and the collection of rows returned by the second query is different from the first.
在一个事务中,两个同样的查询语句得到的查询结果却不一样,这就是幻读,这里要注意一点:幻读是针对多条返回结果而言的
不可重复读(non-repeatable read)
A[……]

继续阅读

struts2和servlet

今天上海下雨了,阴冷的天让人不想出门,窝在被窝里看到了一本书:《struts2-in-action》。第一感觉是struts2这个词已经被听烂了,大学里面各种web课程项目里几乎都有它的身影,SSH嘛,第一个S就是struts。但仔细一想struts究竟是什么呢?我竟然无法准确回答出来。带着疑问阅读了这本书的第一节:Struts 2: the modern web application framework
在读之前看到作者在书的留白处还写了这样一句话:
To world peace
and a global redistribution of prosperity(为了世界和平,为了全球繁荣的重新分配)
不得不感叹国外的程序员就是逼格高啊。
文章首先介绍了最基本的HTTP通信流程,客户端发送请求到服务器端,服务器返回数据。服务器端接受到的就是HTTP请求,包括一些基本HTTP REQUEST信息还有请求参数等。所以你拿到这一堆数据之后就需要把它们转换为java可用的对象,处理完逻辑之后再把java对象转换为文本返回给客户端。每个请求都这么做实在是太繁琐了,于是java提出了[……]

继续阅读