当前位置: 首页 > 科技观察

哪个是Java生态系统中最好的嵌入式数据库?

时间:2023-03-13 18:09:45 科技观察

嵌入式数据库是一个非常陌生的词汇,以前只是听说过,但从未真正使用过。今天小编就和大家揭开它的面纱。1.简介第一次接触嵌入式数据库(EmbeddedDatabase)可能有点模糊。什么是嵌入式数据库?为什么要使用嵌入式数据库?如何使用嵌入式数据库?如何选择?本文将带你一起揭晓答案。从软件的角度,数据库分为两类:第一类:数据库服务器(DatabaseServer)第二类:嵌入式数据库(EmbeddedDatabase)如Oracle、PostgreSQL、MySQL和SQLServer等,它们很好-众所周知的数据库,我们一般称之为数据库服务器。当然,也不排除有的数据库也提供嵌入式版本。例如,MySQLEmbedded是一个嵌入式数据库。并将SQLite、BerkeleyDB、Derby、H2、HSQLDB等数据库嵌入到应用程序中,与应用程序一起运行。我们称之为嵌入式数据库。嵌入式数据库和数据库服务器之间最大的区别是它们在不同的地址空间中运行。通常,数据库服务器独立运行一个守护进程,而嵌入式数据库与应用程序运行在同一个进程中。在实际开发中,数据库服务器应该是平时接触最多的,嵌入式数据库的使用比较少。但是为什么会有嵌入式数据库呢?在小型应用中,比如小型掌上游戏机,不适合部署上百兆的数据库服务器,也不需要联网。需要一个轻量级的数据库。诞生!与普通数据库相比,嵌入式数据库具有体积小、功能齐全、便携、健壮等特点。例如著名的SVN版本控制软件就使用SQLite作为内置数据库。SQLite的安装包只有不到350KB,在微型计算机中也有广泛的应用。例如Android、IOS等移动设备操作系统都内置了SQLite数据库!鉴于嵌入式数据库种类繁多,有商业收费的,也有开源免费的!本文主要介绍开源和免费版本,如Derby、SQLite、H2等,接下来我们来练习一下各个数据库的配置和使用。2、DerbyDerby可以说是一个100%由Java编写的数据库,而且是开源免费的。很小,核心部分derby.jar只有2M!很多人可能认为Derby不是很流行,但是Derby已经发展了将近20年。那一年!1996年,一家名为Cloudscape,Inc的新公司成立,目标是构建一个用Java语言编写的数据库服务器。公司的第一个发行版在一年后问世,产品名称后来变成了Cloudscape。1999年,Cloudscape,Inc.被主要的数据库供应商InformixSoftware,Inc.收购。InformixSoftware于2001年被IBM收购,随后IBMCloudscape?数据库系统被用作许多IBM产品中的嵌入式数据库引擎。2004年4月,IBM将Cloudscape数据库软件捐赠给Apache软件基金会,ApacheDerby项目由此诞生。随后SUN也为德比捐赠了一支球队。在JavaSE6.0中,SUN将其命名为JavaDB。2.1.项目介绍因为Derby是用java写的,所以比较容易集成。可以通过maven直接依赖pom.xml中的库文件进行开发!org.apache.derbyderby10.14.1.0runtime2.2、环境配置和所有数据库连接一样,基本配置驱动类、连接地址、账号、密码等信息。StringDRIVER_CLASS="org.apache.derby.jdbc.EmbeddedDriver";StringJDBC_URL="jdbc:derby:derbyDB;create=true";StringUSER="root";StringPASSWORD="root";说明:org.apache.derby.jdbc。EmbeddedDriver代表使用derby嵌入式数据库模式。JDBC_URL中的derbyDB表示创建一个名为derbyDB的临时数据库,如果没有则自动创建。USER和PASSWORD主要用于客户端登录。2.3.单元测试应用接下来我们使用JDBC编写一个测试类来测试derby是否可以正常使用。publicclassDerbyTest{/***以嵌入式(本地)连接模式连接到数据库*/privatestaticfinalStringJDBC_URL="jdbc:derby:derbyDB;create=true";privatestaticfinalStringDRIVER_CLASS="org.apache.derby.jdbc.EmbeddedDriver";privatestaticfinalStringUSER="root";privatestaticfinalStringPASSWORD="root";publicstaticvoidmain(String[]args)throwsException{//与数据库建立连接Class.forName(DRIVER_CLASS);Connectionconn=DriverManager.getConnection(JDBC_URL,USER,PASSWORD);Statementstatement=conn.createStatement();//删表statement.execute("DROPTABLEUSER_INF");//建表statement.execute("CREATETABLEUSER_INF(idVARCHAR(50)PRIMARYKEY,nameVARCHAR(50)NOTNULL,sexVARCHAR(50)NOTNULL)");//数据插入statement.executeUpdate("INSERTINTOUSER_INFVALUES('3','monkey','male')");//查询数据ResultSetresultSet=statement.executeQuery("select*fromUSER_INF");while(resultSet.next()){System.out.println(resultSet.getInt("id")+","+resultSet.getString("name")+","+resultSet.getString("sex"));}//关闭连接语句.close();conn.close();}}输出结果:1、程咬金,男2、孙尚香,女3、猴子,男程序运行后,会在当前项目的根目录下生成一个derbyDB文件夹,将存储一些持久性数据。下次连接derbyDB数据库名时,可以查询之前插入的历史数据。这个功能可以防止数据丢失!值得注意的是,derby不支持很多mysql关键字,derby也不支持插入空值。在以后的版本中,derby也可以作为数据库服务器,通过jar启动部署到单独的服务器上。在连接地址中加上IP和端口号,例如jdbc://derby://localhost:1527/derbyDB。如果想使用可视化客户端工具访问和管理derby,可以使用SQuirreLSQLClient客户端,下载地址http://www.squirrelsql.org/#installation。在目前的大部分嵌入式数据库应用中,derby还是比较少见的。3.SQLiteSQLite是由D.RichardHipp开发的一个功能强大的嵌入式关系数据库,带有一个小型的C库。虽然其功能略逊于BerkeleyDB(商业数据库),但易学,速度快,提供了丰富的数据库接口,提供了对SQL92的大部分支持:支持多表多索引、事务、视图、触发器和一系列用户界面和驱动程序。SQLite不仅支持Windows/Linux/Unix等主流操作系统,还可以与多种编程语言结合,如Tcl、C#、PHP、Java等,并具有ODBC接口。与Mysql和PostgreSQL这两个开源世界相比,就大名鼎鼎的数据库管理系统而言,其处理速度要快于它们。总源代码约30,000行C代码,文件约350KB,支持的数据库大小高达2TB!几乎常年占据嵌入式数据库的首位!3.1、SQLite安装3.1.1、windows安装1、访问SQLite下载页面https://www.sqlite.org/download.html。2.下载sqlite-tools-win32-*.zip和sqlite-dll-win32-*.zip压缩文件。3、新建文件夹C:\sqlite,在该文件夹中解压以上两个压缩文件,得到sqlite3.def、sqlite3.dll和sqlite3.exe文件。4.将C:\sqlite添加到PATH环境变量中。最后在命令提示符下输入sqlite3命令,显示如下结果,说明安装成功!C:\>sqlite3SQLiteversion3.7.15.22013-01-0911:53:05Enter.help"forinstructionsEnterSQLstatementsterminatedwitha";"3.1.2、linux安装目前,几乎所有版本的Linux操作系统都自带SQLite。因此,只需要在命令行输入sqlite3,查看机器是否安装了SQLite!$sqlite3SQLiteversion3.7.15.22013-01-0911:53:05回车.help"forinstructionsEnterSQLstatementsterminatedwitha";"如果没有看到上面的结果,安装也很简单!1.访问SQLite下载页面https://www.sqlite.org/download.html。2、下载sqlite-autoconf-*.tar.gz并上传到linux服务器。3.执行安装操作例如安装步骤示例:$tarxvzfsqlite-autoconf-3071502.tar.gz$cdsqlite-autoconf-3071502$./configure--prefix=/usr/local$make$makeinstall3.1.3、mac安装mac安装操作与linux类似。3.2.项目引入了sqlite,也可以直接通过maven依赖pom.xml中的库文件进行开发!org.xerialsqlite-jdbc3.7.23.3、环境配置StringDRIVER_CLASS="org.sqlite.JDBC";StringJDBC_URL="jdbc:sqlite:sqliteDB.db";StringUSER="root";StringPASSWORD="root";说明:org.sqlite.JDBC表示使用sqlite内嵌数据库方式。JDBC_URL中的sqliteDB表示创建一个名为sqliteDB的临时数据库,如果没有则自动创建。USER和PASSWORD主要用于客户端登录。3.4、单元测试应用接下来测试sqlite是否可以正常使用。publicclassSQLiteTest{/***以嵌入式(本地)连接模式连接到数据库*/privatestaticfinalStringJDBC_URL="jdbc:sqlite:sqliteDB.db";privatestaticfinalStringDRIVER_CLASS="org.sqlite.JDBC";privatestaticfinalStringUSER="root";privatestaticfinalStringPASSWORD="root";publicstaticvoidmain(String[]args)throwsException{//与数据库建立连接Class.forName(DRIVER_CLASS);Connectionconn=DriverManager.getConnection(JDBC_URL,USER,PASSWORD);Statementstatement=conn.createStatement();//删表语句.execute("DROPTABLEIFEXISTSUSER_INF");//建表语句.execute("CREATETABLEUSER_INF(idVARCHAR(50)PRIMARYKEY,nameVARCHAR(50)NOTNULL,sexVARCHAR(50)NOTNULL)");//插入数据语句.executeUpdate("INSERTINTOUSER_INFVA('1','程咬金','男')");statement.executeUpdate("INSERTINTOUSER_INFVALUES('2','孙尚香','女')");statement.executeUpdate("INSERTINTOUSER_INFVALUES('3','monkey','male')");//查询数据ResultSetresultSet=statement.executeQuery("选择*来回mUSER_INF");while(resultSet.next()){System.out.println(resultSet.getInt("id")+","+resultSet.getString("name")+","+resultSet.getString("sex"));}//关闭连接语句.close();conn.close();}}输出结果:1、程咬金,男2、孙尚香,女3、猴子,男程序运行后,在当前项目的根目录下也会生成一个上面自定义的名为sqliteDB的文件,每次操作一个名为sqliteDB的数据库,都会将数据持久化到sqliteDB文件中,防止数据丢失,如果要使用可视化客户端可以使用navicat连接,选择生成的sqliteDB文件,输入对应的账号和密码,就可以进行管理和维护了!4、H2h2是另一个纯java编写的嵌入式数据库,它本身只是一个类库,即只有一个jar文件,可以直接嵌入到应用项目中,还提供了非常友好的基于web的数据库管理界面。开发者在网上将其与derby进行比较,说是同mysql数据库,兼容性强,口碑好。不管是真是假,我们都会在文章后面进行相应的性能测试。让我们看看如何在开发中使用它。4.1.项目介绍由于h2是纯java编写的,可以直接通过maven依赖pom.xml中的库文件进行开发!com.h2databaseh21.4.200runtime4.2、环境配置StringDRIVER_CLASS="org.h2.Driver";StringJDBC_URL="jdbc:h2:mem:h2DB";StringUSER="root";StringPASSWORD="root";说明:org.h2.Driver表示使用h2嵌入式数据库模式。JDBC_URL中的h2DB表示创建一个名为h2DB的临时数据库。USER和PASSWORD主要用于客户端登录。4.3.单元测试应用接下来我们测试下h2是否可以正常使用。publicclassH2Test{/***以嵌入式(本地)连接模式连接H2数据库*/privatestaticfinalStringJDBC_URL="jdbc:h2:mem:h2DB";privatestaticfinalStringDRIVER_CLASS="org.h2.Driver";privatestaticfinalStringUSER="root";privatestaticfinalStringPASSWORD="root";publicstaticvoidmain(String[]args)throwsException{//与数据库建立连接Class.forName(DRIVER_CLASS);Connectionconn=DriverManager.getConnection(JDBC_URL,USER,PASSWORD);Statementstatement=conn.createStatement();//删除表statement.execute("DROPTABLEIFEXISTSUSER_INF");//创建表statement.execute("CREATETABLEUSER_INF(idVARCHAR(50)PRIMARYKEY,nameVARCHAR(50)NOTNULL,sexVARCHAR(50)NOTNULL)");//插入数据statement.executeUpdate("INSERTINTOUSER_INFVALUES('1','程咬金','男')");statement.executeUpdate("INSERTINTOUSER_INFVALUES('2','孙尚香','女')");statement.executeUpdate("INSERTITOUSER_INFVALUES('3','monkey','male')");//查询数据ResultSetresultSet=statement.executeQuery("select*来自USER_INF&q不;);while(resultSet.next()){System.out.println(resultSet.getInt("id")+","+resultSet.getString("name")+","+resultSet.getString("sex"));}//关闭连接语句.close();conn.close();}}输出结果:1、程咬金,男2、孙尚香,女3、猴子,男h2作为嵌入式数据库应用你可以选择两种urls,第一种是内存模式运行,这种模式将数据暂时放在内存中,程序结束后数据表和数据会立即销毁,不再存在;第二种是使用本地文件的方式将数据持久化到文件中,当你再次连接数据库时,就可以获取到历史数据#首先,以内存方式运行jdbc:h2:mem:testDB#其次,使用本地文件模式jdbc:h2:file:./target/testDBh2也可以用作数据库服务器。它单独部署在服务器上。应用程序通过远程连接进行操作。连接方式如下:#连接语法jdbc:h2:tcp://[:]/[]#Example:jdbc:h2:tcp://localhost:8080/~/test如果想使用可视化客户端工具来访问和管理h2,可以通过它自己的网页来管理。下面以springboot项目为例,通过配置使用h2自带的管理页面进行维护。新建WebConfig类,配置h2的web控制台,如下:@ConfigurationpublicclassWebConfig{/***添加h2控制台的映射地址*@return*/@BeanServletRegistrationBeanh2servletRegistration(){ServletRegistrationBeanregistrationBean=newServletRegistrationBean(newWebServlet());registrationBean.addUrlMappings("/h2-console/*");returnregistrationBean;}}启动springboot项目,打开浏览器,输入http://127.0.0.1:8080/h2-console,进入管理页面!填写好连接地址、账号、密码后,Connect!在工作台上,可以编写sql语句进行查询,同时可以对查询结果进行编辑。5.性能测试上面我们介绍了三个数据库的使用。接下来我们将循环插入1000、10000、100000次操作来测试三个数据库的性能,看看它们的表现如何。从结果来看:derby和sqlite在性能上没有太大区别,但是随着插入次数的增加,derby略逊于sqlite。三者相比,h2的性能最好,无论是将数据写入内存还是写入数据库,性能都是最好的。6.总结作为一个嵌入式数据库,derby具有良好的性能和易用性。数据库存放在目录中,但只能在Java程序中使用。因为sqlite支持多种语言,所以也提供了大部分对SQL92的支持,执行效率也不错。作为嵌入式数据库使用最为广泛,但是如果要查询数据,只能本地连接,不能远程连接。作为嵌入式数据库的新秀,h2的主要优点是:超轻量级,可以支持内存模式,高效高速,可以支持基本的全文搜索,对mysql数据库的兼容性最强。最常用的场景是在开发环境中用于回归测试。