H2 数据库引擎

来源:互联网 发布:rar64解压软件下载 编辑:程序博客网 时间:2024/05/17 07:50

分类: 数据库 Hibernate jquery easyui solr 2265人阅读 评论(0) 收藏 举报

 

目录(?)[-]

  1. 需求
    1. 数据库引擎
    2. H2控制台
  2. 支持的平台
  3. 安装软件
  4. 目录结构
    1. 添加数据库驱动程序
    2. 使用H2控制台
    3. 将表名或列名
    4. 断开并停止应用程序
  5. 特别H2控制台语法
  6. H2控制台的设置
  7. 使用JDBC连接到数据库
  8. 创建新的数据库
  9. 使用服务器
    1. 启动服务器命令行工具
    2. 连接到TCP服务器
    3. 启动TCP服务器内的一个应用
    4. 从另一个进程停止TCP服务器
  10. 使用Hibernate
  11. 使用TopLink和Glassfish
  12. 使用的EclipseLink
  13. 使用Apache ActiveMQ的
  14. 在NetBeans中使用H2
  15. 使用H2 jOOQ
  16. 在Web应用程序中使用数据库
    1. 嵌入模式
    2. 服务器模式
    3. 使用Servlet监听器启动和停止数据库
    4. 使用H2控制台的Servlet
  17. Android的
  18. CSV逗号分隔值的支持
    1. 在一个数据库中读取一个CSV文件
    2. 从CSV文件导入数据
    3. 在一个数据库中写一个CSV文件
    4. 写一个CSV文件的Java应用程序
    5. 从Java应用程序中读取一个CSV文件
  19. 升级备份和恢复
    1. 数据库升级
    2. 备份使用的脚本工具
    3. 从脚本中恢复
    4. 在线备份
  20. 命令行工具
  21. 外壳工具
  22. 使用OpenOffice基地
  23. Java Web Start的 JNLP
  24. 使用连接池
  25. 全文检索
    1. 使用本机的全文检索
    2. 使用Lucene的全文检索
  26. 用户定义的变量
  27. 日期和时间
  28. 使用Spring
    1. 使用TCP服务器
    2. 错误代码不兼容
  29. Java管理扩展JMX
 

最近项目中有用H2做嵌入式数据库 感觉很不错像大家介绍一下

  H2特点:

  • 非常快的,开放的源代码,JDBC API
  • 嵌入式和服务器模式,内存数据库,
  • 基于浏览器的控制台应用程序
  • 占地面积小:约1 MB jar文件的大小

 

需求

要运行该数据库,软件协议栈是众所周知的工作。其他软件最有可能也可以工作,但还没有测试一样多。

数据库引擎

  • Windows XP或Vista,Mac OS X中,或Linux
  • Sun的JDK 1.5或更高版本(使用了Retroweaver转换为JDK 1.4应该工作,但没有定期测试)
  • 推荐的Windows文件系统:NTFS(FAT32只支持到4 GB的文件)

H2控制台

  • Mozilla Firefox浏览器

支持的平台

这个数据库是用Java编写的,它可以运行在许多不同的平台上。它与Java 1.5和1.6进行测试,但也可以使用GCJ编译为本地代码。源代码不使用的Java 1.6的功能。目前,该数据库的开发和测试Windows XP和Mac OS X上使用Sun JDK 1.6,但它也可以在许多其他的操作系统,并使用其他的Java运行时环境。支持所有主要的操作系统(Windows XP中,Windows Vista中,Windows 7中,MAC OS,Ubuntu的,...)。

安装软件

要安装该软件,运行安装程序,或将其解压缩到您选择的目录。

目录结构

安装完成后,你应该得到如下的目录结构:

目录内容binJAR文件和批处理文件docs文档docs/htmlHTML页面docs/javadocJavadoc文件ext外部的依赖关系(在编译时下载)service作为Windows服务运行数据库的工具src源文件src/docsrc文档来源src/installer安装,外壳,并释放构建脚本src/main数据库引擎的源代码src/test测试源代码src/tools

 

 

添加数据库驱动程序

 

要注册的JDBC驱动程序(支持MySQL,PostgreSQL,HSQLDB,...),添加的jar文件名的环境变量 H2DRIVERSCLASSPATH例:添加HSQLDB JDBC驱动程序(Windows)中C:\Programs\hsqldb\lib\hsqldb.jar设置环境变量 H2DRIVERSC:\Programs\hsqldb\lib\hsqldb.jar

可以设置多个驱动程序条目需要分开 ; (Windows)或 :(其他操作系统)。支持的路径名中的空格。这些设置必须没有被引用。

使用H2控制台

H2控制台应用程序有三个主要的面板顶部的工具栏上,在左边的树,面板右侧的查询/结果。在左边列出的数据库对象(例如表)。在查询面板,并点击[运行],输入一个SQL命令。结果出现下面的命令。

将表名或列名

要插入到脚本中的表名和列名,单击树中的项目。如果你点击了一个表,而查询是空的,然后SELECT * FROM ...被添加。键入查询时,所使用的表,在树中展开。例如,如果您键入SELECT * FROM TEST T WHERE T. 然后对表TEST扩大。

