分类: 数据库 Hibernate jquery easyui solr 2012-10-24 10:36 2265人阅读 评论(0) 收藏 举报
最近项目中有用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的,...)。
安装软件
要安装该软件,运行安装程序,或将其解压缩到您选择的目录。
目录结构
安装完成后,你应该得到如下的目录结构:
目录 内容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命令。结果出现下面的命令。 将表名或列名要插入到脚本中的表名和列名,单击树中的项目。如果你点击了一个表,而查询是空的,然后 断开并停止应用程序要登录的数据库,在工具栏面板中单击[断开]。然而,服务器仍然在运行,随时准备接受新的会话。 要停止服务器,右键单击系统托盘上的图标,并选择[退出]。如果你没有在系统托盘图标,导航到[首选项],然后单击[关闭],按[Ctrl]键+ [C]在控制台服务器开始(Windows)中,或关闭控制台窗口。 特别H2控制台语法H2控制台支持一些内置的命令。这些解释在H2控制台,使他们的工作与任何数据库。内建命令需要在开始的一份声明中(之前任何言论),否则他们不会正确地分析。如有疑问,请添加
H2控制台的设置的H2控制台的设置被存储在一个配置文件叫
除了这些设置中的最近使用的连接的属性的表格中列出的 使用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(); } } 此代码首先加载驱动程序( 创建新的数据库默认情况下,如果在URL中指定的数据库不存在,将自动创建一个新的(空的)数据库。自动创建的数据库的用户成为该数据库的管理员。 自动创建新的数据库可以被禁用,打开一个数据库,只有当它已经存在。 使用服务器H2目前支持三种服务器:Web服务器(H2控制台),TCP服务器(客户端/服务器连接)和PG服务器(PostgreSQL的客户端)。请注意,只有在Web服务器支持的浏览器连接。服务器可以开始以不同的方式,一种是使用 启动服务器命令行工具要启动 java -cp h2*.jar org.h2.tools.Server 这将启动该工具的默认选项。,要想列出的选项和缺省值,运行以下命令: java -cp h2*.jar org.h2.tools.Server -? 有选择使用其他端口,启动或不启动零件。 连接到TCP服务器远程连接到数据库使用的TCP服务器,请使用以下驱动程序和数据库URL:
对于有关数据库的URL的详细信息,请参阅特点。请注意,您不能连接到这个URL与Web浏览器。您可以使用H2客户端(通过JDBC)连接。 启动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服务器,可以使用该选项来保护 使用Hibernate该数据库所支持的Hibernate版本3.1和更高版本。您可以使用的的HSQLDB话,或本机H2方言。不幸的是,H2的方言包括在一些老版本的Hibernate是越野车。对Hibernate的一个补丁已经提交,现在的应用。您可以重命名为 当使用Hibernate时,尝试使用 使用TopLink和Glassfish要使用H2与GlassFish(或Sun AS),设置数据源类名称 的H2数据库兼容的HSQLDB和PostgreSQL。要充分利用H2的特定功能,使用 <property name="toplink.target-database" value="oracle.toplink.essentials.platform.database.H2Platform"/> 在旧版本的Glassfish的,属性名 要使用内Glassfish的H2,H2 *。jar文件的目录复制 使用的EclipseLink要使用H2的EclipseLink,使用该平台类 使用Apache ActiveMQ的当使用H2作为后端数据库,Apache ActiveMQ的,请使用 在NetBeans中使用H2该项目H2数据库引擎支持NetBeans让你在IDE启动和停止H2服务器。 这是一个已知的问题时,使用NetBeans SQL执行窗口:在执行查询之前,另一个查询的形式 使用H2 jOOQjOOQ增加了一层薄薄的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 ......在这里, <?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(); 在Web应用程序中使用数据库有很多种方法来访问数据库在Web应用程序中。下面是一些例子,如果你使用的是Tomcat或JBoss。 嵌入模式(目前)最简单的解决方法是使用数据库中的嵌入模式,这意味着在您的应用程序中打开一个连接(一个很好的解决方案是使用一个Servlet监听器在启动时,见下文),或当一个会话开始。一个数据库可以同时访问多个会话和应用程序,只要它们运行在同一进程中。Servlet容器(例如Tomcat)只使用一个进程,所以这是没有问题的(除非你在集群模式下运行Tomcat)。Tomcat使用了多线程和多类加载器。如果多个应用程序同时访问同一个数据库,你需要将数据库jar中的 服务器模式服务器模式是相似的,但它可以让你在另一个进程中运行的服务器。 使用Servlet监听器启动和停止数据库H2 *。jar文件添加到您的Web应用程序,下面的代码片断添加到你的web.xml文件(在 <listener> <listener-class>org.h2.server.web.DbStarter</listener-class> </listener> 有关如何访问数据库的详细信息,请参阅文件 Connection conn = getServletContext().getAttribute("connection");
<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服务器内开始 使用H2控制台的ServletH2控制台是一个独立的应用程序,包括它自己的Web服务器,但它可以作为一个servlet作为。要做到这一点,包括了 <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> 有关详细信息,请参阅也 要创建一个Web应用程序只用H2控制台,运行以下命令: build warConsole Android的您可以使用这个数据库,而不是或除了SQLite的Android设备上使用的Dalvik VM。到目前为止,只有极少数测试和基准测试运行,但它似乎SQLite的性能是类似的,除了打开和关闭数据库,该数据库尚未优化的H2(H2大约需要0.2秒,和SQLite约0.02秒) 。读操作似乎有点快比SQLite,和写操作似乎要慢一些。到目前为止,只有极少数的测试运行,一切似乎都如预期般运作。全文搜索还没有测试,但是本机的全文搜索工作。 使用H2,而不是SQLite的原因是:
目前只支持JDBC API(它计划在将来的版本中支持Android数据库API)。定期H2 jar文件和较小的 数据库文件需要被存储在一个地方,是为应用程序访问。示例: 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); ... 限制:目前不支持使用连接池,因为要求 CSV(逗号分隔值)的支持支持CSV文件可以用于在数据库中使用的功能 在一个数据库中读取一个CSV文件使用该函数可以读取一个CSV文件 SELECT * FROM CSVREAD('test.csv'); 请注意,对于性能的原因, 从CSV文件导入数据一种快速的方式来加载或从一个CSV文件导入数据(有时也被称为“批量加载”)是结合创建表的进口。(可选),列名和数据类型可以在创建表时设置。另一种选择是使用 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文件内置的功能 CREATE TABLE TEST(ID INT, NAME VARCHAR); INSERT INTO TEST VALUES(1, 'Hello'), (2, 'World'); CALL CSVWRITE('test.csv', 'SELECT * FROM TEST'); 写一个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脚本文件。这将导致一个小的,人类可读的,和数据库版本独立的备份。创建脚本也将验证数据库文件的校验和。“ java org.h2.tools.Script -url jdbc:h2:~/test -user sa -script test.zip -options compression zip 另外,也可以使用SQL命令 从脚本中恢复要恢复的数据库从SQL脚本文件,您可以使用 java org.h2.tools.RunScript -url jdbc:h2:~/test -user sa -script test.zip -options compression zip 欲了解更多有关选项的信息,请参阅SQL命令 在线备份“ 产生的备份是事务性一致,这意味着一致性和原子规则。 BACKUP TO 'backup.zip' “ 创建复制数据库文件的备份是在数据库运行时不被支持,但如果文件系统支持创建快照。与其他文件系统,它不能保证数据以正确的顺序被复制。 命令行工具该数据库自带的一些命令行工具。为了获得更多的信息的工具,它开始与参数' - ',例如: java -cp h2*.jar org.h2.tools.Backup -? 命令行工具:
的工具,也可以从应用程序中调用通过调用主或其他公共方法。有关详细信息,请参阅Javadoc文档。 外壳工具外壳工具是一个简单的交互式命令行工具。要启动它,请键入: 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: Hello ID : 2 NAME: World (2 rows, 0 ms) 使用OpenOffice基地OpenOffice.org基地支持在JDBC API访问数据库。为连接到H2数据库使用OpenOffice基地,,你首先需要的JDBC驱动程序添加到OpenOffice。连接到一个H2数据库的步骤是:
现在,您可以访问的数据库存储在当前用户的主目录。 要使用H2在NeoOffice(OpenOffice的不需要X11):
现在,当使用“数据库向导”创建一个新的数据库:
使用H2在NeoOffice中的另一种解决方案是:
这可以通过创建使用NetBeans OpenOffice插件。扩展开发。 Java Web Start的/ JNLP当使用Java Web Start / JNLP(Java网络启动协议),权限标签必须的。jnlp文件和应用程序的jar文件必须经过签名。否则,试图写入到文件系统时,会发生以下异常: <security> <all-permissions/> </security> 使用连接池对于H2,打开一个连接是快速的,如果数据库已经打开。不过,使用连接池可以提高性能,如果你打开和关闭连接。一个简单的连接池被包含在H2。它是基于从基督教德Heureuse报的迷你连接池管理器。还有其他更复杂的,开放源码的连接池,例如,Apache的Commons DBCP的。对于H2,它是关于快两倍,从内置的连接池获得一个连接,而不是让一个使用 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 要获得原始数据,使用 您也可以在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文件的环境变量 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 要获得原始数据,使用 您也可以在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),您需要确保操作正确同步。如果是这样的情况下,您可能会收到例外,如 用户定义的变量该数据库支持用户自定义的变量。变量开始 SET @USER = 'Joe'; 该值也可以改变使用SET()方法。在查询中,这是非常有用的: SET @TOTAL = NULL; SELECT X, SET(@TOTAL, IFNULL(@TOTAL, 1.) * X) F FROM SYSTEM_RANGE(1, 50); 变量未设置评估 日期和时间日期,时间和时间戳值支持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> “ 错误代码不兼容有一个不符合Spring的JdbcTemplate和H2版本1.3.154,更新的,因为一个变化中的错误代码。这将导致JdbcTemplate中未检测到重复的关键条件,所以 <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,您可能需要设置系统属性 http://blog.csdn.net/chenjia3615349/article/details/8105753#
|