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本地数据,不需要考虑多实例并发重复请求并发问题。
欢迎大家对上面提出不足和建议,谢谢。
原文:http://www.cnblogs.com/tinhou/p/6974112.html