常用的开源数据库:H2,Derby,HSQLDB,MySQL,PostgreSQL。其中H2,HSQLDB类似,十分适合作为嵌入式数据库使用,其它的数据库大部分都需要安装独立的客户端和服务器端。
H2的优势:
1、h2采用纯Java编写,因此不受平台的限制。
2、h2只有一个jar文件,十分适合作为嵌入式数据库试用。
3、性能和功能的优势
H2比HSQLDB的最大的优势就是h2提供了一个十分方便的web控制台用于操作和管理数据库内容,这点比起HSQLDB的swing和awt控制台实在好用多了。
DB最初开发的目的是以新的HASH访问算法来代替旧的hsearch函数和大量的dbm实现(如AT&T的dbm,Berkeley的ndbm,GNU项目的gdbm),DB的第一个发行版在1991年出现,当时还包含了B+树数据访问算法。在1992年,BSD UNIX第4.4发行版中包含了DB1.85版。基本上认为这是DB的第一个正式版。在1996年中期,Sleepycat软件公司成立,提供对DB的商业支持。在这以后,DB得到了广泛的应用,当前最新版本是4.3.27。
DB支持几乎所有的现代操作系统,如LINUX、UNIX、WINDOWS等,也提供了丰富的应用程序接口,支持C、C++、JAVA、PERL、TCL、PYTHON、PHP等。DB的应用十分广泛,在很多知名的软件中都能看到其身影。例如参考资料2中作者谈到利用DB在LINUX下实现内核级文件系统;参考资料3中通过实际测试数据说明DB提高了OPENLDAP的效率。LINUX下的软件包管理器RPM也使用DB管理软件包相关数据,可以使用命令file查看RPM数据目录/var/lib/rpm下的文件,则有形式如下的输出:
Dirnames: Berkeley DB (Btree, version 9, native byte-order)
Filemd5s: Berkeley DB (Hash, version 8, native byte-order)
值得注意的是DB是嵌入式数据库系统,而不是常见的关系/对象型数据库,对SQL语言不支持,也不提供数据库常见的高级功能,如存储过程,触发器等。
dbm,sdbm,ndbm,gdbm,jdbm,bdb
w3c-dbm和sdbm都是非常简单的kv store的两个实现,不支持事务,也不保证数据的可靠。但是通过分析这两个project,对hash如何结合disk来使用有一定的认识,这和in-memory的hash还是有一定的区别的。下一篇文章会分析jdbm的实现,它通过WAL(write-ahead-log)实现事务。并且对kv的组织和w3c-dbm,sdbm也不一样。
Berkeley DB并不是一个关系型的数据库。不能应用标准的SQL语句对数据库操作,对它的操作要调用专用的API实现。这些API提供了查询、插入、删除等功能。
Berkeley DB提供了四种存储数据的模式:Btree,Hash,Queue和Recno。在打开数据库的时候要指定一种存储模式
Btree 模式是以排序的二叉树的方式存储,
Hash是以线性哈希表的方式存储。
Queue用逻辑记录号做为键值,以定长的数据为记录值。
Recno方式也以逻辑记 录号做为键值,但可以保存定长或变长的记录值。这里提到的逻辑记录号有两种,可变的和固定的。
SQLite与Berkeley DB相比,在操作语句上更类似关系型数据库的产品。绝大多数标准的SQL92语句SQLite都能支持。
将于2010年3月底正式发布最新版本Oracle Berkeley DB 11g release 2。除了对原有Oracle Berkeley DB的功能进行了一定的改进和增强(比如提升了数据压缩功能、性能优化、C/C++中系统资源自动管理功能等等),本次发布的版本中最引人瞩目的变化是引入了对SQL92的支持,这一新增的接口称为Oracle Berkeley DB SQL,简称BDBSQL。这是自Berkeley DB诞生20多年来第一次支持SQL接口。这无论是对开源社区,还是对嵌入式数据库行业来说,都将是一件喜事。
For compatibility with programs using old UNIX dbm function, the package also provides traditional dbm and ndbm interfaces.
GNU dbm (or GDBM, for short) is a library of database functions that use extensible hashing and work similar to the standard UNIX dbm.
DB的设计思想是简单、小巧、可靠、高性能。如果说一些主流数据库系统是大而全的话,那么DB就可称为小而精。DB提供了一系列应用程序接口(API), 调用本身很简单,应用程序和DB所提供的库在一起编译成为可执行程序。这种方式从两方面极大提高了DB的效率。第一:DB库和应用程序运行在同一个地址空 间,没有客户端程序和数据库服务器之间昂贵的网络通讯开销,也没有本地主机进程之间的通讯;第二:不需要对SQL代码解码,对数据的访问直截了当。
berkley db管理工具
rpm,subversion都使用bdb数据库,包名叫db4
[root@localhost db]# rpm -qa|grep db
db4-4.7.25-18.el6_4.x86_64
gdbm-1.8.0-36.el6.x86_64
dbus-glib-0.86-6.el6.x86_64
dbus-libs-1.2.24-7.el6_3.x86_64
db4-utils-4.7.25-18.el6_4.x86_64
[root@localhost rpm]# pwd
/var/lib/rpm
[root@localhost rpm]# ll
total 28664
-rw-r--r--. 1 root root 1548288 Jul 17 15:00 Basenames
-rw-r--r--. 1 root root 12288 Jul 17 15:00 Conflictname
-rw-r--r--. 1 root root 24576 Jul 17 17:04 __db.001
-rw-r--r--. 1 root root 229376 Jul 17 17:04 __db.002
-rw-r--r--. 1 root root 1318912 Jul 17 17:04 __db.003
-rw-r--r--. 1 root root 753664 Jul 17 17:04 __db.004
-rw-r--r--. 1 root root 782336 Jul 17 15:00 Dirnames
-rw-r--r--. 1 root root 2547712 Jul 17 15:00 Filedigests
-rw-r--r--. 1 root root 12288 Jul 17 15:00 Group
-rw-r--r--. 1 root root 12288 Jul 17 15:00 Installtid
-rw-r--r--. 1 root root 12288 Jul 17 15:00 Name
-rw-r--r--. 1 root root 12288 Jul 17 15:00 Obsoletename
-rw-r--r--. 1 root root 21786624 Jul 17 15:00 Packages
-rw-r--r--. 1 root root 1282048 Jul 17 15:00 Providename
-rw-r--r--. 1 root root 557056 Jul 17 15:00 Provideversion
-rw-r--r--. 1 root root 12288 Jun 24 10:56 Pubkeys
-rw-r--r--. 1 root root 110592 Jul 17 15:00 Requirename
-rw-r--r--. 1 root root 69632 Jul 17 15:00 Requireversion
-rw-r--r--. 1 root root 24576 Jul 17 15:00 Sha1header
-rw-r--r--. 1 root root 12288 Jul 17 15:00 Sigmd5
-rw-r--r--. 1 root root 12288 Jun 24 10:57 Triggername
[root@localhost lib]# cd /root/svnrepo/db/
[root@localhost db]# ll
total 2216
-rw-r--r--. 1 root root 8192 Jul 17 16:09 changes
-rw-r--r--. 1 root root 8192 Jul 17 16:06 checksum-reps
-rw-r--r--. 1 root root 8192 Jul 17 15:26 copies
-rw-r--r--. 1 root root 24576 Jul 17 16:15 __db.001
-rw-r--r--. 1 root root 368640 Jul 17 16:15 __db.002
-rw-r--r--. 1 root root 1318912 Jul 17 16:15 __db.003
-rw-r--r--. 1 root root 393216 Jul 17 16:15 __db.004
-rw-r--r--. 1 root root 1499136 Jul 17 16:15 __db.005
-rw-r--r--. 1 root root 57344 Jul 17 16:15 __db.006
-rw-r--r--. 1 root root 2422 Jul 17 15:26 DB_CONFIG
-rw-r-----. 1 root root 50 Jul 17 16:15 __db.register
-r--r--r--. 1 root root 2 Jul 17 15:26 format
-rw-r--r--. 1 root root 4 Jul 17 15:26 fs-type
-rw-r--r--. 1 root root 8192 Jul 17 15:26 locks
-rw-r--r--. 1 root root 8192 Jul 17 15:26 lock-tokens
-rw-r--r--. 1 root root 1048576 Jul 17 16:15 log.0000000001
-rw-r--r--. 1 root root 8192 Jul 17 15:26 miscellaneous
-rw-r--r--. 1 root root 8192 Jul 17 16:09 node-origins
-rw-r--r--. 1 root root 8192 Jul 17 16:09 nodes
-rw-r--r--. 1 root root 8192 Jul 17 16:09 representations
-rw-r--r--. 1 root root 8192 Jul 17 16:09 revisions
-rw-r--r--. 1 root root 8192 Jul 17 16:09 strings
-rw-r--r--. 1 root root 8192 Jul 17 16:09 transactions
-rw-r--r--. 1 root root 8192 Jul 17 15:26 uuids
11:54:52 36 ~:#db_stat -d /var/lib/rpm/Basenames Thu Jun 25 12:04:32 2015 Local time 61561 Hash magic number 9 Hash version number Little-endian Byte order Flags 367 Number of pages in the database 4096 Underlying database page size 0 Specified fill factor 21451 Number of keys in the database 21451 Number of data items in the database 192 Number of hash buckets 197782 Number of bytes free on bucket pages (74% ff) 46 Number of overflow pages 80396 Number of bytes free in overflow pages (57% ff) 63 Number of bucket overflow pages 182945 Number of bytes free in bucket overflow pages (29% ff) 0 Number of duplicate pages 0 Number of bytes free in duplicate pages (0% ff) 1 Number of pages on the free list
oracle berkeley DB programmer reference guide的第一章较为有用,值得一看
http://docs.oracle.com/cd/E17076_04/html/index.html
关系数据库,k/v数据库,内存数据库
大数据时代的 9 大Key-Value存储数据库
bdb是kv数据库,sqlite是嵌入式关系数据库
Oracle Berkeley DB bdb的介绍下面这句话很重要,提纲挈领
Provides an open source embeddable database library, allowing developers
the choice of SQL, Key/Value, XML/XQuery or Java Object storage for their data model.
data model
在过去的十年中,计算世界已经改变。现在不仅在大公司,甚至一些小公司也积累了TB量级的数据。各种规模的组织开始有了处理大数据的需求,而目前关系型数据库在可缩放方面几乎已经达到极限。
一个解决方案是使用键值(Key-Value)存储数据库,这是一种NoSQL(非关系型数据库)模型,其数据按照键值对的形式进行组织、索引和存储。KV存储非常适合不涉及过多数据关系业务关系的业务数据,同时能有效减少读写磁盘的次数,比SQL数据库存储拥有更好的读写性能。
SQL
sql数据库存储
关系模型
Key/Value
kv存储
这是一种NoSQL(非关系型数据库)模型
以MemcacheDB、Tokyo Tyrant为代表的key-value分布式存储,在上万并发连接下,轻松地完成高速查询。而MySQL,在几百个并发连接下,就基本上崩溃了。
Scalaris 是一个采用Erlang开发的分布式 key-value 存储系统,提供的 API 包括:Java、Python、Ruby和JSON。
XML/XQuery
解释XQuery最佳方式是这样讲:XQuery 相对于 XML 的关系,等同于 SQL 相对于数据库表的关系。
XQuery 被设计用来查询 XML 数据 - 不仅仅限于 XML 文件,还包括任何可以 XML 形态呈现的数据,包括数据库。
XQuery 是用于 XML 数据查询的语言
XQuery 被所有主要的数据库引擎支持(IBM、Oracle、Microsoft等等)
Java Object storage
Object storage systems allow relatively inexpensive, scalable and self-healing retention of massive amounts of unstructured data.
Object storage is used for diverse purposes such as storing photos on Facebook, songs on Spotify, or files in online collaboration services, such as Dropbox
相对便宜的,可扩展的和自修复的
对像存储被用于多种目的,例如存储图片在facebook,歌曲在spotify,文件放在在线协作服务里如dropbox。
Object Storage (also known as object-based storage) is a storage architecture that manages data as objects, as opposed to other storage architectures like file systems which manage data as a file hierarchy and block storage which manages data as blocks within sectors and tracks. Each object typically includes the data itself, a variable amount of metadata, and a globally unique identifier.
http://www.sqlite.org/docs.html
http://www.sqliteexpert.com/ gui工具
SQL As Understood By SQLite sqlite所理解的sql
sqlite的sql语法
先将sqlite数据库文件复制到一个安全的地方再做实验,系统中已知的两个sqlite数据库文件 sqlite3 /var/cache/yum/x86_64/6/base/617a880b84a87969e04bfeebb1b96d5f4 [root@svnserv ~]# sqlite3 /home/svnroot/flt8a-2-server/db/rep-cache.db SQLite version 3.3.6 Enter ".help" for instructions sqlite> .show echo: off explain: off headers: off mode: list nullvalue: "" output: stdout separator: "|" sqlite> .databases seq name file --- --------------- ---------------------------------------------------------- 0 main /home/svnroot/flt8a-2-server/db/rep-cache.db sqlite> .table rep_cache sqlite> .schema rep_cache CREATE TABLE rep_cache (hash text not null primary key, revision integer not null, offset integer not null, size integer not null, expanded_size integer not null); sqlite> .mode column sqlite> select * from rep_cache where revision >= 2710; e943a0338d96f6488ebddd5f435c05c5f47104d4 2710 0 499 1185 153deb942c12bbd61b7dce98de4e8c22dc29a835 2711 0 147 215586 sqlite> .mode html sqlite> select * from rep_cache where revision >= 2710; <TR><TD>e943a0338d96f6488ebddd5f435c05c5f47104d4</TD> <TD>2710</TD> <TD>0</TD> <TD>499</TD> <TD>1185</TD> </TR> <TR><TD>153deb942c12bbd61b7dce98de4e8c22dc29a835</TD> <TD>2711</TD> <TD>0</TD> <TD>147</TD> <TD>215586</TD> </TR> sqlite> .mode insert sqlite> select * from rep_cache where revision >= 2710; INSERT INTO table VALUES('e943a0338d96f6488ebddd5f435c05c5f47104d4',2710,0,499,1185); INSERT INTO table VALUES('153deb942c12bbd61b7dce98de4e8c22dc29a835',2711,0,147,215586); sqlite> .mode line sqlite> select * from rep_cache where revision >= 2710; hash = e943a0338d96f6488ebddd5f435c05c5f47104d4 revision = 2710 offset = 0 size = 499 expanded_size = 1185 hash = 153deb942c12bbd61b7dce98de4e8c22dc29a835 revision = 2711 offset = 0 size = 147 expanded_size = 215586 sqlite> .mode list sqlite> select * from rep_cache where revision >= 2710; e943a0338d96f6488ebddd5f435c05c5f47104d4|2710|0|499|1185 153deb942c12bbd61b7dce98de4e8c22dc29a835|2711|0|147|215586 sqlite> .mode tabs sqlite> select * from rep_cache where revision >= 2710; e943a0338d96f6488ebddd5f435c05c5f47104d4 2710 0 499 1185 153deb942c12bbd61b7dce98de4e8c22dc29a835 2711 0 147 215586 sqlite> .mode tcl sqlite> select * from rep_cache where revision >= 2710; "e943a0338d96f6488ebddd5f435c05c5f47104d4" "2710" "0" "499" "1185" "153deb942c12bbd61b7dce98de4e8c22dc29a835" "2711" "0" "147" "215586"
相关函数 sqlite> select date('now'); "2015-06-25" sqlite> select strftime('%s','now'); "1435201574" 返回当前年的第10月的第一个星期二的日期 sqlite> select date('now','start of year','+9 months','weekday 2'); "2015-10-06"
sqlite> select typeof(1);
integer
sqlite> select typeof(1.4);
real
sqlite> select typeof("43");
text
sqlite> select typeof(null);
null
sqlite远程连接示例
Sqlite 是一个只有几百 k 大小的、 优秀的嵌入式数据库,本身不带有远程连接的功能。由于其身材小,速度快并且为众多的语言支持,所以在单机领域得到了广泛的使用。但由于天然不支持服务 / 客户端的模式,使其在遇到小型规模数据库远程连接的情况时不得不借助于附加的编程。 单位有三百多人,作为网管每天要接到很多电话,有很多一时无法想起对应的名字,翻查通讯录不仅速度慢而且容易漏过。为了方便起见,在 sqlite 上建立了一个通讯录数据表,然后用 perl 编写了一个查询脚本。效果不错的同时,也有同事希望可以得到一份拷贝。但是这时遇到一个问题,如何保证通讯录在不同人手中保持版本的统一性。最好的办法是建立一个服务 / 客户端的模式,在本机上维护一个数据库,而其它人通过连接数据库得到相关的查询结果。 具体的解决方法是这样的:在本机上维护一个到 sqlite 数据库的连接并建立一个来自于客户端的 socket 的监听,接受远程查询条件并回复查询结果;客户端志负责发送和接受这些最简单的任务。
[root@fgy ~]# rpm -ql sqlite
/usr/bin/sqlite3
/usr/lib64/libsqlite3.so.0
/usr/lib64/libsqlite3.so.0.8.6
/usr/share/doc/sqlite-3.6.20
/usr/share/doc/sqlite-3.6.20/README
/usr/share/man/man1/sqlite3.1.gz
5 个免费的受欢迎的 SQLite 管理工具
用yumi制作centos6.5u盘启动盘时repodata目录下也有sqlite库文件。
14:22:45 12 /var/cache/yum/x86_64/6/base:#ll
total 20396
-rw-r--r--. 1 root root 20873216 Mar 11 06:26 9a3a8909e656c27cd85c75a2d53b491040effa3f170b0369172433843e1829d7-primary.sqlite
-rw-r--r--. 1 root root 0 Apr 15 11:48 cachecookie
-rw-r--r--. 1 root root 472 Apr 15 11:48 mirrorlist.txt
drwxr-xr-x. 2 root root 4096 Apr 15 11:49 packages
-rw-r--r--. 1 root root 3751 Oct 24 21:59 repomd.xml
14:22:45 13 /var/cache/yum/x86_64/6/base:#pwd
/var/cache/yum/x86_64/6/base
===========================
在jdk中使用,在这个路径下jdk1.8.0_144db
apache derby 数据库
http://blog.csdn.net/remote_roamer/article/details/4830723
sysinfo.bat
ij.bat进入命令行界面
发出 'help' 命令,以了解有关 IJ 命令语法的一般信息。
任何无法识别的命令都将视为可能的 SQL 命令并直接执行。
有关服务器所支持 SQL 语法的详细信息,请查阅您的 DBMS 服务器参考文档。
ij> help;
创建数据库,在当前目录下生成一个firstdb目录,相关目录都在它下面
connect 'jdbc:derby:firstdb;create=true';
create table firsttable(id int primary key, name varchar(20));
insert into firsttable values(1,'Hotpepper');
select * from firsttable;
run 'E:/derby/demo/programs/toursdb/ToursDB_schema.sql';
exit