日期:2014-05-16  浏览次数:20516 次

Java 小型数据库漫谈

Java 小型数据库漫谈

?

Derby

记得大学在Sun公司的技术宣讲会上获取一张Netbeans5.5的安装光盘,就尝鲜安装了这款IDE,刚接触java的我在试用IDE的时候对这款IDE自带的Derby数据库很是惊叹,以前做C++开发用的和谐版SQLServer2000、Access2003都是自带管理界面,使用方面但是占用空间很大的数据库。Derby全靠命令行启动,没有单独的管理界面,需要通过命令行来进行数据库管理,Netbeans只是提供了简单查询和sql运行环境,但是在开发过程中更容易测试了,不需要单独启用数据库、单独开启数据库工具来获取数据了。

?

?

HSQL


后来遇到很多开源项目,在学习、使用过程,发现这些项目在Demo中几乎都是使用了HSQL数据库。我也就顺手使用了HSQL,使用感觉很像Derby,但是HSQL自带了一个基于awt的查询界面,当时在与的IDE整合上不如Derby,H2database的管理界面最给力,基于web的能够自动代码提示,用户最少有3种方法启动访问这个web管理页面。Derby是Oracle(Sun)公司自家的孩子,现在的JDK推荐安装Derby……和Derby一样,HSQL也支持内存模式、嵌入模式、网络模式能够在不同的开发测试场景使用,HSQL很流行。

?

?

H2Database


H2database目前是由Thomas Mueller维护的,Thomas Mueller和h2的使用者(贡献)支撑了H2的生态圈。这是H2database Google中文对H2database的描述:

“数据库引擎的历史:H2的开发始于2004年5月,第一版的发布是在2005年12月14日。H2的主要作者 Thomas Mueller,也是 Hypersonic SQL数据库的原始开发者。在 2001年,他加入了 PointBase 公司,在那里他编写 PointBase Micro,一个商用的JAVA SQL数据库。在这个时候,他必须放弃 Hypersonic SQL.,在Hypersonic SQL 代码的基础上成立了 HSQLDB 开发组。H2的名字是基于 Hypersonic 2,但是 H2 并没有共享 Hypersonic SQL 和 HSQLDB的代码,H2是完全重新开发出来的.”

我不知不觉中使用上了H2database,兼容HSQL语法。在正式项目中使用H2database的内存模式当做缓存,保存一些很少修改的系统数据和业务数据。H2database的使用文档中,有一些性能对比:embedded模式和tcp模式,性能几乎完胜HSQL和Derby。H2database内置了很多函数,并且用户能够使用Java代码方便的扩充H2database的函数。但是H2database不支持存储过程,只能使用自定义函数来替换存储过程--在小型应用中,使用存储过程有写沉重吧。

在SpringSide中使用H2database代替HSQL作为测试数据库。我在一个管理项目中曾使用H2database来缓存系统中机构(树状菜单)和管理人员(不同人员权限不同,机构展示也不同)的展示信息,但是在最后上线测试时,根据客户不差钱的原则,将这个缓存功能拿掉了,将数据库服务器扩展为2个小型机集群。去掉缓存的做法简化了代码的开发和web服务器内存的压力,不用在更新的时候维护2个数据字典。

在做SEM系统的时候,一直头疼没有好的CSV解析工具,H2database提供的csv读取、写入方法能够无缝的将CSV文件内如读入到H2database数据库中。H2database就像一个瑞士军刀-还支持tcp模式下的集群。在高并发的情况下,获取connection就会出现数据异常,而且H2database的数据库文件一般是3个:数据文件、lock文件、trace文件,但是数据库文件大小膨胀的夸张,100M的CSV文件读入到数据库中,数据库文件已经达到了300M多,如果操作系统支持,H2database能够支持4T的数据库文件。

?

Berkeley DB


BDB是一款很酷的key-value数据库,java版BDB基于GPL协议,数据存储是通过了B+树算法实现的。

有3种方式访存储、访问数据(java版BDB的使用手册:BerkeleyDB-JE-GSG.pdf中有详细介绍):

通过游标cursor来遍历数据,进行更改

通过Database Record方式,在通过这这种方式存储数据的时候,可以自定义数据对象的序列化方式,或者使用系统默认的。

DPL方式(需要JDK5支持),类似于JPA。

?

实际应用

曾经编写一个模拟程序用来保存各种不同交易的资金流水记录。每种交易都会有特定格式的数据字段,如果使用传统的RDMS,就需要为每个交易创建一个表来记录流水-在一个测试系统中如果以后又新的交易添加,就会导致测试系统升级维护的压力。使用BDB-je-3.3.5来保存交易日志,由代码来区分不同的交易类型,避免了测试系统数据库表的维护。BDB-je的使用流程类似于传统的RDMS-和当今的NoSQL使用流程一样,需要创建数据库引用,完成之后需要关闭引用,通过spring的aop能够方便将这套流程分离。

注意,C版本的BDB支持嵌套事务,java 3.3.5版本不支持。

java版自带的使用说明非常全面,完全可以秒杀网上所有的教程,但这套教材是英文,估计会被有些人无视,下面的地址是部分的翻译文档。

http://blog.csdn.net/muyannian/archive/2007/08/03/1723971.aspx

?

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liu251/archive/2011/01/14/6138280.aspx