精华内容
下载资源
问答
  • 内存数据库

    2019-09-25 15:09:23
    JAVA内存数据库使用demo 博客分类: JAVAMySQL javahsqldbjdbcderbysqlite 上篇文章散仙,写了关于SQLite的使用,本篇我们看下几款JAVA开源的数据库,主要有3个,derby,H2,HSQLdb,都是非常不错的数据库,既可以当...

    使用为先

    裸单测使用时,只用加载对应驱动即可

    以h2为例:

    public class TestH2 extends AbstractTestNGSpringContextTests {
        private static final String JDBC_URL = "jdbc:h2:mem:haha";
    
        private static final String USER = "";
        private static final String PASSWORD = "sa";
        private static final String DRIVER_CLASS = "org.h2.Driver";
    
        @Test
        public void test() throws Exception {
            Class.forName(DRIVER_CLASS);
    
            Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
            Statement statement = conn.createStatement();
            statement.execute("DROP TABLE IF EXISTS USER_INF");
            statement.execute("CREATE TABLE USER_INF(id INTEGER PRIMARY KEY ,name VARCHAR(100), sex VARCHAR(2))");
    
            statement.executeUpdate("INSERT INTO USER_INF VALUES(1, 'tom', '男') ");
            statement.executeUpdate("INSERT INTO USER_INF VALUES(2, 'jack', '女') ");
            statement.executeUpdate("INSERT INTO USER_INF VALUES(3, 'marry', '男') ");
            statement.executeUpdate("INSERT INTO USER_INF VALUES(4, 'lucy', '男') ");
    
            ResultSet resultSet = statement.executeQuery("select * from USER_INF");
    
            while (resultSet.next()) {
                System.out.println(resultSet.getInt("id") + ", " + resultSet.getString("name") +
                        ", " + resultSet.getString("sex"));
            }
    
            statement.close();
            conn.close();
        }
    
    }
    

    spring集成

    使用嵌入式数据源 EmbeddedDatabaseBuilder:

    public DataSource h2DataSource(){
            EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
            EmbeddedDatabase database = builder.setType(EmbeddedDatabaseType.H2)
                    .addScript("classpath:db/explore_db.sql") ///启动时初始化建表语句
                    .build();
            return database;
        }
    

    或采用xml配置:

    <jdbc:embedded-database id="dataSource" type="H2">
        <jdbc:script location="classpath*:schema.sql" />
        <jdbc:script location="classpath*:test-data.sql" />
    </jdbc:embedded-database>
    

    可配置url

    如果想指定jdbc的url,上面的集成方法就行不通,需要回到最原始的datasource上来。

    <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
        <property name="url" value="jdbc\:hsqldb\:mem\:YOUNAME" />
        <property name="username" value="sa" />
        <property name="password" value="" />
    </bean>
    
    <jdbc:initialize-database data-source="dataSource">
        <jdbc:script location="classpath:schema_h2.sql" />
     </jdbc:initialize-database>
    
    展开全文
  • 内存数据库、关系型数据库和非关系型数据库 一、内存数据库、关系型数据库和非关系型数据库 1.个人观点: 二、内存数据库(Redis,MongoDb,SQLite,Oracle等): 三、Raft分布式协议: 四、Redis出现宕机,...

    内存数据库、关系型数据库和非关系型数据库

    一、内存数据库、关系型数据库和非关系型数据库

    1.个人观点:

    二、内存数据库(Redis,MongoDb,SQLite,Oracle等):

    三、Raft分布式协议:

    四、Redis出现宕机,如何保证数据不丢失?


    一、内存数据库、关系型数据库和非关系型数据库

    数据库类型 特性 优点 缺点

    关系型数据库

    SQLite,Oracle,MySQL等

    1,关系型数据库,是指采用了关系模型来组织数据的数据库;
    2,关系型数据库的最大特点就是事务的一致性 ;
    3,简单来说,关系模型的指就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
    1,容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状,层次等其他模型来说更容易理解;
    2,使用方便:通用的SQL语言使得操作关系型数据库非常方便;
    3,易于维护:丰富的完整性(实体完整性,参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率;
    4,支持SQL可用于复杂的查询 
    1,为了维护一致性所付出的巨大代价就是其读写性能比较差;
    2,固定的表结构;
    3,高并发读写不行 
    4,海量数据的高效率读写

    非关系型数据库

    MongoDB,Redis,HBase等

    1,使用键值对存储数据 ;
    2,分布式 ;
    3,一般不支持ACID特性 ;
    如图4所示,非关系型数据库严格上不是一种数据库,的英文应该一种数据结构化存储方法的集合
    1,无需经过SQL层的解析,读写性能很高 ;
    2,基于键值对数据没有耦合性,容易扩展;
    3,存储数据的格式:nosql的的的存储格式是键,值形式,文档形式,图片形式等等,文档形式,图片形式等等,而关系型数据库则只支持基础类型
    1,不提供SQL支持,学习和使用成本较高;
    2,无事务处理,附加功能双向和报表等支持也不好;

    1.个人观点:

    关系型数据库:在于关系,对数据操作(比如数据的增删改查)之前需要考虑关系,具备ACID特性(ACID是原子原子性,一致性一致性,隔离性隔离性,耐用性持久性),高并发能力一般不行

     

    二、内存数据库(Redis,MongoDb,SQLite,Oracle等)

    基于内存,读写速度快,数据有可能会丢失,丢失率只能降到最低,但不能根除。

    MongoDB:更适合集群部署,更多的考虑到集群方案,一般可用于“海量数据分析的访问效率提升”。

    Redis:更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。一般可用于“较小数据量的性能和运算,比如网络开发中的session存储”。

     

    三、Raft分布式协议:

    一般分布式都会遵从的协议:有点类似美国的总统选举。

    比如有一个建议,有Ñ个服务器,有大于2N + 1的服务器表示赞同,那么这个建议就被通过。

    假如建议是“一致性”,只要大于2N + 1的服务器之间的数据一致,那他们就是一致。

    假如建议是“主服务器”,只要大于2N + 1的服务器投票给要被选举的服务器,被选举的服务器也将变成主服务器

    还有很多思维:https://www.jdon.com/artichect/raft.html

     

    四、Redis出现宕机,如何保证数据不丢失?

    一台服务器快照持久化(RDB),同时满足在指定的时间间隔内和改动了几个数据的两个条件,生成内存中的数据集快照,然后写入磁盘;日志持久化(AOF),满足everysec(每秒)/always(每次操作)/no(默认30秒)条件,生成日志,然后写入磁盘缓存

    多台服务器:Redis正在开发的Sentinel(哨兵监听),具体网址:http://redisdoc.com/topic/sentinel.html

    展开全文
  • 实时数据库,内存数据库,关系型数据库比较

    万次阅读 多人点赞 2018-09-26 18:55:10
    内存数据库 内存数据库就是将数据放在内存中直接操作的数据库,它利用内存的读写速度比磁盘快、内存是随机访问而磁盘是顺序访问这两个特点,将数据保存在内存中,在内存中模仿建立表结构和索引结构并针对内存特性...

    内存数据库

    内存数据库就是将数据放在内存中直接操作的数据库,它利用内存的读写速度比磁盘快、内存是随机访问而磁盘是顺序访问这两个特点,将数据保存在内存中,在内存中模仿建立表结构和索引结构并针对内存特性进行优化,相比从磁盘上访问,内存数据库访问较快。

    关系型数据库

    数据库是指按照一定数据结构和模型来组织、存储和管理数据的仓库。采用关系模型建立起来的数据库叫做关系数据库。关系数据库是建立在集合代数基础上,应用数学方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。

    实时数据库

    实时数据库概述

    实时数据库是采用实时数据模型建立起来的数据库,用于处理不断更新的快速变化的数据及具有时间限制的事务处理。实时数据库技术是实时系统和数据库技术相结合的产物,利用数据库技术来解决实时系统中的数据管理问题,同时利用实时技术为实时数据库提供时间驱动调和资源分配算法。主要应用于工业监控,如:电力、石化、化工、钢铁、冶金、造纸、交通控制和证券金融等工业领域的监控。。概括地讲,实时数据库系统有如下特点:

    1. 时间约束:
      实时数据库是其数据和事务都有明确的时间限制的数据库。在实时系统中,具有时间约束的数据主要是来自于外部的动态数据,以及由这些数据求导出的新的数据。数据库中的数据必须如实反映现场设备的运行情况。
    2. 事务调度:
      实时数据库系统的正确性不仅依赖于事务的逻辑结果,而且依赖于该逻辑结果所产生的时间。事务调度既要考虑事务的执行时间,也要考虑事务的截止期、紧迫程度等因素。
    3. 数据存储:
      实时数据库主要承担系统所有实时数据的存储和管理,为相关的功能提供快速、正确的实时信息。为了达到实时性,实时数据库在系统运行过程中,应常驻内存,以保证读取速度。对于实时性要求不高的数据可存放在外存储空间。因此,在实时数据库设计时,要妥善处理时间与存储空间的矛盾,以保证系统的实时性。
    4. 数据在线压缩:
      在实际的数据存储中,实时数据库还要解决如何高效处理海量数据的问题。如果数据被原封不动地存储势必需要大量内存和磁盘空间以及耗费大量的时间,因此必须对实时数据进行在线压缩存储。

    实时数据库的实现原理

    http://www.360doc.com/content/11/0422/11/6295074_111482939.shtml

    实时数据库常用压缩算法介绍
    https://www.cnblogs.com/liguangsunls/p/7207265.html

    比较项目 实时数据库 关系数据库 内存数据库 说明
    应用领域 应用于电力、石油、化工等流程工业和生产领域,适用于处理不断更新、快速变化的数据及具有时间限制的事务处理 应用于应用于电子商务、事务性管理、金融管理,网络游戏等领域 更多的应用与电信,证券,网络游戏等领域
    开发目的 处理实时变化的数据。维护数据的实时性、真实性,满足工业生产管理、实时应用的需要 处理永久、稳定的数据。维护数据的完整性、一致性,很难处理有关数据及其处理的定时限制,因此不能满足工业生产管理实时应用的需要 比关系型数据库的实时性有了些提高
    表结构 以时间序列方式对数据进行存储,以资产表的方式对数据进行访问 以二维表格对数据进行存储和访问 文档形式,或key,value的方式存储
    读写速度(记录/ 秒) 500000 3000 50000 实时数据库的读写速度要比关系数据库快几百倍
    历史数据压缩 实时数据库的数据压缩功能极大地减少了所占用的存储空间
    磁盘空间占用率 4G空间能存贮30万个测点的每秒变化一次的历史数据(不带索引)200小时 同等条件下,关系数据库5小时的数据就达到4G磁盘空间 不详
    数据恢复功能 关系数据库的数据恢复功能以消耗系统资源和牺牲系统性能为代价
    展开全文
  • 常用内存数据库介绍

    万次阅读 2018-12-29 21:33:00
    1.内存数据库简介1.概念2.内存数据库历史和发展3.常用内存数据库 1.SQLite1.SQLite最佳试用场合2.哪些场合适合使用其他的关系型数据库管理系统RDBMS2.Altibase3.Oracle 内存数据库系列 Berkeley DB 和 TimesTen1....

    1.内存数据库简介
    1.概念
    2.内存数据库历史和发展
    3.常用内存数据库
    1.SQLite
    1.SQLite最佳试用场合
    2.哪些场合适合使用其他的关系型数据库管理系统RDBMS
    2.Altibase
    3.Oracle 内存数据库系列 Berkeley DB 和 TimesTen
    1.Oracle Berkeley DB
    2.Oracle TimesTen
    4.eXtremeDB
    1.嵌入模式下H2的性能比较
    2.Net使用H2
    5.其他内存数据库

     

    1.  内存数据库简介

    1.1           概念

    一、什么是内存数据库 
    传统的数据库管理系统把所有数据都放在磁盘上进行管理,所以称做磁盘数据库(DRDB:Disk-Resident Database)。磁盘数据库需要频繁地访问磁盘来进行数据的操作,由于对磁盘读写数据的操作一方面要进行磁头的机械移动,另一方面受到系统调用(通常通过CPU中断完成,受到CPU时钟周期的制约)时间的影响,当数据量很大,操作频繁且复杂时,就会暴露出很多问题。
        近年来,内存容量不断提高,价格不断下跌,操作系统已经可以支持更大的地址空间(计算机进入了64位时代),同时对数据库系统实时响应能力要求日益提高,充分利用内存技术提升数据库性能成为一个热点。
        在数据库技术中,目前主要有两种方法来使用大量的内存。一种是在传统的数据库中,增大缓冲池,将一个事务所涉及的数据都放在缓冲池中,组织成相应的数据结构来进行查询和更新处理,也就是常说的共享内存技术,这种方法优化的主要目标是最小化磁盘访问。另一种就是内存数据库(MMDB:Main Memory Database,也叫主存数据库)技术,就是干脆重新设计一种数据库管理系统,对查询处理、并发控制与恢复的算法和数据结构进行重新设计,以更有效地使用CPU周期和内存,这种技术近乎把整个数据库放进内存中,因而会产生一些根本性的变化。两种技术的区别如下表:

    内存数据库系统带来的优越性能不仅仅在于对内存读写比对磁盘读写快上,更重要的是,从根本上抛弃了磁盘数据管理的许多传统方式,基于全部数据都在内存中管理进行了新的体系结构的设计,并且在数据缓存、快速算法、并行操作方面也进行了相应的改进,从而使数据处理速度一般比传统数据库的数据处理速度快很多,一般都在10倍以上,理想情况甚至可以达到1000倍。
      而使用共享内存技术的实时系统和使用内存数据库相比有很多不足,由于优化的目标仍然集中在最小化磁盘访问上,很难满足完整的数据库管理的要求,设计的非标准化和软件的专用性造成可伸缩性、可用性和系统的效率都非常低,对于快速部署和简化维护都是不利的。

    2.  内存数据库历史和发展

    一、雏形期 从上个世纪60年代末到80年代初。在这个时期中,出现了主存数据库的雏形。1969年IBM公司研制了世界上最早的数据库管理系统------基于层次模型的数据库管理系统IMS,并作为商品化软件投入市场。在设计IMS时,IBM考虑到基于内存的数据管理方法,相应推出了IMS/VS Fast Path。Fast Path是一个支持内存驻留数据的商业化数据库,但它同时也可以很好地支持磁盘驻留数据。在这个产品中体现了主存数据库的主要设计思想,也就是将需要频繁访问,要求高响应速度的数据直接存放在物理内存中访问和管理。在这个阶段中,包括网状数据库、关系数据库等其他各种数据库技术也都逐渐成型。 二、技术理论成熟期 1984年,D J DeWitt等人发表了《主存数据库系统的实现技术》一文。第一次提出了Main Memory Database(主存数据库)的概念。预言当时异常昂贵的计算机主存价格一定会下降,用户有可能将大容量的数据库全部保存在主存中,提出了AVL树、哈希算法、主存数据库恢复机制等主存数据库技术的关键理论,为主存数据库的发展指出了明确的方向 。 1984年,D J DeWitt等人提出使用非易逝内存或预提交和成组提交技术作为主存数据库的提交处理方案,使用指针实现主存数据库的存取访问。 1985年,IBM推出了IBM 370上运行的OBE主存数据库 1986年,RB Hagman提出了使用检查点技术实现主存数据库的恢复机制。威斯康星大学提出了按区双向锁定模式解决主存数据库中的并发控制问题。并设计出MM-DBMS主存数据库。贝尔实验室推出了DALI主存数据库模型。 1987年,ACM SIGMOD会议中提出了以堆文件(HEAP FILE)作为主存数据库的数据存储结构。Southern Methodist大学设计出MARS主存数据库模型。 1988年普林斯顿大学设计出TPK主存数据库。 1990年普林斯顿大学又设计出System M主存数据库。 三、产品发展期和市场成长期 随着互联网的发展,越来越多的网络应用系统需要能够支持大用户量并发访问、高响应速度的的数据库系统,主存数据库市场成熟 半导体技术快速发展,半导体内存大规模生产,动态随机存取存储器(DRAM)的容量越来越大,而价格越来越低,这无疑为计算机内存的不断扩大提供了硬件基础,使得主存数据库的技术可行性逐步成熟 1994年美国OSE公司推出了第一个商业化的,开始实际应用的主存数据库产品Polyhedra 1998年德国SoftwareAG推出了Tamino Database。 1999年日本UBIT会社开发出XDB主存数据库产品。韩国Altibase推出Altibase 2000年奥地利的QuiLogic公司推出了SQL-IMDB 2001年美国McObject推出eXtremeDB。加拿大Empress公司推出EmpressDB

    四、几种主存技术应用的比较 第一代:用户定制的主存数据库。通过应用程序来管理内存和数据;不支持SQL语句, 不提供本地存储, 没有数据库恢复技术;性能好但很难维护和在别的应用中不能使用;应用在实时领域比如工厂自动化生产。 第二代:简单功能的内存数据库。能够快速处理简单的查询;支持部分的 SQL语句和简单的恢复技术;主要目的是能够快速处理大量事务;针对简单事务处理领域,尤其是交换机, 移动通信等。 第三代:通用的主存数据库。针对传统的商业关系型数据库领域,能够提供更高的性能、通用性以及稳定性;提供不同的接口来处理复杂的SQL语句和满足不同的应用领域;可以应用在计费、电子商务、在线安全领域,几乎包括磁盘数据库的所有应用领域。 五、目前几种常见的通用内存数据库 eXtremeDB:eXtremeDB实时数据库是McObject公司的一款特别为实时与嵌入式系统数据管理而设计的数据库,只有50K到130K的开销,速度达到微秒级。eXtremeDB完全驻留在主内存中,不使用文件系统(包括内存盘)。eXtremeDB采用了新的磁盘融合技术,将内存拓展到磁盘,将磁盘当做虚拟内存来用,实时性能保持微秒级的同时,数据管理量在32BIT下能达到20G。 Oracle TimesTen:Oracle TimesTen是Oracle从TimesTen公司收购的一个内存优化的关系数据库,它为应用程序提供了实时企业和行业(例如电信、资本市场和国防)所需的即时响应性和非常高的吞吐量。Oracle TimesTen可作为高速缓存或嵌入式数据库被部署在应用程序层中,它利用标准的 SQL 接口对完全位于物理内存中的数据存储区进行操作。 SolidDB:Solid Information Technology 成立于 1992 年,全球总部位于加州Cupertino, Solid数据管理平台将基于内存和磁盘的全事务处理数据库引擎、载体级高可用性及强大的数据复制功能紧密地融为一体。

    ALTIBASE公司从1999年就一直致力于内存数据库软件和其应用的开发,提供高性能和高可用性的软件解决方案。特别适合通信、网上银行、证券交易、实时应用和嵌入式系统领域。目前占据80%以上内存数据库市场,可以说是当今数据库软件技术的领导者。目前Altibase在国内成功案例也比较多,尤其是在电信行业,已经得到了广泛认可.

    4.  常用内存数据库

    4.1           SQLite

    SQLite是一个小型的C程序库,实现了独立的,可嵌入的,零配置的SQL数据库引擎。特性包括:

    • 事务操作是原子,一致,孤立,并且持久的(ACID),即使在系统崩溃和电源故障之后。
    • 零配置——不需要安装和管理。
    • 实现了绝大多数SQL92标准。
    • 整个数据库存储在一个单一的文件中。
    • 数据库文件可以在不同字节序的机器之间自由地共享。
    • 支持最大可达2T的数据库。 (241 字节)
    • 字符串和BLOB类型的大小最大可达 2G 字节(231字节)。
    • 小的代码: 完整配置的少于250KB,忽略一些可选特性的少于150KB。
    • 在大多数常见操作上比流行的客户/服务器数据库引擎更快
    • 简单,易于使用的API
    • 内建TCL绑定。 另外提供可用于许多其他语言的绑定。
    • 具有良好注释的源代码,95%经过测试。
    • 独立:没有外部依赖。
    • 源代码位于公共域。 可用于任何用途。

    SQLite发行版包含一个独立的命令行访问程序(sqlite),可用于管理SQLite数据库,并适合作为一个如何使用SQLite库的例子。

     

    License:      SQLite使用Public domain授权(注),对于个人使用和商业使用都是免费的。

     

    技术上的优点和特性 SQLite是一个轻量级、跨平台的关系型数据库。

    ◇轻量级

    先说它的第一个特色:轻量级。想必SQLite的作者很看重这个特性,连它的Logo都是用的“羽毛”,来显摆它的轻飘飘。SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也挺小,以版本3.6.11为例,Windows下487KB、Linux下347KB。

     

    ◇     绿色软件

    SQLite的另外一个特点是绿色:它的核心引擎本身不依赖第三方的软件,使用它也不需要“安装”。所以在部署的时候能够省去不少麻烦。
    ◇单一文件

    所谓的“单一文件”,就是数据库中所有的信息(比如表、视图、触发器、等)都包含在一个文件内。这个文件可以copy到其它目录或其它机器上,也照用不误。

    ★技术上的缺点和不足
    ◇并发访问的锁机制 SQLite在并发(包括多进程和多线程)读写方面的性能一直不太理想。数据库可能会被写操作独占,从而导致其它读写操作阻塞或出错。
    SQL标准支持不全 在它的官方网站上,具体列举了不支持哪些SQL92标准。我个人感觉比较不爽的是不支持外键约束。
    ◇网络文件系统(以下简称NFS) 有时候需要访问其它机器上的SQLite数据库文件,就会把数据库文件放置到网络共享目录上。这时候你就要小心了。当SQLite文件放置于NFS时,在并发读写的情况下可能会出问题(比如数据损坏)。原因据说是由于某些NFS的文件锁实现上有Bug。
    ★编程语言接口 SQLite支持很多种语言的编程接口。这对于我这种喜欢混用多种编程语言的人来说,是很爽的。下面我大概介绍一下。
    ◇C/C++ 由于SQLite本身是C写的,它自带的API也是C接口的。所以C/C++用起来最直接了。假如你不喜欢面向过程的C API风格,可以另外找个C++的包装库。想重新发明轮子的同学,也可以自己包装一个。 ◇Java 如果要用Java访问SQLite,可以通过SQLite的JDBC驱动,或者通过专门的SQLite包装库。我个人建议走JDBC方式,万一将来要换数据库,代码就不用大改。 ◇Python pysqlite是Python操作SQLite的首选。从Python 2.5开始,它已经被整合到Python的标准库中。看来Python社区还是蛮喜欢SQLite嘛。 ◇.Net 对于喜欢.Net的同学,可以通过SQLite的ADO.NET驱动来访问。 ◇Ruby Ruby可以通过SQLite-Ruby操作SQLite数据库,不过我没用过。 ◇Perl 在CPAN上有DBD::SQLite,不过我也没用过。
    ★一些非技术的参考因素

    需要根据“如何选择开源项目”里面提到的几个参考因素,再评估一下。 ◇授权协议(License) SQLite使用的是Public Domain协议,这是最爽一种,可以放心大胆地用。 ◇用户的普及程度 最近这几年,使用SQLite的人越来越多。包括一些大公司也开始把它整合到产品中(比如Google的Gears、Apple的Safari、Adobe的AIR)。 ◇开发的活跃程度 如果到SQLite的Change Log上大致了解一下,可以看出最近5年基本上每1-2个月都会有更新。说明开发的活跃度还是非常高的。

    SQLite不同于其他大部分的SQL数据库引擎,因为它的首要设计目标就是简单化:

    • 易于管理
    • 易于使用
    • 易于嵌入其他大型程序
    • 易于维护和配置

    许多人喜欢SQLite因为它的小巧和快速. 但是这些特性只是它的部分优点, 使用者还会发现SQLite是非常稳定的. 出色的稳定性源于它的简单, 越简单就越不容易出错. 除了上述的简单、小巧和稳定性外, 最重要的在于SQLite力争做到简单化.

    简单化在一个数据库引擎中可以说是一个优点, 但也可能是个缺点, 主要决定于你想要做什么. 为了达到简单化, SQLite省略了一些人们认为比较有用的特性, 例如高并发性、 严格的存取控制、丰富的内置功能、 存储过程、复杂的SQL语言特性、 XML以及Java的扩展, 超大的万亿级别的数据测量等等. 如果你需要使用上述的这些特性并且不介意它们的复杂性, 那么SQLite也许就不适合你了. SQLite没有打算作为一个企业级的数据库引擎, 也并不打算和Oracle或者PostgreSQL竞争.

    仅凭经验来说SQLite适用于以下场合: 当你更看中简单的管理、使用和维护数据库, 而不是那些企业级数据库提供的不计其数的复杂功能的时候,使用SQLite是一个比较明智的选择. 事实也证明, 人们在许多情况下已经清楚的认识到简单就是最好的选择.

    4.1.1   SQLite最佳试用场合

    ·         网站

    作为数据库引擎SQLite适用于中小规模流量的网站(也就是说, 99.9%的网站). SQLite可以处理多少网站流量在于网站的数据库有多大的压力. 通常来说, 如果一个网站的点击率少于100000次/天的话, SQLite是可以正常运行的. 100000次/天是一个保守的估计, 不是一个准确的上限. 事实证明, 即使是10倍的上述流量的情况下SQLite依然可以正常运行.

    ·         嵌入式设备和应用软件

    因为SQLite数据库几乎不需要管理, 因此对于那些无人值守运行或无人工技术支持的设备或服务, SQLite是一个很好的选择. SQLite能很好的适用于手机, PDA, 机顶盒, 以及其他仪器. 作为一个嵌入式数据库它也能够很好的应用于客户端程序.

    ·         应用程序文件格式

    SQLite作为桌面应用程序的本地磁盘文件格式取得了巨大成功.例如金融分析工具、CAD 包、档案管理程序等等. 一般的数据库打开操作需要调用sqlite3_open()函数,并且标记一个显式本地事务的起始点(BEGIN TRANSACTION)来保证以独占的方式得到文件的内容. 文件保存将执行一个提交(COMMIT)同时标记另一个显式本地事务起始点. 这种事务处理的作用就是保证对于应用程序数据文件的更新是原子的、持久的、独立的和一致的.

    数据库里可以加入一些临时的触发器,用来把所有的改变记录在一张临时的取消/重做日志表中. 当用户按下取消/重做按钮的时候这些改变将可以被回滚. 应用这项技术实现一个无限级的取消/重做功能只需要编写很少的代码.

    ·         替代某些特别的文件格式

    许多程序使用fopen(), fread(), 或 fwrite()函数创建和管理一些自定义的文件用来保存数据. 使用SQLite替代这些自定义的文件格式将是一种很好的选择.

    ·         内部的或临时的数据库

    对于那些有大量的数据需要用不同的方式筛选分类的程序, 相对于编写同样功能的代码, 如果你把数据读入一个内存中的SQLite数据库, 然后使用连接查询和ORDER BY子句按一定的顺序和排列提取需要的数据, 通常会更简单和快速. 按照上述的方法使用内嵌的SQLite数据库将会使程序更富有灵活性, 因为添加新的列或索引不用重写任何查询语句.

    ·         命令行数据集分析工具

    有经验的SQL用户可以使用SQLite命令行程序去分析各种混杂的数据集. 原是数据可以从CSV(逗号分隔值文件)文件中导入, 然后被切分产生无数的综合数据报告. 可能得用法包括网站日志分析, 运动统计分析, 编辑规划标准, 分析试验结果.

    当然你也可以用企业级的客户端/服务器数据库来做同样的事情. 在这种情况下使用SQLite的好处是: SQLite的部署更为简单并且结果数据库是一个单独的文件, 你可以把它存储在软盘或者优盘或者直接通过email发给同事.

    ·         在Demo或测试版的时候作为企业级数据库的替代品

    如果你正在编写一个使用企业级数据库引擎的客户端程序, 使用一个允许你连接不同SQL数据库引擎的通用型数据库后台将是很有意义的. 其更大的意义在于将SQLite数据库引擎静态的连接到客户端程序当中,从而内嵌SQLite作为混合的数据库支持. 这样客户端程序就可以使用SQLite数据库文件做独立的测试或者验证.

    ·         数据库教学

    因为SQLite的安装和使用非常的简单(安装过程几乎忽略不计, 只需要拷贝SQLite源代码或sqlite.exe可执行文件到目标主机, 然后直接运行就可以) 所以它非常适合用来讲解SQL语句. 同学们可以非常简单的创建他们喜欢的数据库, 然后通过电子邮件发给老师批注或打分. 对于那些感兴趣怎样实现一个关系型数据库管理系统(RDBMS)的高层次的学生, 按照模块化设计且拥有很好的注释和文档的SQLite源代码, 将为他们打下良好的基础. 这并不是说SQLite就是如何实现其他数据库引擎的精确模型, 但是很适合学生们了解SQLite是如何快速工作的, 从而掌握其他数据库系统的设计实现原则.

    ·         试验SQL语言的扩展

    SQLite简单且模块化的设计使得它可以成为一个用来测试数据库语言特性或新想法的优秀的原型平台

     

    4.1.2   哪些场合适合使用其他的关系型数据库管理系统(RDBMS)

    ·         客户端/服务器程序

    如果你有许多的客户端程序要通过网络访问一个共享的数据库, 你应当考虑用一个客户端/服务器数据库来替代SQLite. SQLite可以通过网络文件系统工作, 但是因为和大多数网络文件系统都存在延时, 因此执行效率不会很高. 此外大多数网络文件系统在实现文件逻辑锁的方面都存在着bug(包括Unix 和windows). 如果文件锁没有正常的工作, 就可能出现在同一时间两个或更多的客户端程序更改同一个数据库的同一部分, 从而导致数据库出错. 因为这些问题是文件系统执行的时候本质上存在的bug, 因此SQLite没有办法避免它们.

    好的经验告诉我们, 应该避免在许多计算机需要通过一个网络文件系统同时访问同一个数据库的情况下使用SQLite.

    ·         高流量网站

    SQLite通常情况下用作一个网站的后台数据库可以很好的工作. 但是如果你的网站的访问量大到你开始考虑采取分布式的数据库部署, 那么你应当毫不犹豫的考虑用一个企业级的客户端/服务器数据库来替代SQLite.

    ·         超大的数据集

    当你在SQLite中开始一个事务处理的时候(事务处理会在任何写操作发生之前产生, 而不是必须要显示的调用BEGIN...COMMIT), 数据库引擎将不得不分配一小块脏页(文件缓冲页面)来帮助它自己管理回滚操作. 每1MB的数据库文件SQLite需要256字节. 对于小型的数据库这些空间不算什么, 但是当数据库增长到数十亿字节的时候, 缓冲页面的尺寸就会相当的大了. 如果你需要存储或修改几十GB的数据, 你应该考虑用其他的数据库引擎.

    ·         高并发访问

    SQLite对于整个数据库文件进行读取/写入锁定. 这意味着如果任何进程读取了数据库中的某一部分, 其他所有进程都不能再对该数据库的任何部分进行写入操作. 同样的, 如果任何一个进程在对数据库进行写入操作, 其他所有进程都不能再读取该数据库的任何部分. 对于大多数情况这不算是什么问题. 在这些情况下每个程序使用数据库的时间都很短暂, 并且不会独占, 这样锁定至多会存在十几毫秒. 但是如果有些程序需要高并发, 那么这些程序就需要寻找其他的解决方案了.

     

     

     

    方面

    具体要求

    必要条件

    详细描述

    License

    是否收费

     

    免费使用

    是否开源

     

    开源

    是否有技术支持

     

    主要是社区支持,如果需要专业支持需要购买

    商业目的的分发版本是否仍要收费

    免费

    其他

       

    性能

    数据容量支持100000条以上记录

    支持

    并发查询处理能力

     

    SQLite在并发(包括多进程和多线程)读写方面的性能一直不太理想。数据库可能会被写操作独占,从而导致其它读写操作阻塞或出错。

    查询速度

     

    修改速度

     

    平台支持

    32/64位

     

    全部支持

    Linux/window/UNIX/mobile

     

    支持Linux/Mac OS/Windows

    运行方式支持

    支持嵌入式

     

    支持

    支持独立运行

     

    不支持

    连接方式支持

    支持ODBC

     

    默认不支持,必须通过第三方的ODBC驱动

    支持JDBC

     

    默认不支持,必须通过第三方的JDBC驱动

    支持内存访问

     

    通过c接口(专用API)

    支持网络访问

     

    不支持

    SQL支持

    支持SQL

    支持

    支持Index,Trigger,

    Constrains,Views

     

    支持,有资料说其不支持外键约束。

    管理界面

    支持管理界面

     

    支持CLI

    管理界面友好程度

     

    较差

     

     

    4.2           Altibase

    Altibase™内存数据库管理系统(DBMS),内存数据管理系统的最新技术,是一个在事务优先的环境中提供高性能和高可用性的软件解决方案。Altibase提供极限性能、容错能力和事务管理的方便性,特别是在通信、网上银行、证券交易、实时应用和嵌入式系统领域。Altibase能够最大限度的发挥数据库服务系统的潜力,使用Altibase能大大增强您公司的数据服务器的处理能力。

    Altibase™内存DBMS为需要容错服务的系统提供实时数据库复制的功能。采用Altibase数据库复制的系统可以实现高性能、高可用性、数据库一致性、负载平衡和系统可伸缩性。如果您希望您的业务能够实现最大的成功,请在您的事务优先的系统中使用我们的Altibase数据库复制解决方案。

    资料比较少,且需要商业License,没有详细去研究

    4.3           Oracle 内存数据库系列 Berkeley DB 和 TimesTen

    Oracle是最重要的商业数据库产品提供商,它也有内存数据库的产品系列:主要就是Oracle Berkeley DB 和 Times Ten.前者是只支持嵌入式内存数据,后者是独立的内存优化数据库。

    4.3.1     Oracle Berkeley DB

        Oracle Berkeley DB是Oracle 收购了开源数据库厂商后推出的产品,其前身是Berkeley DB。它有开源版本,但且对于开源软件免费。商业版本是要付费。

    Oracle Berkeley DB 系列的可嵌入开源数据库为开发人员提供了无需管理的快速、可靠的本地持久性。Oracle Berkeley DB 系列通常部署为“前沿”数据库,为不需要 SQL 的应用程序用例提供很高的性能、可靠性、可伸缩性以及可用性。

    Oracle Berkeley DB 产品系列

    —     Berkeley DB — 事务处理式存储引擎,用于基本键/值数据结构中的非类型化数据 — 新增!版本 4.7 现已推出

    —     针对 Java 环境优化的纯 Java 版 Berkeley DB — 新增!版本 3.3

    —     Berkeley DB XML — 原生 XML 数据库,可基于 XQuery 访问容器中存储的文档,并根据其内容进行索引 — 新增!版本 2.4 现已推出

     

     

    4.3.2     Oracle TimesTen

    Oracle 内存数据库 TimesTen 是一个针对内存进行了优化的关系数据库,它为应用程序提供了当今实时企业和行业(如电信、资本市场和国防)所需的即时响应性和非常高的吞吐量。Oracle 内存数据库 TimesTen 作为独立或嵌入式数据库部署在应用层中,利用标准的 SQL 接口对完全位于物理内存中的数据库进行操作。它也可以用作 Oracle 数据库的内存中数据库缓存,以改进用户应用程序的响应时间和吞吐量。

          

     

    4.4           eXtremeDB

    eXtremeDB内存式实时数据库是为实时系统及嵌入式系统而特别设计的数据库。与同类产品不同,eXtremeDB不是通过 对企业数据库面向实时嵌入式应用进行剪裁而来;而是总结了30年来McObject公司在编译器、实时编程、数据管理、内核级驱 动软件等领域的经验,面向实时嵌入式应用从头开发的最新实时数据管理技术。

    eXtremeDB满足了您对实时数据库的一切期待:高级数据定义语言、并行访问、基于交易及灵活的索引… …等等。不仅如此,出乎您的意外,eXtremeDB在紧凑的引擎中还提供诸如事件触发、目标历史等等功能。

    eXtremeDB嵌入式数据库满足更多的实时开发的要求。

    ·                     最快的内存数据库。

    ·                     极小尺寸和极小的内存消耗

    ·                     多种索引支持

    ·                     高可用性-组合选项

    ·                     非常灵活的数据存储: 内存式,磁盘式或混合式

    ·                     多种应用接口: 两种 SQL, 两种更快的原始接口

    ·                     几乎牢不可破 -

    又一个商业内存数据库产品,这个特点是实时数据库,号称最快。

     

    4.5           H2 Database

           h2是Thomas Mueller提供的一个开源的、纯java实现的关系数据库,官方网站:http://www.h2database.com/html/main.html

           它的主要特性是:

    • 非常速的数据库引擎
    • 开源、免费数据库
    • 支持 JDBC和ODBC API,支持SQL
    • 支持嵌入式,服务器和集群模式。支持内存数据库。
    • 提供基于浏览器的管理控制台
    • 整个应用本身只有1MB左右。

    其他特性还包括

    • 基于磁盘或内存的数据库、表,支持只读数据库、临时表。
    • 两段式事务支持
    • 支持多个连接。表级别的锁。
    • 基于成本的优化,为复杂查询使用遗传算法,零管理。
    • 滚动的、可修改的result set支持。支持大结果集、外部结果排序。
    • 加密数据库(AES或XTEA),SHA-256密码加密。

    性能比较(摘自h2database网站)

    嵌入模式下H2的性能比较

    Test Case

    Unit

    H2

    HSQLDB

    Derby

    Simple: Init

    ms

    610

    657

    3187

    Simple: Query (random)

    ms

    297

    312

    1828

    Simple: Query (sequential)

    ms

    203

    266

    1766

    Simple: Update (random)

    ms

    1078

    1484

    22031

    Simple: Delete (sequential)

    ms

    234

    281

    7407

    Simple: Memory Usage

    MB

    6

    7

    11

    BenchA: Init

    ms

    859

    438

    4047

    BenchA: Transactions

    ms

    5266

    2875

    17500

    BenchA: Memory Usage

    MB

    9

    14

    10

    BenchB: Init

    ms

    4016

    2687

    16875

    BenchB: Transactions

    ms

    2609

    3282

    4250

    BenchB: Memory Usage

    MB

    9

    10

    8

    BenchC: Init

    ms

    891

    594

    5766

    BenchC: Transactions

    ms

    4359

    75438

    11718

    BenchC: Memory Usage

    MB

    9

    18

    9

    Executed statements

    #

    594255

    594255

    594255

    Total time

    ms

    20422

    88314

    96375

    Statements per second

    #

    29098

    6728

    6166

     

    .Net使用H2
      1. 嵌入式应用。有一个项目在为.Net使用H2,使用CLI重新编译H2。还没有深入关注。
      2. ODBC。但性能一般。

    4.5           其他内存数据库

    包括Derby, HSQLDB等.

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------

    In-memory database in wikipedia: (http://en.wikipedia.org/wiki/In-memory_database)

    Products

    Product name↓License↓Description↓
    Adaptive Server Enterprise (ASE) 15.5 Proprietary enterprise database from Sybase)[4]
    Apache Derby Apache License 2.0 Java RDBMS
    Altibase Proprietary has in-memory and disk table; HYBRID DBMS
    BlackRay GNU General Public Licence (GPLv2) and BSD License  
    CSQL GNU General Public Licence or proprietary  
    Datablitz Proprietary DBMS
    Eloquera Proprietary In-memory, In-memory:persist modes
    eXtremeDB commercial product DBMS, also check out its open source PERST dbms.
    FleetDB MIT NOSQL db with Writing to an append-only log to provide durability.
    H2 Mozilla Public License or Eclipse Public License has a memory-only mode
    HSQLDB BSD license has a memory-only mode
    IBM TM1 Proprietary in-memory BI and data analysis
    InfoZoom Proprietary in-memory BI and data analysis
    KDB Proprietary DBMS, also supports disk based data
    membase Apache License NoSQL, hybrid
    MicroStrategy   in-memory BI for MicroStrategy 9
    MonetDB MonetDB License  
    MySQL GNU General Public License or proprietary has a cluster server which uses a main-memory storage engine
    Oracle Berkeley DB Sleepycat License can be configured to run in memory only
    Panorama   for Windows and Macintosh, both single user and server versions
    ParAccel Proprietary in-memory, columnar, relational, ACID-compliant; disk-based mode as well
    Polyhedra IMDB Proprietary relational, supports High-Availability; acquired in 2001 by ENEA
    QlikView   BI-tool developed by QlikTech
    RDM Embedded Proprietary including hybrid
    RDM Server Proprietary including hybrid
    Redis BSD NoSQL
    solidDB by IBM   including hybrid, HSB-based HA, Shared memory, embedded, XA, etc.
    SAP HANA database Proprietary Database engine of the SAP In-Memory Appliance (SAP HANA) produced by SAP AG
    SQLite Public domain hybrid, RAM and disk dbs can be used together
    Starcounter   in-memory object relational dbms
    TimesTen by Oracle   in memory only or as a cache for Oracle Database
    Vertipaq Proprietary Microsoft PowerPivot and Microsoft Analysis Services in-memory BI engine
    VoltDB GNU General Public License v3 in-memory
    TREX   search engine in the SAP NetWeaver integrated technology platform produced bySAP AG
    Xcelerix byFrontex   commercial product

     转http://blog.csdn.net/jackxinxu2100/article/details/6764530

    from: http://www.cnblogs.com/newstart/archive/2013/01/06/2847067.html
    展开全文
  • 内存数据库 传统的数据库管理系统把所有数据都放在磁盘上进行管理,所以称作磁盘数据库(DRDB: Disk-Resident Database).磁盘数据库因为磁头机械运动及系统调用因素导致速度降低,后来逐渐增加内存作用,有两种技术:...
  • sqlite内存数据库、文件数据库

    千次阅读 2019-07-16 09:06:13
    由于sqlite对多进程操作支持效果不太理想,在项目中,为了避免频繁读写 文件数据库带来的性能损耗,我们可以采用操作sqlite内存数据库,并将内存数据库定时同步到文件数据库中的方法。 实现思路如下: 1、创建...
  • 内存数据库的基本原理与内存数据库的应用 网址: http://www.eygle.com/digest/2011/11/memdb_timesten_altibase.html 内存数据库,顾名思义就是将数据放在内存中直接操作的数据库。相对于磁盘,内存的...
  • Qt之内存数据库

    千次阅读 2019-11-12 19:25:44
    内存数据库,顾名思义就是将数据放在内存中直接操作的数据库。相对于磁盘,内存的数据读写速度要高出几个数量级,将数据保存在内存中相比从磁盘上访问能够极大地提高应用的性能。所以在有大量数据交互时使用内存...
  • 在Spring Boot中使用内存数据库

    万次阅读 2020-03-01 08:38:39
    所谓内存数据库就是可以在内存中运行的数据库,不需要将数据存储在文件系统中,但是相对于普通的数据库而言,内存数据库因为数据都在内存中,所以内存的数据库的存取速度会更快。 本文我们将会讨论如何在Spring Boot...
  • 内存数据库 memcached

    2016-05-17 09:14:30
    内存数据库 memcached
  • 内存数据库与磁盘数据库

    千次阅读 2018-09-02 10:26:34
    1、磁盘数据库需要频繁地访问磁盘来进行数据的操作,由于对磁盘读写数据的操作一方面要进行磁头的机械移动,另一方面受到系统调用(通常通过CPU中断完成,受到CPU时钟周期的制约)... 内存数据库数据处理速度比传统...
  • Delphi使用SQLite3内存数据库

    热门讨论 2014-11-11 16:22:58
    Delphi使用SQLite3,包括本地数据库和内存数据库,本地数据库加载到内存,内存数据库备份到本地,使用sqlite simple delphi包装类。
  • 由于sqlite对多进程操作支持效果不太理想,在项目中,为了避免频繁读写 文件数据库带来的性能损耗,我们可以采用操作sqlite内存数据库,并将内存数据库定时同步到文件数据库中的方法。 实现思路如下: 1、创建文件...
  • 内存数据库 HSQLDB

    千次阅读 2014-06-11 14:54:52
    内存数据库:HSQLDB】由于我们在JUnit的测试中没有真实的数据库环境,所以我们很自然的会借助内存数据库。另外,当内存数据库关闭后,内存中的数据也随之消失。
  • H2内存数据库

    千次阅读 2017-05-21 18:10:02
    之前项目中用到了H2内存数据库,做下整理: H2数据库介绍 常用的开源数据库:H2,Derby,HSQLDB,MySQL,PostgreSQL。其中H2,HSQLDB类似,十分适合作为嵌入式数据库使用,其它的数据库大部分都需要安装独立的...
  • 内存数据库技术选型

    千次阅读 2017-08-27 12:37:24
    最近一段时间研究了内存数据库,总结了一下,分享给大家。我们先从应用场景说起。 一. 内存数据库的应用场景 数据缓存:将经常使用的数据存放在内存中,全局共享,减少和数据库之间的交互频率,提升数据访问速度...
  • 关系数据库到内存数据库同步 这部分数据同步采用增量表的方式,系统新增或更新的数据将生成到关系数据库的增量表中,程序先到这些增量表中查询数据。如果能在这些增量表中查到数据就把这些数据更新到内存数据库对应...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,189
精华内容 34,475
关键字:

内存数据库