引用计数对象(Reference counted objects)

原文地址

从Netty 4起,对象的生命周期由它们的引用计数来管理,因此,一旦对象不再被引用后,Netty 会将它(或它共享的资源)归还到对象池(或对象分配器)。在垃圾回收和引用队列不能 保证这么有效、实时的不可达性检测的情况下,引用计数以牺牲轻微的便利性为代价,提供了 另一种可选的解决方案。 最值得注意的类型是ByteBuf,它正是利用了引用计数来提升内存分配和释放的性能。这一节 将用ByteBuf来讲述引用计数在Netty中是如何工作的。

引用计数基本原理

一个新创建的引用计数对象的初始引用计数是1。

当你释放掉引用计数对象,它的引用次数减1.如果一个对象的引用计数到达0,该对象就会被 释放或者归还到创建它的对象池。

继续阅读

事务隔离级别

事务简介

事务是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么 就执行该组查询。如果其中任何一条语句因为某种原因无法执行,那么所有的语句都不会执行。即事务内部要么全部成功,要么 全部失败。

事务有四大特性,名为ACID。

  • A – Atomicity,原子性,事务被视为一个不可分割的最小工作单元
  • C – Consistency,一致性,事务总是从一个一致性的状态切换到另一个一致性的状态
  • I – Isolation,隔离性,一个事务所做的修改在提交之前,对其他事务是不可见的
  • D – Durability,持久性,一旦事务提交,则其所做的修改就会永久保存到数据库中

继续阅读

模块化的乐趣(译)

原文链接

模块间的紧耦合是一种很糟糕的设计,而耦合的最坏表现就是模块间的循环依赖。幸运的是,有几种方法可以用来消除循环依赖,分别是回调函数,代码上移,代码下移。 接下来,我会为大家展示一个小例子。示例中,我会分别使用上述几种技术来消除循环依赖。

        在消除循环依赖之后,我们会探索另外两项技术,来达到依赖反转和消除模块之间依赖的目的。本示例的所有代码都可以在Google Code下载,每个解决方法对应的代码都包含有一个编译脚本和一个简单测试用例。一般你只需要输入 ant compile就可以执行编译脚本,不过如果你想使用JarAnalyzer,那么必须要有GraphViz。注意每个解决方法对应的代码版本都具有相同的行为!

         接下来的例子非常简单。假设有这样一个系统,包含有CustomerBill两个类,分别在两个模块中—cust.jarbill.jar。同时有一个测试类PaymentTest测试两者交互的行为,集成在billtest.jar模块。最初的类图显示在下面,需要引起注意图中两个类的双向关联。

随着逐步的深入,我们会往系统中添加更多的类和抽象来提高模块化程度。另外,我们会使用JarAnalyzer来描述模块间的关系,同时也用来衡量设计的好坏。用JarAnalyzer生成的模块结构如下图所示,可以通过查看编译脚本来了解JarAnalyzer的用法。回到正题,这篇文章中我们的目的是用上述三种方法来消除循环依赖,再之后会探索不同的途径来构建非循环依赖的模块。 继续阅读

Maven依赖机制(译)

原文地址

依赖机制是Maven最为用户熟知的特性之一,同时也是Maven所擅长的领域之一。单个项目的依赖管理并不难,
但是当你面对包含数百个模块的多模块项目和应用时,Maven能帮你保证项目的高度控制力和稳定性。

大纲:

  •  传递性依赖
    • 排除、可选依赖
  • 依赖范围
  • 依赖管理
    • 导入依赖
  • 系统依赖

传递性依赖

传递性依赖是Maven2.0的新特性。假设你的项目依赖于一个库,而这个库又依赖于其他库。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的库,Maven会隐式的把这些库间接依赖的库也加入到你的项目中。这个特性是靠解析从远程仓库中获取的依赖库的项目文件实现的。一般的,这些项目的所有依赖都会加入到项目中,或者从父项目继承,或者通过传递性依赖。
传递性依赖的嵌套深度没有任何限制,只是在出现循环依赖时会报错。
传递性依赖会导致包含库的依赖图增长的非常大。为了解决这个问题,Maven也提供了额外的机制,能让你指定哪些依赖会被包含:

  • 依赖调解 – 当项目中出现多个版本构件依赖的情形,依赖调解决定最终应该使用哪个版本。目前,Maven 2.0只支持“短路径优先”原则,意思是项目会选择依赖关系树中路径最短的版本作为依赖。当然,你也可以在项目POM文件中显式指定使用哪个版本。值得注意的是,在Maven2.0.8及之前的版本中,当两个版本的依赖路径长度一致时,哪个依赖会被使用是不确定的。不过从Maven 2.0.9开始,POM中依赖声明的顺序决定了哪个版本会被使用,也叫作”第一声明原则”。
    • “短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。例如,假设A、B、C之间的依赖关系是A->B->C->D(2.0)和A->E->(D1.0),那么D(1.0)会被使用,因为A通过E到D的路径更短。但如果你想要强制使用D(2.0),那你也可以在A中显式声明对D(2.0)的依赖。
  • 依赖管理 – 在出现传递性依赖或者没有指定版本时,项目作者可以通过依赖管理直接指定模块版本。之前的章节说过,由于传递性依赖,尽管某个依赖没有被A直接指定,但也会被引入。相反的,A也可以将D加入<dependencyManagement>元素中,并在D可能被引用时决定D的版本号。
  • 依赖范围 – 你可以指定只在当前编译范围内包含合适的依赖。 下面会介绍更多相关的细节。
  • 排除依赖 – 如果项目X依赖于项目Y,项目Y又依赖项目Z,项目X的所有者可以使用”exclusion”元素来显式排除项目Z。
  • 可选依赖 – 如果项目Y依赖项目Z,项目Y的所有者可以使用”optional”元素来指定项目Z作为X的可选依赖。那么当项目X依赖项目Y时,X只依赖Y并不依赖Y的可选依赖Z。项目X的所有者也可以根据自己的意愿显式指定X对Z的依赖。(你可以把可选依赖理解为默认排除)。

继续阅读

CentOS下安装PPTP VPN服务

准备

有几种方式可以安装PPTP的服务软件。需要的软件安装包包括

  • ppp
  • pptpd: http://poptop.sourceforge.net. 下载地址:http://poptop.sourceforge.net/yum/stable/。通过rpm命令安装 rpm -ivh xxx.rpm

安装配置

  1. 验证内核是否加载了MPPE模块: modprobe ppp-compress-18 && echo MPPE is ok
  2. 配置
    • 配置ppp:
      • option文件 位置/etc/ppp/options.pptpd – 配置加密
      • 用户帐户文件 /etc/ppp/chap-secrets 添加使用的用户以及密码
      • /etc/ppp/options 全局配置文件,配置ppp链路维护间隔lcp-echo-interval
    • 配置pptpd
    • /etc/pptpd.conf ->配置pptpd server的全局地址池
  3. 开启ipforward,并添加如下iptables规则使其支持客户端访问其他网段
    – 配置文件 /etc/sysctl.conf: echo 1 >/proc/sys/net/ipv4/ip_forward(配置转发)
  4. 配置PPTP协议需要的端口,在iptables进行配置让端口放行
    • -A RH-Firewall-1-INPUT -p tcp –dport 1723 -j ACCEPT
    • -A RH-Firewall-1-INPUT -p gre -j ACCEPT
    • -A RH-Firewall-1-INPUT -p tcp –dport 47 -j ACCEPT
  5. 如需要通过nat访问还需要配置
    iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.1/24 -j MASQUERADE (vpn server需要nat来访问外网,因为内网ip不识别)

继续阅读