java mapdb
今天,Java开发人员可以使用许多数据库引擎,实际上有100多种选择。 可用选项中包括一些“纯java”实现,包括H2,Apache Derby等。 我已经在Java和数据库开发领域工作了很多年,当我发现MapDB(及其前身项目)时,立即被这个开源项目提供的自然方法和敏捷性所吸引。
MapDB允许您作为Java开发人员每天做您要做的事情:使用熟悉,自然和强大的Java Collections API进行工作-不仅可以克服Java Heap Memory的传统限制,而且可以避免使用大数据集进行垃圾回收。 我能够在几分钟内启动并运行MapDB,现在,我可以使用完善的Java Collections API创建几乎任何大小的集合(Map,Set,Queue等)。 这意味着您甚至可以将MapDB与现有的Java应用程序一起使用,只需修改要使用此功能强大的引擎扩展的集合的初始化即可。
在MapDB之前,Jan Kotek(主要的MapDB开发人员)支持各种版本的JDBM(Java数据库管理器)项目。 JDBM本身是UNIX DBM和GDBM(一种C语言数据库)的Java端口,支持磁盘上基于散列的键值存储。 通过这一经验,Jan看到了如何极大地改善和扩展体系结构,从而将MapDB创建为全新的实现。 Jan的经验得到了回报,MapDB提供了易用性,一种灵活的数据库结构方法,事务支持,并发性以及非常出色的性能。
现在,MapDB 1.0作为Apache 2.0许可的项目发布,可从以下网站获得: www.mapdb.org 。Java开发人员的自然API
MapDB有许多强大的功能,但我首先注意到的是它直观且灵活的API。 例如,如果您要创建一个Map结构(甚至高达100 GB的GB),这里就是所需要的:// Initialize a MapDB database
DB db = DBMaker.newFileDB(new File("testdb"))
.closeOnJvmShutdown()
.make();
// Create a Map:
Map<String,String> myMap = db.getTreeMap(“testmap”);
// Work with the Map using the normal Map API.
myMap.put(“key1”, “value1”);
myMap.put(“key2”, “value2”);
String value = myMap.get(“key1”);
...
这就是您需要做的,现在您有了一个几乎任何大小的文件支持的Map。
另一个非常强大的功能是MapDB利用了一些高级Java Collections变体,例如ConcurrentNavigableMap。 使用这种类型的Map,您可以超越简单的键值语义,因为它还是一个排序的Map,允许您按顺序访问数据并在键附近查找值。 没有多少人知道Collections API的这种扩展,但是它非常强大,可以让您对MapDB数据库做很多事情(我将在以后的文章中介绍更多这些功能)。
当我第一次见到Jan并开始与他谈论MapDB时,他说了一个很重要的印象:如果知道所需的数据结构,MapDB可以让您根据实际的应用需求定制结构。 换句话说,架构和数据结构方式非常灵活。
为什么这么重要? 我在职业生涯的早期就了解到,如果您可以创建一个与您要执行的操作相匹配的数据结构,则与“通用”结构相比,它可以提供更好的性能(有时要好几个数量级)。 尽管这不在本介绍性文章的讨论范围之内,但这是一个开创性的概念,因为MapDB不仅使您能够创建Maps,Sets等来满足您的需求,而且还为它们内部实现提供了极大的灵活性。结构。 在这里,您可以真正摆脱传统思维,并获得所需的性能-与使用仅支持单个内部结构的其他引擎尝试各种“变通方法”相比,所需的工作量通常要少得多。
它们对于此功能的关键是MapDB的体系结构固有的,以及它如何转换为MapDB API本身。 这是MapDB体系结构的简单图:
从图中可以看到,MapDB有3个层:
- Collections API:这是每个Java开发人员用来维护应用程序状态的熟悉的Java Collections API。 它具有一个简单的构建器样式扩展,可让您控制给定数据库的确切特征(包括其内部格式或记录结构)。
引擎:引擎是MapDB的真正关键,在这里数据库的记录(包括其内部结构,并发控制,事务语义)受到控制。 MapDB已经附带了多个引擎,如果需要进行专门的数据处理,可以很容易地添加您自己的引擎。
卷:这是物理存储层(例如,磁盘上或内存中)。 MapDB有一些标准的Volume实施,对于大多数项目来说就足够了。
要点是,开发API与Engine实现(MapDB的核心)完全不同,并且两者均与实际的物理存储层分开。 这提供了一种非常灵活的方法,允许开发人员精确控制给定数据库所需的内部结构类型以及顶层Collections API的实际数据结构。
该架构支持许多功能(同样,有关高级MapDB概念的后续文章的主题)。
但是,无需任何内部知识,您就可以使用现有功能轻松实现出色的敏捷性。 在第一个简单的代码示例中,我展示了用于创建数据库的生成器样式的API。 这就是功能所在,因为静态构建器方法可扩展为支持任何可用的Engine功能。
例如,假设我想要一个没有事务处理功能的纯内存数据库。 我需要做的就是添加一些构建器方法以实现令人难以置信的快速配置-而且我的应用程序代码根本不需要更改 :
// Initialize an in-memory MapDB database
// without transactions
DB db = DBMaker.newMemoryDB()
.transactionDisable()
.closeOnJvmShutdown()
.make();
// Create a Map:
Map<String,String> myMap = db.getTreeMap(“testmap”);
// Work with the Map using the normal Map API.
myMap.put(“key1”, “value1”);
myMap.put(“key2”, “value2”);
String value = myMap.get(“key1”);
...
而已!
所需要做的只是更改DBMaker调用以添加新选项,其他所有功能都完全相同。
标准的MapDB DBMaker类支持许多选项,可让您对所需的数据库类型进行特定控制。 这确实很棒,因为在许多应用程序中,我已经看到开发人员依靠多个数据库引擎来完成工作-尽管我不希望MapDB取代所有其他数据库,但它的敏捷性令人难以置信,并支持多种操作模式。
敏捷的数据结构
我简要介绍了MapDB如何允许您自定义给定数据库实例的特征,但是同样重要的是创建敏捷数据结构的能力,这些数据结构完全符合您的应用程序需求。
这是一个熟悉的概念,可能会在创建标准Java内存结构时反映出您如何使用代码。 例如,假设您需要通过用户名或personID查找Person对象。 这很简单,您可以简单地创建一个Person对象和两个Maps来满足您的需求:
public class Person {
private Integer personID;
private String username;
...
// Setters and getters go here
...
}
// Create a Map of Person by username.
Map<String,Person> personByUsernameMap = ...
// Create a Map of Person by personID.
Map<Integer,Person> personByPersonIDMap = ...
这是一个非常简单的示例,但是现在您可以轻松地为每个新的Person实例写入两个映射,然后通过任一键检索Person。
您可以使用MapDB做同样的事情,但是更容易。 MapDB支持许多用于Maps或其他集合交互的结构,允许您创建相关结构的架构,该架构可以自动保持同步。 这避免了对结构的大量扫描,使编码快速便捷,并且可以使事情保持非常快。
结语
在本文中,我提供了MapDB及其主要功能的非常简短的摘要。 最重要的是,我讨论了Java开发人员对于MapDB来说是完全自然的(由于熟悉的Java Collections API),以及MapDB如何也是敏捷的,从而为数据库的许多方面(内部结构以及公开的模式结构)提供了强大的控制力。 。 也许最好的一点是,根据Apache 2.0许可,MapDB可以免费供任何使用。 要了解更多信息,请访问: www.mapdb.org翻译自: https://jaxenter.com/introducing-mapdb-the-agile-java-data-engine-107805.html
java mapdb