Archive for 八月, 2010

Solr之困

星期天, 八月 22nd, 2010

重写公司的站内搜索。经过前期一段时间对lucene和solr的熟悉,最后决定使用Solr作为新系统的基础框架。现在已经是第一阶段开发的后期,核心代码行数有11000+(不包含admin及client等)。现已实现的功能要比已有系统要丰富些,但综合比较两个系统总的代码量,其实新系统并不多得太多。新系统使用Solr代替了已有系统实现的部分功能,这减少了新系统的代码量,同是新系统实现了已有系统不具有的功能,也增加了一些代码量。开发的这段时间,因为新系统中很多代码是独立于Solr的,所以和Solr的交互也是时断时续,以使得即便到了开发后期我还能发现Solr实现的一些细节带给我的困扰。

HttpClient的“Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.”警告释疑

星期六, 八月 21st, 2010

使用HttpClient,总是报出“Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.”的WARN日志,定位到HttpClient的源码如下:

public byte[] getResponseBody() throws IOException {
if (this.responseBody == null) {
InputStream instream = getResponseBodyAsStream();
[...]

构建健壮的Java基准测试

星期天, 八月 15th, 2010

本周遇到几篇和基准测试相关的不错的文章,如果不是因为上周末鼓弄了一下各种锁的性能测试,我或许就会错过它们。两篇文章来自dw,分别是 Robust Java benchmarking, Part 1: Issues 和 Robust Java benchmarking, Part 2: Statistics and solutions,作者还有个专页 Java benchmarking article 提供一个Java基准测试的框架,感兴趣的可参考之。本文算是对Robust Java benchmarking, Part 1: Issues的一个简单的总结。在阅读Robust Java benchmarking两篇文章的过程中,我也看了些其中的参考文章,也有一些不错的可以拜读之。

Java中各种锁类型的基准性能评测

星期二, 八月 10th, 2010

周末对Java中各种类型的锁做了基准评测。测试的条件有两个:1)是10、50、100个不同的并发线程,2)是读写比例近似1:1,10:1,100:1,1000:1。测试方法是,对各种加锁的Map方法做性能评测,它们都是实现了MapWrapper接口的封装,测试的就是Map的get和put方法。测试的锁类型有:1)hashtable:直接测试Hashtable,2)synclock:对HashMap的方法直接加synchronized(理论上性能应和Hashtable相当),3)mutexlock:对HashMap的方法显示加Lock锁,4)rwlock:对HashMap加读写锁,5)concrrent:直接使用ConcurrentHashMap的方法,6)对HashMap读操作不加锁,写操作加Lock。

[Solr源码分析]LRUCache和FastLRUCache实现分析

星期一, 八月 9th, 2010

在 [Solr 实践]Solr Cache使用介绍及分析 一文我有对Solr的LRUCache和FastLRUCache做了一些介绍,本文在此基础对其实现做些补充。
1、LRUCache的实现分析
在分析LRUCache前先对LinkedHashMap做些介绍。LinkedHashMap继承于HashMap,它使用了一个双向链表来存储Map中的Entry顺序关系,这种顺序有两种,一种是LRU顺序,一种是插入顺序,这可以由其构造函数public LinkedHashMap(int initialCapacity,float loadFactor, boolean accessOrder)指定。所以,对于get、put、remove等操作,LinkedHashMap除了要做HashMap做的事情,还做些调整Entry顺序链表的工作。
以get操作为例,如果是LRU顺序(accessOrder为true),Entry的recordAccess方法就调整get到的Entry到链表的头部去:

public V get(Object key) {
Entry<K,V> e = (Entry<K,V>)getEntry(key);
if (e [...]

分析多线程并发写HashMap线程被hang住的原因

星期六, 八月 7th, 2010

在blogjava上看到一文 谁能帮忙解释一下为什么这个程序会死锁?,激发了我那能害死猫的好奇,所以很费劲的琢磨了这个问题。由于涉及的内容较多,就单独发文阐述一下。
文中提到的问题程序如下:

public class TestLock {
private final HashMap map = new HashMap();
public TestLock() {
final Thread t1 = new Thread() {
@Override
public void run() {
for(int i=0; i<500000; i++) {
[...]

PHP中的“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误

星期六, 八月 7th, 2010

因为需要,今天晚些在本机使用PHP做些测试,PHP脚本依赖了一堆我也不清楚做什么用的库。结果一跑起来,就报出类似下面的错误:“Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/kafka/test/test.php on line 8”。查找代码,发现报错的代码类似:“$class_name::func1();”,也就是使用一个表示类名的字符串变量来调用它的静态方法,并且是解析时的语法错误(我第一眼看到::时,脑子里浮现的是C++里的作用域符号,好长时间后才想起PHP里有::也有这种东西,我也是用过 self::doSomething()的)。

[Solr实践]Solr Cache使用介绍及分析

星期天, 八月 1st, 2010

本文将介绍Solr查询中涉及到的Cache使用及相关的实现。Solr查询的核心类就是SolrIndexSearcher,每个core通常在同一时刻只由当前的SolrIndexSearcher供上层的handler使用(当切换SolrIndexSearcher时可能会有两个同时提供服务),而Solr的各种Cache是依附于SolrIndexSearcher的,SolrIndexSearcher在则Cache生,SolrIndexSearcher亡则Cache被清空close掉。Solr中的应用Cache有filterCache、queryResultCache、documentCache等,这些Cache都是SolrCache的实现类,并且是SolrIndexSearcher的成员变量,各自有着不同的逻辑和使命,下面分别予以介绍和分析。