码迷,mamicode.com
首页 > 数据库 > 详细

h2数据库用于实例的重试模块

时间:2017-06-09 23:37:36      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:数据库服务   一个数据库   h2数据库   同时存在   strong   成功   存储   优点   重复   

H2说明(参考http://www.importnew.com/17924.html)

H2有3种运行方式

    (1)嵌入式,数据库为单个文件。

         启动实例的的时候,自动开启数据库,数据存储到单个文件中(连接加上;AUTO_SERVER=TRUE允许多个连接同时存在)。

        conntionUrl = jdbc:h2:./TradeLocalDB;AUTO_SERVER=TRUE

    (2)内存运行,数据只运行在内存中

         1.嵌入式内存模式,实例关闭,数据就丢失了,与map类似。

           conntionUrl = jdbc:h2:mem:TradeLocalDB

        2. 服务器内存模式,存储为内存。服务关闭的时候,数据才会丢失,与实例无关。需要对数据库服务端进行维护

          conntionUrl = jdbc:h2:tcp://localhost/mem:TradeLocalDB;DB_CLOSE_DELAY=-1

    (3)服务器模式,数据保存在文件中,与普通数据库类型,服务器关闭,数据不会丢失,不可连接。需要对数据库服务端进行维护

            conntionUrl = jdbc:h2:tcp://localhost/./TradeLocalDB(服务器目录下)

2.重试模块选择H2的运行模式:

    (1)服务器模式:

        需要额外的开服务器。并且如果不是每个实例对应一个数据库的话,需要处理多实例重复处理的问题(

    获取的时候带锁,然后更新个中间状态,避免被多个实例同时处理),这种与普通数据库无区别,额外带来h2数据库服务端的维护

    (2)内存模式:

        1.如果是服务端内存模式,也需要同 (1)一样的处理

        2.如果是嵌入式内存模式。实例关闭,数据就消失了,与map类似。重试数据容易丢失。

    (3)嵌入式模式

        数据库的开启关闭由程序实例控制,不需要额外维护。

        实例开闭,数据不会丢失。再次开启的时候,读取即可(PS:实例搬家的时候,需要连带数据文件一起)。

3.重试模块方案

  (1)为啥不用redis/MQ

    重试需要间隔,redis,MQ没法根据时间去选择已经需要发起重试的请求。如果按顺序插入获取,

    可能导致取出的请求还未到期,被重新插入最末端。

     (2)使用H2的两种模式  

    1.需要重试的数据都存储到h2

    2.定时去h2获取已经过期的数据(可以处理的),如获取前1000条,如果本次获取数据量较大,按id取模分到N个线程处理。

            处理成功后,删除H2数据库的数据。

        缺点:1.依赖h2的稳定与可靠,如果H2出问题,因为是嵌入式,将导致该实例重试模块异常。

                2.H2没有相关的监控,需要的话,需要自己去开发。

        优点:1.基本没有并发问题,控制简单。

                2.可以通过SQL直接获取过期的重试。

       3.没个实例都有自己的H2本地数据,不需要考虑多实例并发重复请求并发问题。


欢迎大家对上面提出不足和建议,谢谢。

h2数据库用于实例的重试模块

标签:数据库服务   一个数据库   h2数据库   同时存在   strong   成功   存储   优点   重复   

原文地址:http://www.cnblogs.com/tinhou/p/6974112.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!