前文
最近由于一些业务需求需要使用Java调用WiredTiger的API,故开一贴来记录一下WiredTiger的一些设计以及其Java API的应用。由于其Java API是通过SWIG生成的, 所以也相当于是学习C风格的API,真可谓是一举两得。
基本概念介绍
WiredTiger程序通常通过以下类来访问和管理程序
- Connection表示与数据库的连接。大部分应用程序只会为每个进程打开一个与数据库的连接。Connection中的所有方法都是线程安全的。
- Session表示数据库操作执行所在的上下文(Context),在特定的connection上被打开,并且应用程序对于每个线程都必须得开启一个对应的session来访问数据库。
- Cursor表示数据集合上的游标,在session的上下文中被打开(可能有关联事务),并且可以查询或者更新数据。大多数情况下,cursor用于访问表里的记录。除此之外,cursor还可以用于表的子集(如单列或者多列的投影),作为统计信息、配置数据或特定于应用程序的数据源的接口。
在WiredTiger中,操作是通过字符串配置的,这使得API中的方法相对较少,并且API的调用很相似,无论是在C/C++或是Java、Python之中。
默认情况下,WiredTiger 作为传统的key-value数据库,其中key和value都是原始字节数组(raw byte values)。同时,WiredTiger还支持Schema Layer,因此类型可以是任意类型组合的列形成的复合键值。
WiredTiger的基本操作
访问数据库,首先需要打开一个连接,并且为访问数据库的线程创建一个session handle
Connection conn;
Session s;
Cursor c;
try {
conn = wiredtiger.open("WT_HOME", "create");
s = conn.open_session(null);
} catch (WiredTigerException wte) {
System.err.println("WiredTigerException: " + wte);
return;
}
配置字符串中的create
表明当所指示的地址(即WT_HOME
)数据库不存在时,将会创建一个新的WiredTiger数据库。同时,也展示了简单的异常处理机制。
获取数据库的连接后,创建一张数据表table:t
,并且指定键值的数据类型。 其中,S表示字符串,u表示字节数组byte[] 。更加具体的内容会在后面介绍。
s.create("table:t", "key_format=S,value_format=u");
创建好数据表后,可以通过游标(cursor)访问数据。之后,我们希望像表格中插入新的一行,因此通过游标的函数进行设置。
c = s.open_cursor("table:t", null, null);
try {
c.putKeyString("foo");
c.putValueByteArray("bar".getBytes());
c.insert();
} catch (WiredTigerPackingException wtpe) {
System.err.println("WiredTigerPackingException: " + wtpe);
} catch (WiredTigerException wte) {
System.err.println("WiredTigerException: " + wte);
}
之后,我们遍历表格中所有的记录并且打印在输出框中
try {
c.reset();
while (c.next() == 0) {
System.out.println("Got: " + c.getKeyString());
}
} catch (WiredTigerPackingException wtpe) {
System.err.println("WiredTigerPackingException: " + wtpe);
} catch (WiredTigerException wte) {
System.err.println("WiredTigerException: " + wte);
}
值得注意的是,这返回的key和value都是作为C字符串返回的,因为表格就是如此创建的,因此在应用程序中,不需要做数据提取或者转换。同时,由于游标在插入命令后位置发生了改变,因此我们需要使用c.reset()
重置游标。如果没有使用cursor调用上述的insert命令,循环可以简化为:
while((ret = c.next()) == 0){
....
}
最后,需要显示关闭与数据库的链接
try {
conn.close(null);
} catch (WiredTigerException wte) {
System.err.println("WiredTigerException: " + wte);
}
以上便是使用Java操纵WiredTiger API的基本流程。
WiredTiger中的配置字符串
WiredTiger中的方法采用配置字符串(configuration strings)来提供可选参数并配置非标准行为。这些字符串是简单的逗号分隔的<key>=<value>
对列表,并且都具有相同的格式:
[key['='value