断开并停止应用程序

要登录的数据库,在工具栏面板中单击[断开]。然而,服务器仍然在运行,随时准备接受新的会话。

要停止服务器,右键单击系统托盘上的图标,并选择[退出]。如果你没有在系统托盘图标,导航到[首选项],然后单击[关闭],按[Ctrl]键+ [C]在控制台服务器开始(Windows)中,或关闭控制台窗口。

特别H2控制台语法

H2控制台支持一些内置的命令。这些解释在H2控制台,使他们的工作与任何数据库。内建命令需要在开始的一份声明中(之前任何言论),否则他们不会正确地分析。如有疑问,请添加; 之前的命令。

命令(S)描述@autocommit_true;
@autocommit_false;启用或禁用自动提交。 @cancel;取消目前正在执行的语句。 @columns null null TEST;
@index_info null null TEST;
@tables;
@tables null null TEST;调用相应的 DatabaseMetaData.get方法。模式是区分大小写的(通常标识符都为大写)。有关参数的详细信息,请参阅Javadoc文档。该行结束时缺少的参数都设置为null。元数据命令的完整列表是:@attributes, @best_row_identifier, @catalogs, @columns, @column_privileges, @cross_references, @exported_keys, @imported_keys, @index_info, @primary_keys, @procedures, @procedure_columns, @schemas, @super_tables, @super_types, @tables, @table_privileges, @table_types, @type_info, @udts, @version_columns @edit select * from test;使用一个可更新的结果集。 @generated insert into test() values();显示的结果 Statement.getGeneratedKeys()@history;列出的命令历史记录。 @info;显示的各种结果 ConnectionDatabaseMetaData 方法。 @list select * from test;显示以列表格式的结果集(每列上自己的路线,与行号)。 @loop 1000 select ?, ?/*rnd*/;
@loop 1000 @statement select ?;运行该语句很多次。参数(?)被设置使用一个循环从0到x - 1。随机值被用于每一个?/*rnd*/如果一个PreparedStatement代替Statement对象@statement被使用。结果集被读取,直到ResultSet.next() 回报 false时序信息被打印出来。@maxrows 20;设置要显示的行的最大数量。 @memory;显示使用和释放内存。这将调用System.gc()@meta select 1;列出 ResultSetMetaData 在运行查询。 @parameter_meta select ?;显示的结果 PreparedStatement.getParameterMetaData()通话。语句不执行。@prof_start;
call hash('SHA256', '', 1000000);
@prof_stop;启动/停止内置的分析工具。居前3位的堆栈跟踪列出的启动和停止的声明(S)之间的(如果有)。@prof_stop;
@sleep 10;
@prof_stop;睡眠的秒数。用于分析长时间运行的查询或操作,在另一个会话中运行(但在同一进程中)。@transaction_isolation;
@transaction_isolation 2;显示(不带参数)或改变(参数1,2,4,8)的事务隔离级别。

H2控制台的设置

的H2控制台的设置被存储在一个配置文件叫 .h2.server.properties在您的用户主目录。对于Windows安装,通常是用户的home目录C:\Documents and Settings\[username]配置文件中包含的应用程序的设置,并自动H2控制台第一次启动时创建的。支持设置如下:

  • webAllowOthers允许其他计算机连接。
  • webPort:港口的H2控制台
  • webSSL:使用加密(HTTPS)连接。

除了这些设置中的最近使用的连接的属性的表格中列出的 <number>=<name>|<driver>|<url>|<user> 使用转义字符 \示例:1=Generic H2 (Embedded)|org.h2.Driver|jdbc\:h2\:~/test|sa

使用JDBC连接到数据库

要连接到数据库,Java应用程序首先需要加载数据库驱动程序,然后得到一个连接。一个简单的方法做到这一点是使用下面的代码:

