`
sjk2013
  • 浏览: 2186898 次
文章分类
社区版块
存档分类
最新评论

内存数据库研究实录

 
阅读更多

1 Berkely DB:开源嵌入式数据库(和应用相同的地址空间,可以显示设置为只内存数据库),支持复制(1master > read only replica),支持hashbtreerecord numberqueue 4种存储方式,透明支持事务隔离,恢复,多用户锁(如果不需要,还可以禁止锁和日志机制),其完全基于key – value对来管理记录(key value可以是定长或变长字符串,key value也可以直接是任何数据结构,不必转换成DB指定的格式),Berkely DB不是关系数据库!(不通过sql,而是api来访问,不支持索引也不自动维护它们!),不是OO数据库,不是网络数据库,甚至不是数据库服务器(最近开始支持rpc 访问)!

MySQL使用Berkely DB做事务表实现。

主要目的:“fast, reliable, transaction-protected record storage

cc++,等接口

2 Fast DB:开源嵌入式数据库(本地硬盘和内存存储),个人的,支持索引,支持cli和网络访问,但主要也是api访问(使用一种类SQL语句),支持hashbtree索引

delphic++等接口

3 Oracle Times ten:通过api访问,支持复制,自动ODBC同步等各种功能,但要付费,主要是c++接口(TTClass),另外也可以使用ODBCJDBC

最关键的是:Cache Group可以cache远程oracle数据库的部分表,times ten可以透明地和应用一起工作(主要的odbc api接口都可以透明工作)。但使用“Cache Connect to Oracle Cache Administrator”连接到oracle 9i时,9i好像不支持这个特性:(

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 459.75pt; HEIGHT: 240pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/surat/LOCALS~1/Temp/msoclip1/03/clip_image001.png"></imagedata></shape>

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/stephenxu111/timesten1.jpg"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 459.75pt; HEIGHT: 240pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/surat/LOCALS~1/Temp/msoclip1/03/clip_image001.png"></imagedata></shape>

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 459.75pt; HEIGHT: 240pt" o:ole="" type="#_x0000_t75"><imagedata o:title="" src="file:///C:/DOCUME~1/surat/LOCALS~1/Temp/msoclip1/03/clip_image001.png"></imagedata></shape>

本地times ten和远端oracle之间有4cache group

² 只读(refresh是自动的)

² 同步(flush自动, refresh手动)

² 异步(在两边异步commit,所以效率较高,但可靠性稍低,而且支持在主oracle停机的时候本地提交)

² 用户管理

数据从times ten写到oracleflushpropagate,反过来叫loadrefreshautorefresh

另外也可以在times ten创建表和索引视图等,它一般以ODBC的形式提供接口,但直接生成index不允许用hash,只能在生成表的时候使用hash或主键的方式指定,如:

CREATE TABLE Customer

(custID INT NOT NULL PRIMARY KEY,

)

UNIQUE HASH ON custID PAGES = 30; /*hash的桶数是30*/

Times ten允许设置为无盘模式运行

RAM policyIn Use第一个连接到来时载入,InUse with RamGracealwaysmanual

永久数据区(表,索引)和临时数据区(锁,游标等)一旦载入就不能改变

总之,应用通过ODBCTTClass连到times ten(瘦ODBC客户端,通过本地或远程,tcp/ip或共享内存的方式连到times ten服务器),times ten可以通过ODBC连到Oracle 10g,在windows平台,可以通过ODBC连到第三方ODBC管理器 (使用TTClass取代OLE DB/ADO之类的第三方中间件),times ten服务器是自动启动的独立过程(数据管理系统服务,开放一个1rr02的端口用于连接),应用程序->client dsn->server dsn

² 直接连接(最快,内存级,使用共享库连接,windows上是tten60.lib

² 驱动管理器连接(windows上用系统的odbc32.lib库,这时其实可以连第三方ODBC

² 非直接连接(c/s模式,主要用于应用驻留在与times ten data store不同的主机上,最慢,windows上用ttcl60.lib

同时,生成TTClass(带源码,可以自己编译这个库)时也可以指定生成上面3种中的哪一种TTClass

TTClassODBCc++封装,用于高性能的应用

支持连接池技术(TTConnectionPool,用于多线程应用),应用日志功能(TTGlobal),预准备带参SQL语句(TTCmd,还负责其他具体的sql语句执行包括带和不带结果集的),ODBC连接器(TTConnection),错误报告(TTStatus),TTCatolog用来管理表列和索引(只能读配置数据)

可用XLA实现表改变的通知功能(比如有客户端插入了数据到下载配置表)

TptbmAS证明了Timesten部署在应用服务器里面的可能性。

4 apache derby

Java实现的嵌入式数据库(就象eclipse,是由IBM捐献给开源社区),可以用来伴随J2EE使用

5 ExtremeDB

商业实时嵌入数据库,可以全内存操作,可以远程同步oracle,不提供源码

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics