
第一章 介绍
fastdb假定整个存在于ram中,并且依据这个假定优化了查询算法和接口。2、fastdb假定整个存在于ram中,并且依据这个假定优化了查询算法和接口。该库的构建是专门为游戏开发人员的性能需求提供支持,它将序列化数据存储在缓存中,这些数据既可以存储在文件中,又可以通过网络原样传输,而不需要任何解析开销。
fastdb支持事务、备份以及系统崩溃后的自动恢复。事务提交协议依据一个影子根页面算法来自动更新。恢复可以执行得非常快,为临界应用提供了高可用性。此外,取消事务日志改进了整个系统的性能,并且使得可以更有效的利用系统资源。
fastdb是一个面向应用的,表通过应用程序的类信息来构造。fastdb支持自动的模式评估,使你可以只需要在一个地方更改-你的应用程序的类。fastdb提供一个灵活方便的接口来从中获取数据。使用一个类SQL的查询语言进行指定的查询。通过一些后关系特性如非原子字段,嵌套数组,用户定义类型和方法,对象间直接引用简化了应用程序的设计并使之更有效率。
尽管fastdb的优化是立足于假定整个配置在计算机的物理内存中,但是也有可能出现使用的的大小超过了系统物理内存的大小的情况,在这种情况下标准的操作系统交换机制就会工作。但是整个fastdb的搜索算法和结构是建立在假定所有的数据都存在于内存中的,因此数据换出的效率不会很高。
第二章 查询语言
ognl是object-graph navigation language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法fastdb,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的,实现对象属性类型的转换等功能。正常的方法就是和一个类的实例对象相关的方法,通过类实例对象进行调用,并将该实例对象隐式地作为第一个参数传入,这个也和其它语言比较像。上述代码与前面不同的是我们同时创建了两个新实例accountingsyncbad,然后启动两个不同的线程对共享变量i进行操作,但很遗憾操作结果是1452317而不是期望结果2000000,因为上述代码犯了严重的错误,虽然我们使用synchronized修饰了increase方法,但却new了两个不同的实例对象,这也就意味着存在着两个不同的实例对象锁,因此t1和t2都会进入各自的对象锁,也就是说t1和t2线程使用的是不同的锁,因此线程安全是无法保证的。
1.不支持多个表之间的连接(join)操作,不支持嵌套子查询。查询总是返回来自一个表的对象的集合。
2.原子表列使用标准的c数据类型。
一般严格引用使用所有情况除了特殊的 #if 指令.假如一个引用使用 #if 或者#elseif 指令没有任何方法或属性,假如它并没有和其他值进行比较,这种引用是准许的.这种方式通常用来判断一个引用是否被定义. 在下面的实例中$foo 并没有定义但是它也不会抛异常.。如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构。使用()包含起来的区域是一个逻辑区间,逻辑区间的主要作用是体现出一些字符出现的逻辑次序,另一个用处就是可以用来引用(可以将此区间内的值引用给一个变量)。
4.结构和数组可以作为记录元素。一个特别的exists算子(quantor)用来定位数组中的元素。
5.可以为表记录(对象)也可以为记录元素定义无参用户自定义方法。
6.应用程序可以定义只有一个串或者数值类型参数的用户自定义函数。
7.支持对象间的引用,包括自动支持逆引用。
8.通过使用引用,start from follow by执行递归的记录遍历。
9.因为查询语言深度继承在了c++类中,语言标识符和关键字是大小写敏感的
10. 不进行整形和浮点型到串的隐含转换,如果需要这样的转换,必须显式进行。
下面类BNF表达式的规则指定了Fastdb查询语言搜索断言的语法:
Grammar conventions
Example
Meaning
expression
non-terminals
terminals
disjoint alternatives
optional part
{1..9}
repeat zero or more times
select-condition ::= ( expression) ( traverse ) ( order )
expression ::= disjunction
disjunction ::= conjunction
| conjunction or disjunction
conjunction ::= comparison
| comparison and conjunction
comparison ::= operand= operand
| operand != operand
| operand<> operand
| operand < operand
| operand <= operand
| operand > operand
| operand >= operand
| operand (not) like operand
| operand (not) like operand escape string
| operand (not) in operand
| operand (not) in expressions-list
| operand (not) between operand and operand
| operand is (not) null
operand ::= addition
additions ::= multiplication
| addition + multiplication
| addition || multiplication
| addition - multiplication
multiplication ::= power
| multiplication * power
| multiplication / power
power ::= term
| term ^ power
term ::= identifier| number | string
| true | false | null
| current | first | last
| ( expression )
| not comparison
| - term
| term [ expression ]
| identifier . term
| function term
| exists identifier : term
function ::= abs| length | lower | upper
| integer | real | string | user-function
string ::= '{ { any-character-except-quote} ('') } '
expressions-list ::= ( expression { , expression } )
order ::= order bysort-list
sort-list ::= field-order{ , field-order }
field-order ::= [length]field (asc | desc)
field ::= identifier{ . identifier }
traverse ::= startfrom field ( follow by fields-list )
fields-list ::= field{ , field }
user-function ::= identifier
支持屏蔽前台提交的敏感字符,可以将所有可能出现的攻击内容或字符加入屏蔽黑名单(比如sql中的“select”),防火墙将对包含黑名单内容进行屏蔽。一个合法的vtl标示符是以一个字符开头,后跟下列字符:the shorthand notation of a variable consists of a leading "$" character followed by a vtlidentifier. a vtl identifier must start with an alphabetic character (a .. z or a .. z). the rest of the characters are limited to the following types of characters:。alias主要分成4种host_alias(主机列表)、cmnd_alias(命令列表)、user_alias(sudo权限用户列表)、runas_alias(用户以什么身份执行[如root、oracle]的列表). 别名命名是包含大写字母、下划线以及数字,但必须以一个大写字母开头。
between
current
escape
exists
follow
integer
length
string
可以使用ANSI标准注释,所有位于双连字符后直到行末的字符都将被忽略掉。
fastdb扩展了ansi标准sql操作符,支持位运算。and/of操作符不仅可以运用到布尔操作数也可以操作整形操作书。and/or运用到整形操作数返回的结果是一个整形值,这个值是对操作数进行按位and或者按位or得到的结果。对于小的集合位运算是高效的。fastdb也支持对整形和浮点型的升幂运算(x^y)
第一章 c++ 接口
fastdb接受结构体作为记录的元组。结构的字段可以通过标准的点表达式访问:company.address.city
结构体的字段可以索引,从而可以按照指定的序列使用。结构体可以包含其他的结构体作为其元组,嵌套深度没有限制。
程序员可以为结构体定义方法,这些方法可以用在查询中,与对普通结构元组的句法是一样的。这些方法除了一个指向其隶属的对象的指针外(C++中的this指针)不能有参数,并且返回原子类型(bool型,数值、字符串或者引用类型)。这些方法也不应该改变对象实例(immutable method).如果方法返回字符串,该字串必须用new字符操作符分配,因为该字串值拷贝之后就会被删掉。
首先先来看下dhcp协议,在dhcp协议中,定义了一个option字段,该字段主要是用来扩展dhcp协议的,option 60 (vendor classidentifier)是dhcp报文中的一个选项字段,code为60,可以标识终端类型,根据不同的终端类型来选择接口下的网关。首先先来看下dhcp协议,在dhcp协议中,定义了一个option字段,该字段主要是用来扩展dhcp协议的,option 60 (vendor class identifier)是dhcp报文中的一个选项字段,code为60,可以标识终端类型,根据不同的终端类型来选择接口下的网关。访问权限依次递减,这样我们在定义类的时候,哪些字段和方法不想暴露出去,哪些字段和方法可以暴露,可以通过修饰符来完成,这就是封装,下面来看一个例子吧:。
第1节. Structures
fastdb接受动态数组作为记录元组,不支持多维数组,但可以定义数组的数组,可以按照结果集中数组字段的长度对记录排序。fastdb提供了一个特别的构造集来处理数组:
1.可以用length()函数来取得数组中元素的数目。
2.数组元素可以用[]操作符来获取。如果索引表达式超出了数组范围,将产生异常
3.in操作符可以用来检查一个数组是否包含有一个由左操作书指定的值。该操作只能用于原子类型的数组:boolean , 数值,引用和字符串。
4.数组可以用update方法更新,该方法复制数组然后返回一个非常量的引用。
5.使用exists运算符迭代数组元素。exists关键字后指定的变量可以作为在exists算子后面的表达式中的数组的索引。该索引变量将迭代所有可能的数组索引值,直到表达式的值为true或者索引越界,下面的情况:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-106153-1.html
等到能和美帝在西太平洋别别苗头的时候
巴菲特不是人吗