嵌入式数据库意味着该数据库集成为应用软件的一个不可分割部分。特别是使用JDBC驱动程序访问数据库的Java应用程序。 数据库引擎在应用程序运行时如运行在同一个JVM内部队列。存储就像任何库扩展,类似于连接至Java应用程序的jar文件。 最终用户感觉不到底层持久化存储的迹象。 然而,Java应用程序和数据库之间的交互行为执行与任何JDBC应用程序类似。本文探讨了在整合数据库引擎时,我们所能进行的选择和介绍了参与Java实际执行的一些复杂性事项。
内存数据库
一个嵌入式数据库不应该与一个内存数据库,如SQLite弄混。 在一个内存数据库,数据被完全存储在主存储器,能更快的响应没有永久的存储。 所以,在某种程度上,它可以说是一个没有磁盘的数据库。 这种类型的数据库是轻便,简单,快速,并配备了最基本的功能。
嵌入式数据库
在另一方面,嵌入式数据库由开发者集成至软件程序,且是以应用程序最终用户不可见的方式存在。不经意底层数据库,没有必要以任何外部接口分别保持该数据库。所以在这里,我们唯一感兴趣的是数据库引擎;如果其可以被嵌入并与应用程序运行,那就是一个嵌入式数据库应用程序。
图形1.' 嵌入式数据库的结构
使用嵌入式数据库的缺点是,除了数据库维护方面的困难外还有它的粘合性。 事实上,嵌入式数据库难以处理这些问题。 它完全适合应用程序,其专为需要存储库没有任何最终用户干预的事务。一个完全成熟的数据库管理器(如可在一个独立的RDBMS包中找到)是非常最小的或可能需要特殊情况。 然而,嵌入式数据库提供了时下非常复杂的功能,且几乎可以做数据库系统所预期的所有事项。 其可以在客户机/服务器应用程序中使用,并只需对JDBC连接进行稍微的改变。
独立数据库
这是相对于独立的数据库模型,其中提供了一种专用的管理器来处理维护问题。然而,通常这是从名字本身感知,如关系型数据库管理系统,因为其的着重点是提供了与数据库交互的接口管理器。客户端/服务器数据库是独立的,显然是最强大和最重量级的。顺便说一句,他们都是重量级的不是因为数据内容而是因为作为数据库的额外流程。现在,去除这些进程,并使用只有数据库引擎;这就是嵌入式数据库的核心关注。
我们有什么选择?
在某种程度上,类型是存在的危机。不过,可以肯定应用实用主义,因为每个人都有自己的优点和缺点。具体要求的实用主义,虽然基础功能都是一样的。 这有几个主要的供应商如H2,HyperSQL,Apache Derby,Berkley DB,Java DB,ObjectDB,等等。
HyperSQL符合SQL:2011标准和JDBC 4规范,并支持从现代的关系型数据库至每个经典的特征。它可以在嵌入式和服务器模式中运行。该数据库是相当稳定的,且可通过开源项目如OpenOffice和LibreOffice作为一个嵌入式后端持久性引擎。版本2.3.x开始支持两阶段以及多版本并发控制(MVCC)机制的锁定。而HyperSQL可被创建在Java中,它可无缝运行在JVM中,提供一个用于数据访问的JDBC接口。该软件包包含其中所需组件的/ lib目录下名为hsqldb.jar的一个jar文件:RDBMS的HyperSQL引擎和JDBC驱动程序在Java应用程序中嵌入HyperSQL。
连接可以按如下方式进行连接:
Connection c = DriverManager.getConnection
("jdbc:hsqldb:file:/home/mano/testdb",
"u1", "123");
ObjectDB还配备两种形式:客户端/服务器和嵌入式模式。但是,这是一个与关系型数据库不同的品种。它是一个内置支持JPA2规范的面向对象数据库。其结果是,使用一个像Hibernate的抽象有比任何其它数据库更好的性能。顺便说一句,因为它默认支持JPA,使用一个ORM简单层可以消除杠杆表现。
Java DB和Apache Derby是非常相似;事实上,Java DB是建立在Derby数据库引擎上的。 它是完全用Java写的,并且可以紧密地嵌入至任何Java应用程序。所有关系型数据库的标准功能都支持Derby。 它可以简单的以嵌入模式或是以网络服务器模式进行部署。 嵌入一个Derby数据库到Java应用程序,包括命名的derby.jar jar文件位于/ lib目录下。 该文件包含了数据库引擎和JDBC驱动程序组件从Java代码中访问数据库。
一个简单的举例
让我们来看看如何嵌入一个Derby数据库在Java应用程序内的简单例子:
package org.mano.example;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.derby.jdbc.EmbeddedDriver;
public class EmbeddedDatabaseDemo {
public static void main(String[] args) {
EmbeddedDatabaseDemo e =
new EmbeddedDatabaseDemo();
e.testDerby();
}
public void testDerby() {
Connection conn = null;
PreparedStatement pstmt;
Statement stmt;
ResultSet rs = null;
String createSQL = "create table person ("
+ "id integer not null generated always as"
+ " identity (start with 1, increment by 1), "
+ "name varchar(30) not null, email varchar(30),
phone varchar(10),"
+ "constraint primary_key primary key (id))";
try {
Driver derbyEmbeddedDriver = new EmbeddedDriver();
DriverManager.registerDriver(derbyEmbeddedDriver);
conn = DriverManager.getConnection
("jdbc:derby:testdb1;create=true", "pass123");
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.execute(createSQL);
pstmt = conn.prepareStatement("insert into person
(name,email,phone) values(?,?,?)");
pstmt.setString(1, "Hagar the Horrible");
pstmt.setString(2, "hagar@somewhere.com");
pstmt.setString(3, "1234567890");
pstmt.executeUpdate();
rs = stmt.executeQuery("select * from person");
while (rs.next()) {
System.out.printf("%d %s %s %s\n",
rs.getInt(1), rs.getString(2),
rs.getString(3), rs.getString(4));
}
stmt.execute("drop table person");
conn.commit();
} catch (SQLException ex) {
System.out.println("in connection" + ex);
}
try {
DriverManager.getConnection
("jdbc:derby:;shutdown=true");
} catch (SQLException ex) {
if (((ex.getErrorCode() == 50000) &&
("XJ015".equals(ex.getSQLState())))) {
System.out.println("Derby shut down
normally");
} else {
System.err.println("Derby did not shut down
normally");
System.err.println(ex.getMessage());
}
}
}
}
结论
Java嵌入式数据库的工作类似于在客户机/服务器模式下创建一个老式JDBC应用程序。 同样,其在数据库的访问机制中没有差异。 附带的数据库,其中包括jar文件,包含所有CRUD操作的必要组件。
内存数据库
一个嵌入式数据库不应该与一个内存数据库,如SQLite弄混。 在一个内存数据库,数据被完全存储在主存储器,能更快的响应没有永久的存储。 所以,在某种程度上,它可以说是一个没有磁盘的数据库。 这种类型的数据库是轻便,简单,快速,并配备了最基本的功能。
嵌入式数据库
在另一方面,嵌入式数据库由开发者集成至软件程序,且是以应用程序最终用户不可见的方式存在。不经意底层数据库,没有必要以任何外部接口分别保持该数据库。所以在这里,我们唯一感兴趣的是数据库引擎;如果其可以被嵌入并与应用程序运行,那就是一个嵌入式数据库应用程序。
![嵌入式数据库的结构 嵌入式数据库的结构](https://i-blog.csdnimg.cn/blog_migrate/8a7302c200cee4f8e82d5b1fddc61f6a.jpeg)
图形1.' 嵌入式数据库的结构
使用嵌入式数据库的缺点是,除了数据库维护方面的困难外还有它的粘合性。 事实上,嵌入式数据库难以处理这些问题。 它完全适合应用程序,其专为需要存储库没有任何最终用户干预的事务。一个完全成熟的数据库管理器(如可在一个独立的RDBMS包中找到)是非常最小的或可能需要特殊情况。 然而,嵌入式数据库提供了时下非常复杂的功能,且几乎可以做数据库系统所预期的所有事项。 其可以在客户机/服务器应用程序中使用,并只需对JDBC连接进行稍微的改变。
独立数据库
这是相对于独立的数据库模型,其中提供了一种专用的管理器来处理维护问题。然而,通常这是从名字本身感知,如关系型数据库管理系统,因为其的着重点是提供了与数据库交互的接口管理器。客户端/服务器数据库是独立的,显然是最强大和最重量级的。顺便说一句,他们都是重量级的不是因为数据内容而是因为作为数据库的额外流程。现在,去除这些进程,并使用只有数据库引擎;这就是嵌入式数据库的核心关注。
我们有什么选择?
在某种程度上,类型是存在的危机。不过,可以肯定应用实用主义,因为每个人都有自己的优点和缺点。具体要求的实用主义,虽然基础功能都是一样的。 这有几个主要的供应商如H2,HyperSQL,Apache Derby,Berkley DB,Java DB,ObjectDB,等等。
HyperSQL符合SQL:2011标准和JDBC 4规范,并支持从现代的关系型数据库至每个经典的特征。它可以在嵌入式和服务器模式中运行。该数据库是相当稳定的,且可通过开源项目如OpenOffice和LibreOffice作为一个嵌入式后端持久性引擎。版本2.3.x开始支持两阶段以及多版本并发控制(MVCC)机制的锁定。而HyperSQL可被创建在Java中,它可无缝运行在JVM中,提供一个用于数据访问的JDBC接口。该软件包包含其中所需组件的/ lib目录下名为hsqldb.jar的一个jar文件:RDBMS的HyperSQL引擎和JDBC驱动程序在Java应用程序中嵌入HyperSQL。
连接可以按如下方式进行连接:
Connection c = DriverManager.getConnection
("jdbc:hsqldb:file:/home/mano/testdb",
"u1", "123");
ObjectDB还配备两种形式:客户端/服务器和嵌入式模式。但是,这是一个与关系型数据库不同的品种。它是一个内置支持JPA2规范的面向对象数据库。其结果是,使用一个像Hibernate的抽象有比任何其它数据库更好的性能。顺便说一句,因为它默认支持JPA,使用一个ORM简单层可以消除杠杆表现。
Java DB和Apache Derby是非常相似;事实上,Java DB是建立在Derby数据库引擎上的。 它是完全用Java写的,并且可以紧密地嵌入至任何Java应用程序。所有关系型数据库的标准功能都支持Derby。 它可以简单的以嵌入模式或是以网络服务器模式进行部署。 嵌入一个Derby数据库到Java应用程序,包括命名的derby.jar jar文件位于/ lib目录下。 该文件包含了数据库引擎和JDBC驱动程序组件从Java代码中访问数据库。
一个简单的举例
让我们来看看如何嵌入一个Derby数据库在Java应用程序内的简单例子:
package org.mano.example;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.derby.jdbc.EmbeddedDriver;
public class EmbeddedDatabaseDemo {
public static void main(String[] args) {
EmbeddedDatabaseDemo e =
new EmbeddedDatabaseDemo();
e.testDerby();
}
public void testDerby() {
Connection conn = null;
PreparedStatement pstmt;
Statement stmt;
ResultSet rs = null;
String createSQL = "create table person ("
+ "id integer not null generated always as"
+ " identity (start with 1, increment by 1), "
+ "name varchar(30) not null, email varchar(30),
phone varchar(10),"
+ "constraint primary_key primary key (id))";
try {
Driver derbyEmbeddedDriver = new EmbeddedDriver();
DriverManager.registerDriver(derbyEmbeddedDriver);
conn = DriverManager.getConnection
("jdbc:derby:testdb1;create=true", "pass123");
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.execute(createSQL);
pstmt = conn.prepareStatement("insert into person
(name,email,phone) values(?,?,?)");
pstmt.setString(1, "Hagar the Horrible");
pstmt.setString(2, "hagar@somewhere.com");
pstmt.setString(3, "1234567890");
pstmt.executeUpdate();
rs = stmt.executeQuery("select * from person");
while (rs.next()) {
System.out.printf("%d %s %s %s\n",
rs.getInt(1), rs.getString(2),
rs.getString(3), rs.getString(4));
}
stmt.execute("drop table person");
conn.commit();
} catch (SQLException ex) {
System.out.println("in connection" + ex);
}
try {
DriverManager.getConnection
("jdbc:derby:;shutdown=true");
} catch (SQLException ex) {
if (((ex.getErrorCode() == 50000) &&
("XJ015".equals(ex.getSQLState())))) {
System.out.println("Derby shut down
normally");
} else {
System.err.println("Derby did not shut down
normally");
System.err.println(ex.getMessage());
}
}
}
}
结论
Java嵌入式数据库的工作类似于在客户机/服务器模式下创建一个老式JDBC应用程序。 同样,其在数据库的访问机制中没有差异。 附带的数据库,其中包括jar文件,包含所有CRUD操作的必要组件。