derby数据库源码分析之页面分析

本文中主要介绍页面中的控制行和校验和的计算规则。

当数据库创建了表的第一个页面之后,会直接在页面中插入一行数据,这行数据的记录id是6,是页面里面的第一个记录,这个记录在derby数据库里面叫做控制行(Control Row)。控制行里面只有一列数据。列值为ContainKey对象。通过该ContainKey对象可以唯一确定一个表。在derby数据库里面表和索引都被认为是容器或者Conglomerate。所以第一个页面中的第一行记录是对表的描述。

下面介绍的是数据库表的控制行结构,索引的控制行还有差别,但是会在下面的内容介绍一些和索引相关的内容。

第一行记录的内容如下:

名字长度类型描述format id2short表示该容器是哪一个类的对象段4int容器id8long列个数4int表示本表或者索引中有多少列每一个列的format id2short存储每一列对应的format id使用非UCS_BASIC排序规则的列个数压缩int,长度可以是1,2,4使用非UCS_BASIC排序规则的列号压缩int,长度可以是1,2,4存储哪一列使用非UCS_BASIC排序规则,列从0开始计数使用的非UCS_BASIC排序规则压缩int,长度可以是1,2,4

在derby数据库中,表对应的类是Heap,索引对应的类是B2I。这里的Heap与数据结构中的堆没有关系;B2I是B树数据结构的实现。Heap和B2I的format id是不同的,所以可以通过format id找到对应的实现类。

在derby数据库中表和索引都属于某一个段,但是目前只有一个段,段id是0,数据库中所有的表和索引都属于该段。

段里面包括的就是表和索引对象了。表和索引都有一个id来唯一标识。在类RAMAccessManager中字段conglom_nextid,当每增加一个表或者索引时,该字段就会加一。下面代码就是id的生成规则:

id= (conglomid << 4) | factory_type
1

conglomid是long类型的,从上面的代码可以看出,conglomid的高四位是没有使用的。对于数据库表来说,可以使用conglomid的低60位来唯一标识一个数据库表。所以derby支持的表数量最多为1152921504606846975,索引最多也是1152921504606846975个。id的低4位是factory_type,factory_type目前只有两个值:HEAP_FACTORY_ID(=0)和BTREE_FACTORY_ID(=1),如果当前是表对象,那么factory_type就为0,如果当前是索引对象,那么factory_type就为1,可以通过id的低四位来识别是表对象还是索引对象。conglomid从1开始计数,所以数据库里面第一个表的id为16,索引为17。

UCS_BASIC与排序和比较规则有关。可以在数据库的连接URL中设置collation=collation attribute。collation目前在derby数据库中有6个值:UCS_BASIC,TERRITORY_BASED,TERRITORY_BASED:PRIMARY,TERRITORY_BASED:SECONDARY,TERRITORY_BASED:TERTIARY,TERRITORY_BASED:IDENTICAL。对于后面5个属性可以参考网页http://renxm.com/java/2014/08/24/collator-of-java.html。如果不指定collation属性值的话,数据库默认使用UCS_BASIC作为其排序和比较规则。至于UCS_BASIC属性值的含义,以后再介绍。

页面校验和使用CRC32算法生成。其将页面中除了最后8个字节外的内容作为该算法的输入来生成页面校验和。

derby数据库源码分析之页面分析

相关推荐