import java.sql.*;public class Test {    public static void main(String[] a)            throws Exception {        Class.forName("org.h2.Driver");        Connection conn = DriverManager.            getConnection("jdbc:h2:~/test", "sa", "");        // add application code here        conn.close();    }}

此代码首先加载驱动程序(Class.forName(...)),然后打开一个连接(使用 DriverManager.getConnection())。驱动程序名称"org.h2.Driver"数据库URL总是需要开始jdbc:h2:由这个数据库确认。的第二个参数的getConnection() 呼叫的用户名(sa在这个例子中的系统管理员)。第三个参数是密码。在这个数据库中,用户名不区分大小写,但密码是。

创建新的数据库

默认情况下,如果在URL中指定的数据库不存在,将自动创建一个新的(空的)数据库。自动创建的数据库的用户成为该数据库的管理员。

自动创建新的数据库可以被禁用,打开一个数据库,只有当它已经存在

使用服务器

H2目前支持三种服务器:Web服务器(H2控制台),TCP服务器(客户端/服务器连接)和PG服务器(PostgreSQL的客户端)。请注意,只有在Web服务器支持的浏览器连接。服务器可以开始以不同的方式,一种是使用Server工具。启动服务器并打开一个数据库 - 数据库,尽快打开客户端连接。

启动服务器命令行工具

要启动 Server 使用默认设置的命令行工具,运行以下命令:

java -cp h2*.jar org.h2.tools.Server

这将启动该工具的默认选项。,要想列出的选项和缺省值,运行以下命令:

java -cp h2*.jar org.h2.tools.Server -?

有选择使用其他端口,启动或不启动零件。

连接到TCP服务器

远程连接到数据库使用的TCP服务器,请使用以下驱动程序和数据库URL:

  • JDBC驱动程序类: org.h2.Driver
  • 数据库URL: jdbc:h2:tcp://localhost/~/test

对于有关数据库的URL的详细信息,请参阅特点。请注意,您不能连接到这个URL与Web浏览器。您可以使用H2客户端(通过JDBC)连接。

启动TCP服务器内的一个应用

也可以从一个应用程序的启动和停止服务器。示例代码:

import org.h2.tools.Server;...// start the TCP ServerServer server = Server.createTcpServer(args).start();...// stop the TCP Serverserver.stop();

从另一个进程停止TCP服务器

TCP服务器可以从另一个进程停止。要停止服务器的命令行,运行以下命令:

java org.h2.tools.Server -tcpShutdown tcp://localhost:9092

要停止服务器从用户应用程序,使用下面的代码:

org.h2.tools.Server.shutdownTcpServer("tcp://localhost:9094");

此功能只阻止TCP服务器。如果其他的服务器在同一个进程开始,他们将继续运行。为了避免恢复当数据库被打开,下一次,在调用此方法之前,应关闭所有连接到数据库。要停止远程服务器,必须启用远程连接到服务器上。关闭一个TCP服务器,可以使用该选项来保护-tcpPassword (TCP服务器来启动和停止,必须使用相同的密码)。

使用Hibernate

该数据库所支持的Hibernate版本3.1和更高版本。您可以使用的的HSQLDB话,或本机H2方言。不幸的是,H2的方言包括在一些老版本的Hibernate是越野车。对Hibernate的一个补丁已经提交,现在的应用。您可以重命名为H2Dialect.java ,包括在你的应用程序作为一个修补程序,或升级到Hibernate的一个版本,这是固定的。

当使用Hibernate时,尝试使用 H2Dialect如果可能的话。当使用H2Dialect,兼容性模式,如 MODE=MySQL不支持。当使用这种兼容模式下,使用Hibernate的方言相应的数据库,而不是H2Dialect但请注意H2不支持的所有数据库的所有功能。

使用TopLink和Glassfish

要使用H2与GlassFish(或Sun AS),设置数据源类名称 org.h2.jdbcx.JdbcDataSource您可以将其设置在的GUI应用服务器 - 资源 - JDBC - 连接池,或通过编辑文件sun-resources.xml:元素 jdbc-connection-pool,设置属性 datasource-classnameorg.h2.jdbcx.JdbcDataSource

的H2数据库兼容的HSQLDB和PostgreSQL。要充分利用H2的特定功能,使用H2Platform这个平台的源代码包含在H2src/tools/oracle/toplink/essentials/platform/database/DatabasePlatform.java.txt您将需要复制该文件到您的应用程序,并重新命名它的。java。要启用它,更改以下设置在persistence.xml:

<property    name="toplink.target-database"    value="oracle.toplink.essentials.platform.database.H2Platform"/>

在旧版本的Glassfish的,属性名 toplink.platform.class.name

要使用内Glassfish的H2,H2 *。jar文件的目录复制 glassfish/glassfish/lib

使用的EclipseLink

要使用H2的EclipseLink,使用该平台类 org.eclipse.persistence.platform.database.H2Platform如果这个平台是不可用的EclipseLink的版本,你可以使用OraclePlatform,而不是在许多情况下。请参阅H2Platform者

使用Apache ActiveMQ的

当使用H2作为后端数据库,Apache ActiveMQ的,请使用 TransactDatabaseLocker而不是默认的锁定机制。否则,数据库文件将无限增长。问题是,默认的锁定机制使用未UPDATE交易,这使事务日志萎缩(将导致数据库文件增长)。而不是使用一个UPDATE 声明中, TransactDatabaseLocker 使用 SELECT ... FOR UPDATE这是没有问题的。要使用它,改变是把ApacheMQ的配置元素<jdbcPersistenceAdapter> 元素,属性 databaseLocker="org.apache.activemq.store.jdbc.adapter.TransactDatabaseLocker"然而,使用MVCC模式将再次导致同样的问题。因此,请不要在这种情况下,使用MVCC模式。另一个(更危险)的解决办法是设置useDatabaseLock 为false。

在NetBeans中使用H2

该项目H2数据库引擎支持NetBeans让你在IDE启动和停止H2服务器。

这是一个已知的问题时,使用NetBeans SQL执行窗口:在执行查询之前,另一个查询的形式 SELECT COUNT(*) FROM <query>被执行。这是一个问题的查询,修改状态,如SELECT SEQ.NEXTVAL在这种情况下,两个序列的值被分配,而不是仅仅一个。

使用H2 jOOQ

jOOQ增加了一层薄薄的JDBC上,让类型安全的SQL结构,包括先进的SQL,存储过程和高级数据类型。jOOQ您的数据库架构为基础的代码生成。如果这就是你们的榜样架构:

CREATE TABLE USER (ID INT, NAME VARCHAR(50));

然后运行jOOQ代码生成器在命令行上使用这个命令:

java -cp jooq.jar;jooq-meta.jar;jooq-codegen.jar;h2-1.3.158.jar;.org.jooq.util.GenerationTool /codegen.xml

......在这里, codegen.xml 在classpath中包含此信息

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-2.3.0.xsd">    <jdbc>        <driver>org.h2.Driver</driver>        <url>jdbc:h2:~/test</url>        <user>sa</user>        <password></password>    </jdbc>    <generator>        <name>org.jooq.util.DefaultGenerator</name>        <database>            <name>org.jooq.util.h2.H2Database</name>            <includes>.*</includes>            <excludes></excludes>            <inputSchema>PUBLIC</inputSchema>        </database>        <generate></generate>        <target>            <packageName>org.jooq.h2.generated</packageName>            <directory>./src</directory>        </target>    </generator></configuration>

使用生成的源代码,您可以查询数据库,如下所示:

Factory create = new H2Factory(connection);Result<UserRecord> result =create.selectFrom(USER)    .where(NAME.like("Johnny%"))    .orderBy(ID)    .fetch();

查看更多详细信息jOOQ首页jOOQ教程

在Web应用程序中使用数据库

有很多种方法来访问数据库在Web应用程序中。下面是一些例子,如果你使用的是Tomcat或JBoss。

嵌入模式

(目前)最简单的解决方法是使用数据库中的嵌入模式,这意味着在您的应用程序中打开一个连接(一个很好的解决方案是使用一个Servlet监听器在启动时,见下文),或当一个会话开始。一个数据库可以同时访问多个会话和应用程序,只要它们运行在同一进程中。Servlet容器(例如Tomcat)只使用一个进程,所以这是没有问题的(除非你在集群模式下运行Tomcat)。Tomcat使用了​​多线程和多类加载器。如果多个应用程序同时访问同一个数据库,你需要将数据库jar中的shared/libserver/lib目录。这是一个好主意,在web应用启动时打开数据库,并关闭它时,Web应用程序停止。如果使用多个应用程序,只有一个人(任何)需要做到这一点。在应用中,一个思路,就是使用每一个连接会话,或者甚至每一个连接请求(行动)。如果可能的话,使用后应关闭这些连接(但它不是坏的,如果他们没有得到关闭)。

服务器模式

服务器模式是相似的,但它可以让你在另一个进程中运行的服务器。

使用Servlet监听器启动和停止数据库

H2 *。jar文件添加到您的Web应用程序,下面的代码片断添加到你的web.xml文件(在 context-paramfilter 部分):

<listener>    <listener-class>org.h2.server.web.DbStarter</listener-class></listener>

有关如何访问数据库的详细信息,请参阅文件 DbStarter.java默认情况下,这个工具使用数据库URL打开一个嵌入的连接jdbc:h2:~/test用户名 sa和密码 sa如果你想在你的servlet中使用此连接,您可以访问如下:

Connection conn = getServletContext().getAttribute("connection");

DbStarter还可以启动TCP服务器,但是在默认情况下是禁用的。要启用它,使用该参数db.tcpServer 在该文件中 web.xml下面是完整的选项列表。这些选项需要被放置在description 标签和 listener / filter 标签:

<context-param>    <param-name>db.url</param-name>    <param-value>jdbc:h2:~/test</param-value></context-param><context-param>    <param-name>db.user</param-name>    <param-value>sa</param-value></context-param><context-param>    <param-name>db.password</param-name>    <param-value>sa</param-value></context-param><context-param>    <param-name>db.tcpServer</param-name>    <param-value>-tcpAllowOthers</param-value></context-param>

当web应用程序停止时,将自动关闭数据库连接。如果TCP服务器内开始DbStarter,它也将被自动停止。

使用H2控制台的Servlet

H2控制台是一个独立的应用程序,包括它自己的Web服务器,但它可以作为一个servlet作为。要做到这一点,包括了h2*.jar 在您的应用程序文件,并添加下面的配置到您的 web.xml

<servlet>    <servlet-name>H2Console</servlet-name>    <servlet-class>org.h2.server.web.WebServlet</servlet-class>    <!--    <init-param>        <param-name>webAllowOthers</param-name>        <param-value></param-value>    </init-param>    <init-param>        <param-name>trace</param-name>        <param-value></param-value>    </init-param>    -->    <load-on-startup>1</load-on-startup></servlet><servlet-mapping>    <servlet-name>H2Console</servlet-name>    <url-pattern>/console/*</url-pattern></servlet-mapping>

有关详细信息,请参阅也 src/tools/WEB-INF/web.xml

要创建一个Web应用程序只用H2控制台,运行以下命令:

build warConsole

Android的

您可以使用这个数据库,而不是或除了SQLite的Andr​​oid设备上使用的Dalvik VM。到目前为止,只有极少数测试和基准测试运行,但它似乎SQLite的性能是类似的,除了打开和关闭数据库,该数据库尚未优化的H2(H2大约需要0.2秒,和SQLite约0.02秒) 。读操作似乎有点快比SQLite,和写操作似乎要慢一些。到目前为止,只有极少数的测试运行,一切似乎都如预期般运作。全文搜索还没有测试,但是本机的全文搜索工作。

使用H2,而不是SQLite的原因是:

  • 完整的Unicode支持,包括UPPER()和LOWER()。
  • BLOB和CLOB数据流API。
  • 全文搜索。
  • 多个连接。
  • 用户自定义函数和触发器。
  • 数据库文件进行加密。
  • 读取和写入CSV文件(可以使用此功能在数据库也一样)。
  • 参照完整性和检查约束。
  • 更好的数据类型和SQL的支持。
  • 在内存数据库,只读数据库,链接表。
  • 与其他数据库,从而简化了移植应用程序更好的兼容性。
  • 可能是更好的性能(到目前为止的读操作)。
  • 服务器模式(不同的机器上通过TCP / IP访问数据库)。

目前只支持JDBC API(它计划在将来的版本中支持Android数据库API)。定期H2 jar文件和较小的h2small-*.jar都可以使用。为了创建更小的jar文件,运行命令./build.sh jarSmall (Linux / Mac机的OS)或 build.bat jarSmall (Windows)中。

数据库文件需要被存储在一个地方,是为应用程序访问。示例:

String url = "jdbc:h2:/data/data/" +    "com.example.hello" +    "/data/hello" +    ";FILE_LOCK=FS" +    ";PAGE_SIZE=1024" +    ";CACHE_SIZE=8192";Class.forName("org.h2.Driver");conn = DriverManager.getConnection(url);...

限制:目前不支持使用连接池,因为要求 javax.sql. 在Android的类。

CSV(逗号分隔值)的支持

支持CSV文件可以用于在数据库中使用的功能 CSVREADCSVWRITE,或者它可以用来作为一个独立的工具以外的数据库。

在一个数据库中读取一个CSV文件

使用该函数可以读取一个CSV文件 CSVREAD示例:

SELECT * FROM CSVREAD('test.csv');

请注意,对于性能的原因, CSVREAD不应使用内部联接。相反,先导入数据(可能是到一个临时表),如果有必要,创建所需的索引,然后查询该表。

从CSV文件导入数据

一种快速的方式来加载或从一个CSV文件导入数据(有时也被称为“批量加载”)是结合创建表的进口。(可选),列名和数据类型可以在创建表时设置。另一种选择是使用INSERT INTO ... SELECT

CREATE TABLE TEST AS SELECT * FROM CSVREAD('test.csv');CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))    AS SELECT * FROM CSVREAD('test.csv');

在一个数据库中写一个CSV文件

内置的功能 CSVWRITE可用于从查询创建一个CSV文件。示例:

CREATE TABLE TEST(ID INT, NAME VARCHAR);INSERT INTO TEST VALUES(1, 'Hello'), (2, 'World');CALL CSVWRITE('test.csv', 'SELECT * FROM TEST');

写一个CSV文件的Java应用程序

Csv工具可以被用来在一个Java应用程序中,即使不使用在所有数据库。示例:

import java.sql.*;import org.h2.tools.Csv;import org.h2.tools.SimpleResultSet;public class TestCsv {    public static void main(String[] args) throws Exception {        SimpleResultSet rs = new SimpleResultSet();        rs.addColumn("NAME", Types.VARCHAR, 255, 0);        rs.addColumn("EMAIL", Types.VARCHAR, 255, 0);        rs.addRow("Bob Meier", "bob.meier@abcde.abc");        rs.addRow("John Jones", "john.jones@abcde.abc");        new Csv().write("data/test.csv", rs, null);    }}

从Java应用程序中读取一个CSV文件

不打开一个数据库的情况下,它可以读取CSV文件。示例:

import java.sql.*;import org.h2.tools.Csv;public class TestCsv {    public static void main(String[] args) throws Exception {        ResultSet rs = new Csv().read("data/test.csv", null, null);        ResultSetMetaData meta = rs.getMetaData();        while (rs.next()) {            for (int i = 0; i < meta.getColumnCount(); i++) {                System.out.println(                    meta.getColumnLabel(i + 1) + ": " +                    rs.getString(i + 1));            }            System.out.println();        }        rs.close();    }}

升级,备份和恢复

数据库升级

从一个版本的数据库引擎升级到下一个版本的推荐方法是创建一个备份的数据库的SQL脚本的形式使用旧的引擎,然后再执行SQL脚本中使用的新引擎。

备份使用的脚本工具

备份一个数据库的推荐方法是创建一个压缩的SQL脚本文件。这将导致一个小的,人类可读的,和数据库版本独立的备份。创建脚本也将验证数据库文件的校验和。Script 工具运行如下:

java org.h2.tools.Script -url jdbc:h2:~/test -user sa -script test.zip -options compression zip

另外,也可以使用SQL命令 SCRIPT创建备份的数据库。欲了解更多有关选项的信息,请参阅SQL命令SCRIPT备份可以远程完成,但该文件将被创建在服务器端。内置的FTP服务器可用于从服务器检索文件。

从脚本中恢复

要恢复的数据库从SQL脚本文件,您可以使用 RunScript 工具:

java org.h2.tools.RunScript -url jdbc:h2:~/test -user sa -script test.zip -options compression zip

欲了解更多有关选项的信息,请参阅SQL命令 RUNSCRIPT可以远程恢复,但该文件需要在服务器端。内置的FTP服务器可用于将文件复制到服务器。另外,也可以使用SQL命令RUNSCRIPT执行一个SQL脚本。SQL脚本文件可能包含其他脚本文件的形式,RUNSCRIPT的命令。然而,当使用服务器模式,引用脚本文件,需要在服务器端。

在线备份

BACKUP SQL语句和 Backup工具创建的数据库文件的zip文件。但是,这个文件的内容是人类可读的。

产生的备份是事务性一致,这意味着一致性和原子规则。

BACKUP TO 'backup.zip'

Backup 工具(org.h2.tools.Backup)不能被用于创建一个在线备份数据库必须未在使用中同时运行此程序。

创建复制数据库文件的备份是在数据库运行时不被支持,但如果文件系统支持创建快照。与其他文件系统,它不能保证数据以正确的顺序被复制。

命令行工具

该数据库自带的一些命令行工具。为了获得更多的信息的工具,它开始与参数' - ',例如:

java -cp h2*.jar org.h2.tools.Backup -?

命令行工具:

  • Backup 创建一个备份的数据库。
  • ChangeFileEncryption 允许改变文件的加密密码算法的数据库。
  • Console 根据H2控制台启动浏览器。
  • ConvertTraceFile 转换。trace.db文件到Java应用程序和SQL脚本。
  • CreateCluster 从一个独立的数据库中创建一个集群。
  • DeleteDbFiles 属于一个数据库中删除的所有文件。
  • Recover 有助于恢复损坏的数据库。
  • Restore 恢复备份的数据库。
  • RunScript 对数据库运行SQL脚本。
  • Script 允许将一个数据库备份或迁移到SQL脚本。
  • Server 用于在服务器模式中启动一个H2服务器。
  • Shell 是一个命令行的数据库工具。

的工具,也可以从应用程序中调用通过调用主或其他公共方法。有关详细信息,请参阅Javadoc文档。

外壳工具

外壳工具是一个简单的交互式命令行工具。要启动它,请键入:

java -cp h2*.jar org.h2.tools.Shell

您将被要求提供数据库URL,JDBC驱动程序,用户名和密码。作为命令行参数,也可以设置连接设置。连接后,你会得到列表中选择。内置的命令并不需要以分号结束,但只执行SQL语句,如果该行以一个分号结束;这允许输入多行语句:

sql> select * from test...> where id = 0;

默认情况下,打印结果为表。对于多列的结果,考虑使用列表模式:

sql> listResult list mode is now onsql> select * from test;ID  : 1NAME: HelloID  : 2NAME: World(2 rows, 0 ms)

使用OpenOffice基地

OpenOffice.org基地支持在JDBC API访问数据库。为连接到H2数据库使用OpenOffice基地,,你首先需要的JDBC驱动程序添加到OpenOffice。连接到一个H2数据库的步骤是:

  • 启动OpenOffice的作家,到[工具],[选项]
  • 确保你选择了一个在OpenOffice.org / Java的Java运行时环境
  • 点击[类路径...],[添加目录...]
  • 选择H2 jar文件(位置是你的,无论你选择)
  • 按一下[OK](根据需要),停止OpenOffice的(包括快速启动)
  • 启动OpenOffice的基础
  • 连接到一个现有的数据库,选择[JDBC] [下一页]
  • 示例数据源的URL: jdbc:h2:~/test
  • JDBC驱动程序类: org.h2.Driver

现在,您可以访问的数据库存储在当前用户的主目录。

要使用H2在NeoOffice(OpenOffice的不需要X11):

  • 在NeoOffice中,去NeoOffice中],[功能设定]
  • 寻找下页[NeoOffice中],[爪哇]
  • 点击[类路径],[添加目录...]
  • 选择H2 jar文件(位置是你的,无论你选择)
  • 按一下[OK](高达),重新启动NeoOffice中。

现在,当使用“数据库向导”创建一个新的数据库:

  • 点击[文件],[新],[数据库]。
  • 选择[连接到现有数据库],选择[JDBC]。点击下一步。
  • 示例数据源的URL: jdbc:h2:~/test
  • JDBC驱动程序类: org.h2.Driver

使用H2在NeoOffice中的另一种解决方案是:

  • 打包的扩展包内的氢气罐
  • 在NeoOffice中安装它作为一个Java扩展

这可以通过创建使用NetBeans OpenOffice插件。扩展开发

Java Web Start的/ JNLP

当使用Java Web Start / JNLP(Java网络启动协议),权限标签必须的。jnlp文件和应用程序的jar文件必须经过签名。否则,试图写入到文件系统时,会发生以下异常:java.security.AccessControlException:访问被拒绝(java.io.FilePermission ... read)。许可标签示例:

<security>    <all-permissions/></security>

使用连接池

对于H2,打开一个连接是快速的,如果数据库已经打开。不过,使用连接池可以提高性能,如果你打开和关闭连接。一个简单的连接池被包含在H2。它是基于从基督教德Heureuse报迷你连接池管理器还有其他更复杂的,开放源码的连接池,例如,Apache的Commons DBCP的对于H2,它是关于快两倍,从内置的连接池获得一个连接,而不是让一个使用DriverManager.getConnection()内置的连接池的使用方法如下:

import java.sql.*;import org.h2.jdbcx.JdbcConnectionPool;public class Test {    public static void main(String[] args) throws Exception {        JdbcConnectionPool cp = JdbcConnectionPool.create(            "jdbc:h2:~/test", "sa", "sa");        for (int i = 0; i < args.length; i++) {            Connection conn = cp.getConnection();            conn.createStatement().execute(args[i]);            conn.close();        }        cp.dispose();    }}

全文检索

H2包括全文检索实现。一种方法是使用Apache Lucene的,和其他(本机实现)存储在特殊的数据库中的表的索引数据。

使用本机的全文检索

要初始化,请致电:

CREATE ALIAS IF NOT EXISTS FT_INIT FOR "org.h2.fulltext.FullText.init";CALL FT_INIT();

你需要你想用它来初始化它在每个数据库中。之后,您可以创建全文索引的表使用:

CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR);INSERT INTO TEST VALUES(1, 'Hello World');CALL FT_CREATE_INDEX('PUBLIC', 'TEST', NULL);

公众的架构的名称,测试表的名称。列名的列表(以逗号分隔)是可选的,在这种情况下,所有的列上都有索引。该指数是实时更新的。搜索索引,使用下面的查询:

SELECT * FROM FT_SEARCH('Hello', 0, 0);

这将产生一个结果集,其中包含的查询需要检索的数据:

QUERY: "PUBLIC"."TEST" WHERE "ID"=1

要获得原始数据,使用 FT_SEARCH_DATA('Hello', 0, 0);结果包含的列SCHEMA (架构), TABLE (表名), COLUMNS (数组的列名), KEYS(对象数组)。要加入一个表,使用中:SELECT T.* FROM FT_SEARCH_DATA('Hello', 0, 0) FT, TEST T WHERE FT.TABLE='TEST' AND T.ID=FT.KEYS[0];

您也可以在Java应用程序中调用索引:

org.h2.fulltext.FullText.search(conn, text, limit, offset);org.h2.fulltext.FullText.searchData(conn, text, limit, offset);

使用Lucene的全文检索

要使用Lucene全文搜索,你需要的Lucene的库中的类路径。目前2.x版本的Apache Lucene默认情况下,H2版本1.2.x,并使用Lucene的3.x版本默认情况下,H2版本1.3.x之下。如何做到这一点取决于应用程序,如果您使用的H2控制台,你可以添加了Lucene jar文件的环境变量H2DRIVERSCLASSPATH要初始化Lucene的全文搜索的数据库,请致电:

CREATE ALIAS IF NOT EXISTS FTL_INIT FOR "org.h2.fulltext.FullTextLucene.init";CALL FTL_INIT();

你需要你想用它来初始化它在每个数据库中。之后,您可以创建全文索引的表使用:

CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR);INSERT INTO TEST VALUES(1, 'Hello World');CALL FTL_CREATE_INDEX('PUBLIC', 'TEST', NULL);

公众的架构的名称,测试表的名称。列名的列表(以逗号分隔)是可选的,在这种情况下,所有的列上都有索引。该指数是实时更新的。搜索索引,使用下面的查询:

SELECT * FROM FTL_SEARCH('Hello', 0, 0);

这将产生一个结果集,其中包含的查询需要检索的数据:

QUERY: "PUBLIC"."TEST" WHERE "ID"=1

要获得原始数据,使用 FTL_SEARCH_DATA('Hello', 0, 0);结果包含的列SCHEMA (架构), TABLE (表名), COLUMNS (数组的列名), KEYS(对象数组)。要加入一个表,使用中:SELECT T.* FROM FTL_SEARCH_DATA('Hello', 0, 0) FT, TEST T WHERE FT.TABLE='TEST' AND T.ID=FT.KEYS[0];

您也可以在Java应用程序中调用索引:

org.h2.fulltext.FullTextLucene.search(conn, text, limit, offset);org.h2.fulltext.FullTextLucene.searchData(conn, text, limit, offset);

Lucene的全文搜索支持搜索仅在特定的列。列名必须是大写字母(但如果原来的列双引号)。对于列名用下划线(_)开始,另一个需要添加下划线。示例:

CREATE ALIAS IF NOT EXISTS FTL_INIT FOR "org.h2.fulltext.FullTextLucene.init";CALL FTL_INIT();DROP TABLE IF EXISTS TEST;CREATE TABLE TEST(ID INT PRIMARY KEY, FIRST_NAME VARCHAR, LAST_NAME VARCHAR);CALL FTL_CREATE_INDEX('PUBLIC', 'TEST', NULL);INSERT INTO TEST VALUES(1, 'John', 'Wayne');INSERT INTO TEST VALUES(2, 'Elton', 'John');SELECT * FROM FTL_SEARCH_DATA('John', 0, 0);SELECT * FROM FTL_SEARCH_DATA('LAST_NAME:John', 0, 0);CALL FTL_DROP_ALL();

Lucene的全文检索实现内部不同步。如果您在更新数据库的全文检索和查询,同时(直接使用H2或Lucene本身的Java API),您需要确保操作正确同步。如果是这样的情况下,您可能会收到例外,如org.apache.lucene.store.AlreadyClosedException: this IndexReader is closed

用户定义的变量

该数据库支持用户自定义的变量。变量开始@和可以用于任何表达式或参数允许。变量不坚持和会话范围,这意味着只有在它们被定义的会话中可见。值通常被分配使用SET命令:

SET @USER = 'Joe';

该值也可以改变使用SET()方法。在查询中,这是非常有用的:

SET @TOTAL = NULL;SELECT X, SET(@TOTAL, IFNULL(@TOTAL, 1.) * X) F FROM SYSTEM_RANGE(1, 50);

变量未设置评估 NULL一个用户定义的变量的数据类型是分配给它的值的数据类型,这意味着它是没有必要的(或可能)在使用前声明变量的名称。有没有限制分配的值;大对象(LOB)支持。回滚事务,不会影响用户定义的变量的值。

日期和时间

日期,时间和时间戳值支持ISO 8601格式,包括时区:

CALL TIMESTAMP '2008-01-01 12:00:00+01:00';

如果未设置的时区,使用系统当前的时区设定值将被解析。H2数据库文件的日期和时间信息存储在没有时区信息。如果打开数据库时使用另一个系统时区,日期和时间将是相同的。这意味着,如果你在一个时区中存储的值'2000-01-01 12:00:00',然后关闭数据库并重新打开数据库在不同的时区,你也将获得'2000-01-01 12 :00:00'。请注意,不支持更改时区后的H2驱动程序被加载。

使用Spring

使用TCP服务器

使用下面的配置来启动和停止使用Spring框架的H2 TCP服务器:

<bean id = "org.h2.tools.Server"            class="org.h2.tools.Server"            factory-method="createTcpServer"            init-method="start"            destroy-method="stop">    <constructor-arg value="-tcp,-tcpAllowOthers,true,-tcpPort,8043" /></bean>

destroy-method 将有助于防止热重新部署或重新启动服务器时的异常。

错误代码不兼容

有一个不符合Spring的JdbcTemplate和H2版本1.3.154,更新的,因为一个变化中的错误代码。这将导致JdbcTemplate中未检测到重复的关键条件,所以DataIntegrityViolationException 而不是被抛出 DuplicateKeyException的问题SPR-8235解决方法是添加下面的XML文件的根目录开始:

<beans    xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation=        "http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd"    >    <import resource="classpath:org/springframework/jdbc/support/sql-error-codes.xml"/>    <bean id = "H2" class="org.springframework.jdbc.support.SQLErrorCodes">        <property name="badSqlGrammarCodes">            <value>                42000,42001,42101,42102,42111,42112,42121,42122,42132            </value>        </property>        <property name="duplicateKeyCodes">            <value>23001,23505</value>        </property>        <property name="dataIntegrityViolationCodes">            <value>22003,22012,22025,23000</value>        </property>        <property name="dataAccessResourceFailureCodes">            <value>90046,90100,90117,90121,90126</value>        </property>        <property name="cannotAcquireLockCodes">            <value>50200</value>        </property>    </bean></beans>

Java管理扩展(JMX)

支持基于JMX的管理,但默认情况下不启用。要启用JMX,追加;JMX=TRUE在数据库URL打开数据库时。各种工具支持JMX,一个这样的工具是jconsole当打开jconsole,连接到数据库是开放的过程中(使用服务器模式时,您需要连接到服务器进程)。然后去MBeans一节。org.h2你会发现每一个条目的数据库。对象的项目名称是数据库的短名称,加上路径(每个冒号替换下划线)。

下面的属性和操作的支持:

  • CacheSize:目前在使用中的KB高速缓存的大小。
  • CacheSizeMax (读/写):最大高速缓存大小(KB)。
  • Exclusive这个数据库是否以独占模式或不开放。
  • FileReadCount号文件的读取操作,因为数据库被打开了。
  • FileSize:文件大小(KB)。
  • FileWriteCount文件的写操作的数量,因为数据库被打开了。
  • FileWriteCountTotal文件的写操作的数量,因为数据库被创建。
  • LogMode(读/写):当前的事务日志模式。SET LOG 了解详细信息。
  • Mode兼容模式(REGULAR 如果没有兼容模式下使用)。
  • MultiThreaded:真正的多线程如果启用。
  • Mvcc:true,如果 MVCC 已启用。
  • ReadOnly真实的,如果数据库是只读的。
  • TraceLevel (读/写):文件的跟踪级别。
  • Version:使用的数据库版本。
  • listSettings:列出数据库设置。
  • listSessions:列出的公开会议,包括当前执行的语句(如果有的话),并锁定表(如果有的话)。

要启用JMX,您可能需要设置系统属性 com.sun.management.jmxremotecom.sun.management.jmxremote.port 所要求的JVM。

http://blog.csdn.net/chenjia3615349/article/details/8105753#

 

0 0
原创粉丝点击