Fork me on GitHub

数据库之开源数据库

常用的开源数据库:H2,Derby,HSQLDB,MySQL,PostgreSQL。其中H2,HSQLDB类似,十分适合作为嵌入式数据库使用,其它的数据库大部分都需要安装独立的客户端和服务器端。
H2的优势:
1、h2采用纯Java编写,因此不受平台的限制。
2、h2只有一个jar文件,十分适合作为嵌入式数据库试用。
3、性能和功能的优势

H2比HSQLDB的最大的优势就是h2提供了一个十分方便的web控制台用于操作和管理数据库内容,这点比起HSQLDB的swing和awt控制台实在好用多了。

 

BDB (Berkeley DB)数据库简介(转载)

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: "|"
    width:

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_144\db

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



posted on 2014-07-17 17:09  阳光-源泉  阅读(1317)  评论(0编辑  收藏  举报

导航