`
cywhoyi
  • 浏览: 421002 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MapDB的spring整合使用

    博客分类:
  • JAVA
 
阅读更多

MapDB是一个快速、易用的嵌入式Java数据库引擎,它提供了基于磁盘或者堆外(off-heap允许Java直接操作内存空间, 类似于C的malloc和free)存储的并发的Maps、Sets、Queues。

业务场景:

朋友公司需要根据坐标,在200m的地址库中寻找离该坐标最近的经纬度坐标,难点主要有以下两个:

1.快速把坐标落点到二维的平面上区域,假设(-1,-1),应该落点到xy二维的左下方,这里我采用KDTree的方式

2.因为考虑到tree构建成功后,不想每次都重新构建树,那就需要把树缓存起来,但是通过redis等分布式的cache觉得网络带宽是瓶颈,而且我们的地址库可能会频繁更新,如果用jvm等map的缓存,内存马上就被爆仓了,后来转用MapDB发现它提供多种缓存方式,而且对比后,不管速率以及占用空间都相对较小

3.计算点点之间的距离,在二维平面上其实并不难,通过向量,计算sin、cos等常用手段,马上计算所得结果

 

Spring中但配置

 

<bean id="dbFile" class="java.io.File">
        <constructor-arg value="/usr/local/DB/monitor.DB"></constructor-arg>
    </bean>

    <bean id="dbFactory" class="org.mapdb.DBMaker"
          factory-method="newFileDB">
        <constructor-arg ref="dbFile" />
    </bean>

    
    <bean id="shutdownHook"
          factory-bean="dbFactory"
          factory-method="closeOnJvmShutdown">
    </bean>

    <bean id="database"
          factory-bean="dbFactory"
          factory-method="make">
    </bean>

Spring应用启动时加载

 

public class StartupListener implements ServletContextListener {

    private static final Logger LOG = LoggerFactory.getLogger(StartupListener.class);

    @Override
    public void contextInitialized(ServletContextEvent e) {
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(e.getServletContext());

//        AddressInfoMapper addressInfoMapper  = (AddressInfoMapper)ctx.getBean("addressInfoMapper");

        DB db = (DB) ctx.getBean("database");
        BTreeMap<String, String> monitorDataMap = db.getTreeMap("monitorDataMap");

        // monitorDataMap.put("name", "Young");
       //you can load address information to mapdb

        db.commit();


        if (ctx == null) {
            LOG.error("app start fail!", e);
            throw new RuntimeException("WebApplicationContextUtils.getWebApplicationContext() Fail!");
        }

        LOG.info("app start success.");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }

}

  Service中使用

 

 // Injected database the map are obtained from it.
    private DB database;
    private BTreeMap<String, String> monitorDataMap;

    public void setDatabase(DB database) {
        this.database = database;
    }

    @PostConstruct
    public void init() throws Exception {
        this.monitorDataMap = database.getTreeMap("monitorDataMap");
    }

 

 

KDTree构建

 

public class KDTree {

    // prevent instantiation
    private KDTree() {}

    private KDTreeNode root;

    public static KDTree build(List<? extends Point> points) {
        KDTree tree = new KDTree();
        tree.root = build(points, 0);
        return tree;
    }

    private static KDTreeNode build(List<? extends Point> points, int depth) {
        if (points.isEmpty()) return null;

        final int axis = depth % 2;

        Collections.sort(points, new Comparator<Point>() {
            public int compare(Point p1, Point p2) {
                double coord1 = p1.getCoords()[axis];
                double coord2 = p2.getCoords()[axis];

                return Double.compare(coord1, coord2);
            }
        });

        int index = points.size() / 2;

        KDTreeNode leftChild = build(points.subList(0, index), depth + 1);
        KDTreeNode rightChild = build(points.subList(index + 1, points.size()), depth + 1);

        Point point = points.get(index);
        return new KDTreeNode(point, axis, leftChild, rightChild);
    }

    @SuppressWarnings({"unchecked"})
    public <T extends Point> T findNearest(Point point) {
        return (T) findNearest(point, 1).get(0);
    }

    public  List<? extends Point> findNearest(Point point, int amount) {
        return root.findNearest(point, amount);
    }

    @SuppressWarnings({"unchecked"})
    public <T extends Point> T getRootPoint() {
        return (T) root.getPoint();
    }
}

 

 

个人结论:

在使用mapdb的使用后,本人并未去深入了解mapdb的底层原理,只是应急使用,后续肯定会有很多bug显现,但是在使用其框架后,确实性能不少,3-5ms内就能够很容易的找到点之间最近关联的,内存损耗40多m左右。

1
1
分享到:
评论

相关推荐

    mapdb-3.0.0-M4.jar

    mapdb

    mapdb-3.0.5-API文档-中英对照版.zip

    赠送jar包:mapdb-3.0.5.jar; 赠送原API文档:mapdb-3.0.5-javadoc.jar; 赠送源代码:mapdb-3.0.5-sources.jar; 赠送Maven依赖信息文件:mapdb-3.0.5.pom; 包含翻译后的API文档:mapdb-3.0.5-javadoc-API文档-...

    MapDB源代码

    3. **多模式**:MapDB 可以作为纯内存数据库使用,也可以作为混合模式,即数据在内存中缓存并定期写入磁盘。 4. **多种数据结构**:除了基本的Key-Value存储外,MapDB还提供了Set、List、Queue、SortedSet、...

    mapdb,mapdb提供由磁盘存储或堆外内存支持的并发映射、集合和队列。它是一种快速、易于使用的嵌入式Java数据库引擎。.zip

    MapDB 是一个强大的开源项目,它为Java开发者提供了一种高效、灵活的解决方案,用于在磁盘或堆外内存中存储并发映射、集合和队列...对于Java开发者来说,掌握MapDB的使用和原理,能够极大地提升处理大数据问题的能力。

    MapDB操作手册.docx

    MapDB是一个开源的Java数据库引擎,设计用于提供高性能、可扩展的数据存储解决方案。它是一个集合框架,支持多种数据...对于初学者来说,这份MapDB操作手册将是一个宝贵的资源,帮助他们快速上手并掌握MapDB的使用。

    mapdb-1.0.8.jar

    mapdb-1.0.8.jar 免费下载 mapdb

    MapDB操作手册 PDF 下载

    5. **Cache**: MapDB还提供了一种缓存机制,可以设置缓存策略,如LRU(最近最少使用)、LFU(最不经常使用)等,用于高效的数据缓存。 在“MapDB操作手册”中,可能会涵盖以下内容: 1. **安装与配置**: 如何在...

    持久化存储的 Map MapDB.zip

    MapDB 是一个强大的Java库,它提供了一种高效且易于使用的持久化存储解决方案。这个库设计为嵌入式数据库引擎,意味着它可以直接在应用程序中使用,而无需独立服务器支持。MapDB的核心特性是其对键值对数据结构的...

    Android代码-mapdb

    MapDB: database engine MapDB combines embedded database engine and Java collections. It is free under Apache 2 license. MapDB is flexible and can be used in many roles: Drop-in replacement for ...

    mapdb-2.0-beta13.zip

    MapDB是一个开源的Java数据库和缓存库,它提供了丰富的数据结构,如持久化映射、集合和队列,以及高性能、线程安全的操作。在标题中提到的"mapdb-...两者结合使用,可以在AEM项目中实现高效、灵活且可扩展的解决方案。

    MapDB 官方文档

    MapDB is an open-source (Apache 2.0 licensed), embedded Java database engine and collection framework. It provides Maps, Sets, Lists, Queues, Bitmaps with range queries, expiration, compression, off-...

    mapdb:MapDB提供由磁盘存储或堆外内存支持的并发Maps,Sets和Queues。 它是一种易于使用的嵌入式Java数据库引擎

    MapDB是灵活的,可以在许多角色中使用: 可以直接替换地图,列表,队列和其他集合。 不受垃圾收集器影响的堆外收集 具有到期和磁盘溢出的多级缓存。 用事务,MVCC,增量备份等替换RDBM ... 本地数据处理和过滤...

    mapdb-3.0.5-API文档-中文版.zip

    赠送jar包:mapdb-3.0.5.jar; 赠送原API文档:mapdb-3.0.5-javadoc.jar; 赠送源代码:mapdb-3.0.5-sources.jar; 赠送Maven依赖信息文件:mapdb-3.0.5.pom; 包含翻译后的API文档:mapdb-3.0.5-javadoc-API文档-...

    mapgraphdb:MapDB + Tinkerpop 蓝图

    Tinkerpop 蓝图图形... MapDB 使用预写日志或仅追加存储来实现出色的写入持久性。 灵活 - MapDB 可用于从内存缓存到多 TB 数据库的任何地方。 它还具有许多选项,可以用持久性来换取写入性能。 这使得配置 MapDB 以

    mapdb.sql

    mapdb.sql

    mapdb:真正的地图编辑者仅能触摸由Kaldonis主持的mapdb

    mapdb 由Kaldonis主持的mapdb主要受到善意的地图编辑人员的感动。 2021年4月3日-各种作品 更新了Cysaegir图形,新的Stables房间,超节点标签,固定的RP条目。 更新了Halcyon Hills图形,添加了新房间 所有丢失的信...

    mapdb-unsafe:提供使用 sun.misc.Unsafe 提高 10% 的内存存储

    MapDB 是一个开源的、基于 Java 的键值存储系统,它提供了一种高效的方式来存储和检索数据。...如果你正在使用 MapDB,建议直接使用提供的 API,而不是直接操作 `Unsafe`,以确保代码的稳定性和兼容性。

    simplexdb:MapDBBerkeleyDB嵌入式数据库,Spring REST接口和带有Thymeleaf模板的基本前端

    MapDB / BerkeleyDB数据库和Spring REST接口 该项目的目标是创建一个可移动的存储设备,用于移动多个文件,从而为使用REST接口的最轻量的数据库提供支持。 掌握 开发 支持的数据库 地图数据库 伯克利数据库 用法 ...

    RedisMapDB:该项目旨在成为由 mapdb 支持的 redis 的替代品

    该项目旨在成为由 mapdb 支持的 redis 的替代品 服务器/解析是从这个项目分叉出来的: : 后端数据库: : 编译 ./gradlew fatJar 跑步 java -jar build/libs/redis-mapdb-all-1.0.jar -threads 5 选项 Usage: ...

    elsa-3.0.0-M5-API文档-中文版.zip

    赠送jar包:elsa-3.0.0-M5.jar; 赠送原API文档:elsa-3.0.0-M5-javadoc.jar; 赠送源代码:elsa-3.0.0-M5-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

Global site tag (gtag.js) - Google Analytics