我有一个带有Spring的Java Web应用程序,我使用Hazelcast 3.6来缓存我从数据库服务器检索的大量数据。 我的许多课程都在HZ地图上进行了Hazelcast索引,以便更快地进行检索。
为了提高性能,我将序列化实现从Java的Serializable更改为DataSerializable,这更快。
作为概念验证,我更改了其中一个类并确认应用程序更快。 然后,我将所有被序列化的类/对象/模型更改为DataSerialization。 我们使用writeObject()来序列化everyObject的所有字段,因为某些字段可能包含null。
在经历了这个更大的变化后,我观察到(使用profilerin Eclipse)负责索引HazelCast映射的线程占用了我所有的CPU使用量并且进程从未结束。
例如
com.hazelcast.map.impl.operation.AddIndexOperation.run(AddIndexOperation.java:73)
我还观察了所有索引注释掉的应用程序,并且CPU使用率正常但应用程序速度较慢,因为没有索引映射的检索速度较慢
为什么索引与DataSerialization相比需要这么长时间而不是Serializable?
[更新] DataSerialization实施:
public class Address implements DataSerializable {
private String street;
private Integer zipCode;
public Address() {}
//getters setters..
public void writeData( ObjectDataOutput out ) throws IOException {
out.writeUTF(street);
out.writeObject(zipCode);
}
public void readData( ObjectDataInput in ) throws IOException {
street = in.readUTF();
zipCode = (Integer)in.readObject();
}
}
索引的实施:
@Override
public void addMapIndex(String mapName, String attribute, Boolean ordered) {
final IMap<?, ?> map = this.getIMapObject(mapName);
map.addIndex(attribute, ordered);
}