日期:2014-05-16  浏览次数:20476 次

避免对象序列化存储时对数据库N+1操作
最近在review code时发现如下code。

需求:对一批对象A进行db存储和读取操作,其中A有一个复杂对象B,表的设计有一个字段存储B的xml序列化形式。

Code:
读取时:

public A[] readA(AKey[] aKeys){
    //此时a中的对象不包含B.
    A[] a=db.read(akeys);
    for(A ta:a){
        fillB(ta);
    }
   return a;
}

private void fillB(A a){
   //从db拿到a中b的string表示。
   String bString=db.read(a.key);
   //反序列化
   B b=Xml.parseB(bString);
   a.setB(b);
}


这明显是一个N+1操作。

解决办法之一,新建一个class AValue,用来映射A和数据库的存储。AValue中的属性除了B以外和A相同,另外多一个bString,来存储B的String表示。

public A[] readA(AKey[] aKeys){
    //此时avalues中的对象包含b的string形式.
    AValue[] aValues=db.read(akeys);
    //对每一个aValue反序列化bString到B,构造一个A对象。
    ......
}