hilo主键生成策略的就是为了提高序列生成的效率问题,它改善了每次生成一个顺列都必须查询一遍数据库的模式,取而代之的是向数据库申请一段范围的序列号,生成这范围内的顺列无需访问数据库。hilo需要数据库的辅助表或sequence记录范围号,并控制多个顺列实列申请的范围不能重复,保证集群的唯一性。
OpenDDAL维护如下的表结构用于存放sequence序列状态
sequence_name | next_val |
---|---|
test_sequence | 2 |
hilo 辅助表中的next_val数值是范围的序号。其含义就是一段连续可分配的整数,如:1-10,50-100 等。桶的容量即是 cacheSize 的值,假定 cacheSize 的值为 100,那么范围的序号和每个范围容纳的整数可参看下表:
序号 | 1 | 2 | 3 | 4 | 5 | ... |
---|---|---|---|---|---|---|
范围 | 1-100 | 101-200 | 201-300 | 301-400 | 401-500 | ... |
Statement queryTimeout用来限制statement的执行时长,单位为秒,timeout的值通过调用JDBC的java.sql.Statement.setQueryTimeout(int timeout) API进行设置。OpenDDAL完成一次statement执行可能会访问多个结节的数据,会创建多个数据处理的handler,HandlerHolderProxy的职责就是记录这些handler,方便session对运行的statement执行资源控制。
- 调用JdbcStatement.setQueryTimeout时,oppenddal设置session的queryTimeout
- 调用Statement的executeQuery()方法,oppenddal记录Statement执行的开始时间为now,结速时间为now + queryTimeout
- session处理数据将queryTimeout代理给物理的jdbc Statement,并检查是否处理时间超过Statement执行结速时间
- 达到超时时间
- session终止数据处理,调用所有处理数据所打开的底层Statement的cancel()方法取消执行
- session抛出query timeout异常
- 调用close方法,session关闭所有处理数据所打开的底层Statement