読者です 読者をやめる 読者になる 読者になる

#chiroito ’s blog

Java を中心とした趣味の技術について

PofSerializerを使ってみた

Serializableインターフェースを実現していればCoherenceのキャッシュに格納することができますがパフォーマンスは低いです。
そのため、Coherenceでは独自にシリアライズを行うインターフェースを用意しています。
それがPofSerializerやPortableObjectです。
PortableObjectはキャッシュに入れたいクラス自体が実現する必要があります。
しかし、O/Rマッパーを使用しているとエンティティに手を加えることが困難なことがあるため今回はPofSerializerを使用します。

環境

先日作ったS2JDBCを使います。
Coherence+S2JDBC CacheLoader,CacheStore編
Java 6.0
Seasar 2.4.43
Coherence 3.6.1
Eclipse Java EE IDE for Web Developers.Helios Service Release 1

サンプルソース

EmployeeSerializer.java
package com.chirokings.serializer;
import java.io.IOException;
import com.tangosol.io.pof.PofReader;
import com.tangosol.io.pof.PofSerializer;
import com.tangosol.io.pof.PofWriter;
import com.chirokings.entity.Employee;

public class EmployeeSerializer implements PofSerializer {
@Override
public Object deserialize(PofReader pr) throws IOException {
Employee emp = new Employee();
emp.companyId = pr.readString(0);
emp.employeId = pr.readBigDecimal(1);
emp.name = pr.readString(2);
emp.age = pr.readBigDecimal(3);
pr.readRemainder();
return emp;
}
@Override
public void serialize(PofWriter pw, Object obj) throws IOException {
Employee emp = (Employee)obj;
pw.writeString(0, emp.companyId);
pw.writeBigDecimal(1, emp.employeId);
pw.writeString(2, emp.name);
pw.writeBigDecimal(3, emp.age);
pw.writeRemainder(null);
}
}
my-pof-config.xml



coherence-pof-config.xml

1001
com.chirokings.entity.Employee

com.chirokings.serializer.EmployeeSerializer




serializerCache1.xml





com.chirokings.entity.Employee
distributed-s2jdbc




distributed-s2jdbc










TestSerializer1.java
package com.chirokings;

import java.math.BigDecimal;
import com.chirokings.entity.Employee;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;

public class TestSerializer1 {
public static void main(String[] args) {
NamedCache cache = CacheFactory.getCache(Employee.class.getName());
Employee emp1 = new Employee();
emp1.companyId = "OR";
emp1.employeId = new BigDecimal(1);
emp1.age = new BigDecimal(27);
emp1.name = "abc";
cache.put("key",emp1);
Employee emp2 = (Employee)cache.get("key");
System.out.println(emp2.name);
}
}

実行

下記のvm引数を与えてTestSerializer1.javaを実行します。
-Dtangosol.coherence.cacheconfig=serializerCache1.xml -Xms512M -Xmx512M -Dtangosol.coherence.localhost=127.0.0.1 -Dtangosol.coherence.ttl=0 -Dtangosol.pof.enabled=true -Dtangosol.pof.config=my-pof-config.xml

参考

The Portable Object Format - Coherence 3.5 User Guide - Oracle Coherence Knowledge Base
Oracle Coherence入門