最近项目中有用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的文件)
- Mozilla Firefox浏览器
安装软件 要安装该软件,运行安装程序,或将其解压缩到您选择的目录。
目录结构 安装完成后,你应该得到如下的目录结构:
目录 | 内容 |
---|---|
bin | JAR文件和批处理文件 |
docs | 文档 |
docs/html | HTML页面 |
docs/javadoc | Javadoc文件 |
ext | 外部的依赖关系(在编译时下载) |
service | 作为Windows服务运行数据库的工具 |
src | 源文件 |
src/docsrc | 文档来源 |
src/installer | 安装,外壳,并释放构建脚本 |
src/main | 数据库引擎的源代码 |
src/test | 测试源代码 |
src/tools |
添加数据库驱动程序
要注册的JDBC驱动程序(支持MySQL,PostgreSQL,HSQLDB,...),添加的jar文件名的环境变量
H2DRIVERS
或 CLASSPATH
。例:添加HSQLDB JDBC驱动程序(Windows)中C:\Programs\hsqldb\lib\hsqldb.jar
设置环境变量 H2DRIVERS
对 C:\Programs\hsqldb\lib\hsqldb.jar
。可以设置多个驱动程序条目需要分开
;
(Windows)或 :
(其他操作系统)。支持的路径名中的空格。这些设置必须没有被引用。 使用H2控制台 H2控制台应用程序有三个主要的面板顶部的工具栏上,在左边的树,面板右侧的查询/结果。在左边列出的数据库对象(例如表)。在查询面板,并点击[运行],输入一个SQL命令。结果出现下面的命令。 将表名或列名 要插入到脚本中的表名和列名,单击树中的项目。如果你点击了一个表,而查询是空的,然后 SELECT * FROM ... 被添加。键入查询时,所使用的表,在树中展开。例如,如果您键入SELECT * FROM TEST T WHERE T. 然后对表TEST扩大。断开并停止应用程序 要登录的数据库,在工具栏面板中单击[断开]。然而,服务器仍然在运行,随时准备接受新的会话。 要停止服务器,右键单击系统托盘上的图标,并选择[退出]。如果你没有在系统托盘图标,导航到[首选项],然后单击[关闭],按[Ctrl]键+ [C]在控制台服务器开始(Windows)中,或关闭控制台窗口。 特别H2控制台语法 H2控制台支持一些内置的命令。这些解释在H2控制台,使他们的工作与任何数据库。内建命令需要在开始的一份声明中(之前任何言论),否则他们不会正确地分析。如有疑问,请添加 ;
之前的命令。
.h2.server.properties 在您的用户主目录。对于Windows安装,通常是用户的home目录C:\Documents and Settings\[username] 。配置文件中包含的应用程序的设置,并自动H2控制台第一次启动时创建的。支持设置如下:
使用转义字符 \ 。示例: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:
启动TCP服务器内的一个应用 也可以从一个应用程序的启动和停止服务器。示例代码: import org.h2.tools.Server; ... // start the TCP Server Server server = Server.createTcpServer(args).start(); ... // stop the TCP Server server.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-classname 对 org.h2.jdbcx.JdbcDataSource 。的H2数据库兼容的HSQLDB和PostgreSQL。要充分利用H2的特定功能,使用 H2Platform 。这个平台的源代码包含在H2src/tools/oracle/toplink/essentials/platform/database/DatabasePlatform.java.txt 。您将需要复制该文件到您的应用程序,并重新命名它的。java。要启用它,更改以下设置在persistence.xml:在旧版本的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的配置元素 元素,属性 databaseLocker="org.apache.activemq.store.jdbc.adapter.TransactDatabaseLocker" 。然而,使用MVCC模式将再次导致同样的问题。因此,请不要在这种情况下,使用MVCC模式。另一个(更危险)的解决办法是设置useDatabaseLock 为false。在NetBeans中使用H2 该项目H2数据库引擎支持NetBeans让你在IDE启动和停止H2服务器。 这是一个已知的问题时,使用NetBeans SQL执行窗口:在执行查询之前,另一个查询的形式 SELECT COUNT(*) FROM 被执行。这是一个问题的查询,修改状态,如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中包含此信息
使用生成的源代码,您可以查询数据库,如下所示: Factory create = new H2Factory(connection); Result 查看更多详细信息jOOQ首页jOOQ教程 在Web应用程序中使用数据库 有很多种方法来访问数据库在Web应用程序中。下面是一些例子,如果你使用的是Tomcat或JBoss。 嵌入模式 (目前)最简单的解决方法是使用数据库中的嵌入模式,这意味着在您的应用程序中打开一个连接(一个很好的解决方案是使用一个Servlet监听器在启动时,见下文),或当一个会话开始。一个数据库可以同时访问多个会话和应用程序,只要它们运行在同一进程中。Servlet容器(例如Tomcat)只使用一个进程,所以这是没有问题的(除非你在集群模式下运行Tomcat)。Tomcat使用了??多线程和多类加载器。如果多个应用程序同时访问同一个数据库,你需要将数据库jar中的 shared/lib 或 server/lib 目录。这是一个好主意,在web应用启动时打开数据库,并关闭它时,Web应用程序停止。如果使用多个应用程序,只有一个人(任何)需要做到这一点。在应用中,一个思路,就是使用每一个连接会话,或者甚至每一个连接请求(行动)。如果可能的话,使用后应关闭这些连接(但它不是坏的,如果他们没有得到关闭)。服务器模式 服务器模式是相似的,但它可以让你在另一个进程中运行的服务器。 使用Servlet监听器启动和停止数据库 H2 *。jar文件添加到您的Web应用程序,下面的代码片断添加到你的web.xml文件(在 context-param 和 filter 部分):
有关如何访问数据库的详细信息,请参阅文件 DbStarter.java 。默认情况下,这个工具使用数据库URL打开一个嵌入的连接jdbc:h2:~/test 用户名 sa 和密码 sa 。如果你想在你的servlet中使用此连接,您可以访问如下:Connection conn = getServletContext().getAttribute("connection"); DbStarter 还可以启动TCP服务器,但是在默认情况下是禁用的。要启用它,使用该参数db.tcpServer 在该文件中 web.xml 。下面是完整的选项列表。这些选项需要被放置在description 标签和 listener / filter 标签:
当web应用程序停止时,将自动关闭数据库连接。如果TCP服务器内开始 DbStarter ,它也将被自动停止。使用H2控制台的Servlet H2控制台是一个独立的应用程序,包括它自己的Web服务器,但它可以作为一个servlet作为。要做到这一点,包括了 h2*.jar 在您的应用程序文件,并添加下面的配置到您的 web.xml :H2Console org.h2.server.web.WebServlet 有关详细信息,请参阅也 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的原因是:
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文件可以用于在数据库中使用的功能 CSVREAD 和 CSVWRITE ,或者它可以用来作为一个独立的工具以外的数据库。在一个数据库中读取一个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 -? 命令行工具:
外壳工具 外壳工具是一个简单的交互式命令行工具。要启动它,请键入: java -cp h2*.jar org.h2.tools.Shell 您将被要求提供数据库URL,JDBC驱动程序,用户名和密码。作为命令行参数,也可以设置连接设置。连接后,你会得到列表中选择。内置的命令并不需要以分号结束,但只执行SQL语句,如果该行以一个分号结束 ;
。这允许输入多行语句:sql> select * from test ...> where id = 0; 默认情况下,打印结果为表。对于多列的结果,考虑使用列表模式: sql> list Result list mode is now on sql> select * from test; ID: 1 NAME: HelloID: 2 NAME: World (2 rows, 0 ms) 使用OpenOffice基地 OpenOffice.org基地支持在JDBC API访问数据库。为连接到H2数据库使用OpenOffice基地,,你首先需要的JDBC驱动程序添加到OpenOffice。连接到一个H2数据库的步骤是:
要使用H2在NeoOffice(OpenOffice的不需要X11):
Java Web Start的/ JNLP 当使用Java Web Start / JNLP(Java网络启动协议),权限标签必须的。jnlp文件和应用程序的jar文件必须经过签名。否则,试图写入到文件系统时,会发生以下异常: java.security.AccessControlException :访问被拒绝(java.io.FilePermission ... read )。许可标签示例:使用连接池 对于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文件的环境变量 H2DRIVERS 或 CLASSPATH 。要初始化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服务器: “ destroy-method 将有助于防止热重新部署或重新启动服务器时的异常。错误代码不兼容 有一个不符合Spring的JdbcTemplate和H2版本1.3.154,更新的,因为一个变化中的错误代码。这将导致JdbcTemplate中未检测到重复的关键条件,所以 DataIntegrityViolationException 而不是被抛出 DuplicateKeyException 。的问题SPR-8235。解决方法是添加下面的XML文件的根目录开始:
Java管理扩展(JMX) 支持基于JMX的管理,但默认情况下不启用。要启用JMX,追加 ;
JMX=TRUE 在数据库URL打开数据库时。各种工具支持JMX,一个这样的工具是jconsole 。当打开jconsole ,连接到数据库是开放的过程中(使用服务器模式时,您需要连接到服务器进程)。然后去MBeans 一节。下org.h2 你会发现每一个条目的数据库。对象的项目名称是数据库的短名称,加上路径(每个冒号替换下划线)。下面的属性和操作的支持:
com.sun.management.jmxremote 和 com.sun.management.jmxremote.port 所要求的JVM。 |
【Hibernate|H2 数据库引擎】
推荐阅读
- 数据库|SQL行转列方式优化查询性能实践
- mysql|一文深入理解mysql
- 达梦数据库|DM8表空间备份恢复
- 数据技术|一文了解Gauss数据库(开发历程、OLTP&OLAP特点、行式&列式存储,及与Oracle和AWS对比)
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- 谈灾难恢复指标(RTO与RPO是什么鬼())
- RPO与RTO
- 数据库|效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...