package io.mycat.cache.impl;
import io.mycat.cache.CachePool;
import io.mycat.cache.CacheStatic;
import org.iq80.leveldb.DB;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
public class LevelDBPool implements CachePool {
private static final Logger LOGGER = LoggerFactory.getLogger(LevelDBPool.class);
private final DB cache;
private final CacheStatic cacheStati = new CacheStatic();
private final String name;
private final long maxSize;
public LevelDBPool(String name,DB db,long maxSize) {
this.cache = db;
this.name=name;
this.maxSize=maxSize;
cacheStati.setMaxSize(maxSize);
}
@Override
public void putIfAbsent(Object key, Object value) {
cache.put(toByteArray(key),toByteArray(value));
cacheStati.incPutTimes();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(name+" add leveldb cache ,key:" + key + " value:" + value);
}
}
@Override
public Object get(Object key) {
Object ob= toObject(cache.get(toByteArray(key)));
if (ob != null) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(name+" hit cache ,key:" + key);
}
cacheStati.incHitTimes();
return ob;
} else {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(name+" miss cache ,key:" + key);
}
cacheStati.incAccessTimes();
return null;
}
}
@Override
public void clearCache() {
LOGGER.info("clear cache "+name);
//cache.delete(key);
cacheStati.reset();
//cacheStati.setMemorySize(cache.g);
}
@Override
public CacheStatic getCacheStatic() {
/*
int i=0;
try {
// DBIterator iterator = cache.iterator();
for(cache.iterator().seekToFirst(); cache.iterator().hasNext(); cache.iterator().next()) {
i++;
}
cache.iterator().close();
} catch (Exception e) {
// Make sure you close the iterator to avoid resource leaks.
}
//long[] sizes = cache.getApproximateSizes(new Range(bytes("TESTDB"), bytes("TESTDC")));
*/
//cacheStati.setItemSize(cache.getSize());//sizes[0]);//需要修改leveldb的代码
cacheStati.setItemSize(cacheStati.getPutTimes());
return cacheStati;
}
@Override
public long getMaxSize() {
return maxSize;
}
public byte[] toByteArray (Object obj) {
byte[] bytes = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
oos.flush();
bytes = bos.toByteArray ();
oos.close();
bos.close();
} catch (IOException ex) {
LOGGER.error("toByteArrayError", ex);
}
return bytes;
}
public Object toObject (byte[] bytes) {
Object obj = null;
if ((bytes==null) || (bytes.length<=0)) {
return obj;
}
try {
ByteArrayInputStream bis = new ByteArrayInputStream (bytes);
ObjectInputStream ois = new ObjectInputStream (bis);
obj = ois.readObject();
ois.close();
bis.close();
} catch (IOException ex) {
LOGGER.error("toObjectError", ex);
} catch (ClassNotFoundException ex) {
LOGGER.error("toObjectError", ex);
}
return obj;
}
}