- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ICE系列培训三
4.2 Freeze 连接 示例:连接及map对象的创建 … // 首先,创建连接 Freeze::ConnectionPtr pConnection = Freeze::createConnection(pCommunicator, strDbEnvName); // 这里需要传入一个通信器,和文件数据库的名字(名字可包含存放路径) // 再创建map对象 MyMapPtr pMap = MyMapPtr(new MyMap(pConnection, strDBFileName)); // 这里实例化一个map对象,map类型为用户在Slice中定义的map类型; // 需要指定映射后的文件名: strDBFileName; … 创建好map对象后,就可以像使用STL map类似使用这个map了(注意多线程访问问题) 4. Freeze Map使用 4.3 事务 Freeze Map支持事务。 你可以将一组数据库更新操作放入一个事务内,以保证这一批更新操作是原子的。 如果不使用事务,那么每个非迭代更新都有自己内部事务。每个读写迭代器也有自己关联的内部事务,当迭代器关闭时事务会被提交。 示例: { … { TransactionHolder tx2(connection); // Does nothing? // update database … mit(); } // 如果前面因为错误导致tx2没有提交,则tx2析构时会自动调用rollback } 4. Freeze Map使用 4.4 迭代器 迭代器允许你遍历FreezeMap的内容。 迭代器是用BerkeleyDB的游标实现的,并且打开迭代器时会锁住数据库文件。 C++提供“只读”和“读写”迭代器;java里,如果迭代器是在事务上下文内获取的就是读写迭代器,否则是只读迭代器。 迭代器关闭时,如果没有使用事物,锁会自动释放。如果使用了事物,锁会随事物的关闭而关闭。 注意:下面的情况你需要显示关闭迭代器: 你没有使用事物; 已有一个打开的迭代器用于更新映射表; 在同一个线程,你读取映射表; 4. Freeze Map使用 4.5 从死锁异常中恢复 多线程访问FreezeMap时,可能发生死锁异常; 应用程序应该捕获Freeze::DeadlockException异常,然后重试事务或迭代操作 while (true) { try{ // update … break; } catch (const DeadlockException ){ continue; } } 4. Freeze Map使用 4.6 键值排序 Freeze Map的键值总是排序的。默认Freeze根据键值的Ice二进制编码排序。 在C++中,自定义的比较器是在代码生成阶段指定的。Java中是在运行时提供的。 例如:C++中执行slice2freeze时在—dict参数中加入sort选项 - -dict NAME,KEY,VALUE,sort,COMPARE 这里COMPARE是一个用于比较的函数类。 缺省COMPARE为std::lessKEY 4. Freeze Map使用 4.7 索引Map 在生成Map时如果定义了索引,则Freeze Map支持高效的反向查找。 注意: 增加索引会增加BDB的写操作负担,因为更新会同时去查找索引,如果索引也需要更新,则更新索引。 执行slice2freeze时加入- -dict-index MAP[,MEMBER]参数, 其中MAP为索引名,MEMBER为freezemap的value值的成员(如果value是结构或类类型) 加了索引的话,生成的freezemap会多出一些成员: findByMEMBER() beginForMEMBER() endForMEMBER() … 4. Freeze Map使用 4.8 在C++中使用Freeze Map 步骤: (1)使用slice2freeze创建Freezemap C++类; slice2freeze –dict StringIntMap,string,int StringIntMap 这里创建一个名为StringIntMap,键值为string,value为int的FreezeMap,生成的文件名为StringIntMap(最后一个参数)。 (2)创建数据库连接 Freeze::ConnectionPtr conn = Freeze::createConnect
文档评论(0)