例如,在我的mapdb应用程序中,我有一个简单的域对象Course:
import java.io.Serializable;
class Course implements Serializable {
private static final long serialVersionUID = 1L;
String cID;
String name;
String teacherName;
String departmentName;
public Course(String name) {
this.name = name;
System.out.println("Update: added course \"" + name);
}
}
Run Code Online (Sandbox Code Playgroud)
通过反复试验,我添加了工具Serializable,serialVersionID和我自己的域密钥cID。一切似乎正常。但是这是将其存储到MapDB中的代码:
NavigableMap<String, Course> courses;
courses = db.treeMap("courses", Serializer.STRING, Serializer.JAVA).createOrOpen();
Run Code Online (Sandbox Code Playgroud)
给出警告:
Type safety: The expression of type BTreeMap needs unchecked
conversion to conform to NavigableMap<String,Course>
Run Code Online (Sandbox Code Playgroud)
我不了解该错误,但我相信这与我序列化为Serializer.JAVA有关。发生了什么,或者我做错了什么?
我已经实现了一个hazelcast服务,它通过MapStoreFactory和newMapLoader将其数据存储到本地mapdb实例中.这样,如果需要重新启动集群,则可以加载密钥:
public class HCMapStore<V> implements MapStore<String, V> {
Map<String, V> map;
/** specify the mapdb e.g. via
* DBMaker.newFileDB(new File("mapdb")).closeOnJvmShutdown().make()
*/
public HCMapStore(DB db) {
this.db = db;
this.map = db.createHashMap("someMapName").<String, Object>makeOrGet();
}
// some other store methods are omitted
@Override
public void delete(String k) {
logger.info("delete, " + k);
map.remove(k);
db.commit();
}
// MapLoader methods
@Override
public V load(String key) {
logger.info("load, " + key);
return map.get(key);
}
@Override
public Set<String> loadAllKeys() {
logger.info("loadAllKeys");
return map.keySet();
}
@Override
public …Run Code Online (Sandbox Code Playgroud) 我试图运行一个简单的mapdb示例,但得到错误:
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
at org.mapdb.DBMaker.fileDB(DBMaker.kt)
at leechies.Truc.main(Truc.java:9)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 more
Run Code Online (Sandbox Code Playgroud)
我的课:
package leechies;
import java.util.concurrent.ConcurrentMap;
import org.mapdb.DB;
import org.mapdb.DBMaker;
public class Truc {
public static void main(String[] args) {
DB db = DBMaker.fileDB("file.db").make();
ConcurrentMap map = db.hashMap("map").createOrOpen();
map.put("something", "here");
db.close();
}
}
Run Code Online (Sandbox Code Playgroud)
我的pomx.xml
<dependencies>
<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
<version>3.0.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我运行rigth click - > Run as ... - > java application.
我有一个用例,我想使用opaque byte []作为MapDb的键.我发现了这一点 - 使用字节数组作为Map键 - 快速限制; 并想知道推荐哪种方法.
我宁愿不创建一堆临时对象和序列化开销,但似乎ByteBuffer.wrap(my_bytes)是Java指向我的地方.
我希望MapDB的核心开发者之一可以权衡这个或者ByteBufferJVM大师.
我使用mapdb如下
val mycache = DBMaker.newFileDB(new File(("/data/tmp/cache.db")))
.transactionDisable()
.make().getHashSet("")
Run Code Online (Sandbox Code Playgroud)
然后当我这样做
mycache.put(k1, v1)
assertTrue(mycache.get(k1), v1) // all is fine
Run Code Online (Sandbox Code Playgroud)
但是,如果我重新启动我的服务器,我确实看到我在磁盘上有cache.db但是在阅读时会有一个空地图
所以
mycache.get(k1) // is null after restart
Run Code Online (Sandbox Code Playgroud)
如何从文件重启后重新读取我的地图?