启动和使用H2管理系统
设置H2管理系统
通过JDBC连接到数据库
创建一个新的数据库
使用服务器模式
使用Hibernate
使用TopLink和Glassfish
使用EclipseLink
在WEB应用中使用数据库
CSV (逗号分隔文件)的支持
升级,备份,和恢复
命令行工具
使用OpenOffice基础框架
使用/ JNLP启动JAVA WEB
使用连接池
全文检索
用户自定义变量
日期和时间
使用Spring
H2管理系统让你能够通过一个浏览器对H2的SQL数据库进行管理操作。H2管理系统不仅可以连接H2数据库,也可以连接其他支持JDBC接口的数据库。
这是一个B/C/S应用,在服务器和浏览器上都要运行H2的管理程序。根据平台不同,H2管理系统支持多种启动应用的方式。
在windows上有两种方式启动H2管理系统
方式一:单击[开始],[程序],[H2],和 [H2 Console (Command Line)]。当使用SUN JDK1.5时,一个标题为'H2 Console'的窗口将弹出。当使用SUN JDK1.6时,一个数据库图标将被加入WINDOWS到系统托盘。如果既无窗口弹出也没有图标加入到系统托盘,很可能是你的JDK没有正确安装(如果确认自己的JDK安装正确,可以尝试用另外一种方式启动控制台)。另外一个浏览器窗口将被打开,指向的URL是http://localhost:8082,是H2管理系统的登录页面。
方式二:打开文件浏览器,切换目录到h2/bin,双击运行h2.bat。一个控制台窗口将弹出,如果有问题,将有错误信息在这个窗口里显示。一个浏览器窗口将被打开,指向的URL是http://localhost:8082,是H2管理系统的登录页面。
其他操作系统启动H2管理系统
方式一:双击h2*.jar文件,如果.jar文件能正确的被java打开。
方式二:打开一个控制台窗口,切换目录到h2/bin,执行命令:java -cp h2*.jar org.h2.tools.Server
防火墙
在你启动服务时,如果你安装了防护墙,你可能会收到一个防护墙的安全警告。如果不需要其他计算机访问你这台计算机上的H2数据库,你可以让防火墙阻塞H2对外服务的端口,但是本地计算机仍可以访问这些端口。当你需要其他计算机也能访问这台计算机的H2数据库时,你需要让防火墙开放H2对外服务的端口。
有报告显示使用卡巴斯基7.0的防火墙时,使用IP地址访问本地的H2时,速度非常的缓慢,替代的方案是使用'localhost'代替IP地址来访问。
一个简单的防火墙已经集成到H2的服务器中,其他的计算机缺省状态下不能连接到服务器,如果需要其他计算机能连接到H2服务器,到'Preferences'(偏好),选择'Allow connections from other computers'(允许从其他计算连接)即可。
JAVA测试
打开一个命令行窗口,输入下面的命令,检测JAVA的版本:
java -version
如果你得到错误的信息,你可能未安装JDK,或是需要将JAVA的可执行文件路径加入到环境变量PATH中。
错误信息'Port may be in use'(端口被占用)
你可能在启动一个H2控制台实例时,出现错误信息"The Web server could not be started. Possible cause: another server is already running...".(WEB服务器不能启动,可能的原因:另外一个服务器已经在运行了)。使用不同的端口,可以在一台计算机上启动多个控制台程序,但是一般都不被这么要求。
使用其他端口
如果端口已经被其他应用占用,你需要使用其他端口来启动H2控制台。改变H2的控制台端口需要修改配置文件.h2.server.properties。这个文件存储在用户目录下(在Windows系统中,这个文件通常在Documents and Settings/<username>)。这个相应的入口实体是webPort.
使用浏览器连接到服务器
服务器启动成功后,你就可以使用WEB浏览器访问服务,浏览器需要支持JavaScript。在启动的服务器上启动浏览器,打开URL http://localhost:8082。在启动服务器之外的计算机上,你需要提供启动服务器的IP地址,如http://192.168.0.2:8082.如果你在服务器上启用了SSL, URL需要使用https://开头.
多个并发会话
支持多个并发的浏览器会话。由于数据对象是存储在服务器上的,同时工作的会话数受限于服务器的内存。
登录
在登录页,你提交连接信息就可以登录到数据库。设置JDBC作为连接数据库的驱动,填入JDBC URL、用户名、密码,单击[Connect]。你能保存和恢复以前设置的信息,这些设置都存储在属性文件中。
错误信息
错误信息用红色标识,你能通过单击消息显示或隐藏异常的堆栈信息。
附加数据库驱动
通过增加JAR的本地驱动文件到环境变量来附加数据库驱动。环境变量包括 H2DRIVERS 和 CLASSPATH,以WINDOWS为例:如要增加数据库驱动“C:\Programs\hsqldb\lib\hsqldb.jar”,设置环境变量H2DRIVERS=C:\Programs\hsqldb\lib\hsqldb.jar。
多个驱动可以被设置,每个驱动之间通过;分号分隔(WINDOWS),其他系统通过:冒号分隔。在路径中空格被支持,但是这些设置不能被引用。
H2控制台主页面分为三个主要的部分:顶部的工具栏,左边的是对象树,右边的是查询和结果输出栏。数据库对象(如表)都被列在左边的树形上。在查询栏上输入SQL语句点击'Run‘,结果就被输出到命令行的下面。
增加表名和字段名
可以通过在树上点击增加表名和字段名。如果单击表,当这个查询栏是空的时候,” SELECT * FROM "将被自动增加到查询栏。当输入一个表的查询时,对象树上将自动的展开这张表。例如,你输入SELECT * FROM TEST T WHERE T,对象树上的表TEST将自动的展开。
断开连接和停止应用
断开数据库,点击工具栏上的Disconnect即可,这个时候,数据库服务仍在继续运行,等待着一个新的会话进行连接。
停止服务需要右键点击系统托盘的H2图标,选择 [Exit]。如果没有系统托盘的H2图标,切换到[Preferences]单击[Shutdown],在WINDOWS上在服务器启动的窗口下按[Ctrl]+[C],或者直接关闭WINDOWS上的控制台窗口。
设置H2控制台
H2控制台的设置信息存储在配置文件.h2.server.properties,该文件存放在你的用户目录下。在WINDOWS上,用户目录通常是C:\Documents and Settings\[username]。H2控制台第一次启动时将自动创建应用所需要包含的配置文件。
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指定的数据库并不存在,一个新的空的数据库将被自动的创建。创建数据库的用户自动成为这个数据库的超级管理员。
自动创建新库也可以通过特殊的URL进行屏蔽,参见打开一个存在的数据库。
H2目前支持三种服务器模式:WEB服务器模式(H2控制台)、TCP服务器模式(C/S连接)和PG服务器模式(PostgreSQL客户端)。可以通过多种方式启动服务器模式,通常的方式是通过服务器工具。
通过命令行启动服务器工具
缺省设置下,输入下面命令并执行能启动服务器工具:
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://ip/~/test
关于数据库URL,看数据库URL说明。
在应用内部启动TCP服务
在JAVA应用内部,也可以通过代码来实现TCP服务的启动和停止,例子代码如下:
import org.h2.tools.Server;
...
// start the TCP Server
Server server = Server.createTcpServer(args).start();
...
// stop the TCP Server
server.stop();
外部程序停止TCP服务
TCP服务能被另外的进程停止,通过命令行停止TCP服务的命令如下:
java org.h2.tools.Server -tcpShutdown tcp://localhost:9092
通过在程序中添加下面的代码,也可以在另外的进程中停止TCP服务:
org.h2.tools.Server.shutdownTcpServer("tcp://localhost:9094");
这个方法仅能停止TCP服务,如果进程内的其他服务还在运行,他们将不受影响。为了避免数据库被重新打开,在使用这个方法前,需要将所有的数据库连接都关闭。远程停止服务,需要能远程连接到这台服务器上。关闭服务器可以通过使用密码来保护(启动时也需要使用和创建的密码),命令行参数可以通过-tcpPassword来实现。
H2数据库支持Hibernate 3.1及以上的版本。你能够使用HSQLDB方言,或是H2自己的方言。注意的是,在 Hibernate 中包含的H2方言有BUG,针对这些BUG的补丁已经被发布。最新的Hibernate 的方言版本是src/tools/org/hibernate/dialect/H2Dialect.java.txt。你能够将它改名为H2Dialect.java,直接把它包含在你的应用中即可使用。
在Glassfish中使用H2,设置Datasource Classname为org.h2.jdbcx.JdbcDataSource。可以通过图形界面进行设置[Application Server] - [Resources] - [JDBC] - [Connection Pools], 或者编辑文件sun-resources.xml:修改元素jdbc-connection-pool,设置属性 datasource-classname为 org.h2.jdbcx.JdbcDataSource。
H2数据库是兼容HSQLDB和PostgreSQL。如果要使用H2的特殊属性,需要使用H2Platform,源代码在src/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。
在EclipseLink使用H2,可以通过类org.eclipse.persistence.platform.database.H2Platform。如果你使用的EclipseLink版本不支持,可以使用OraclePlatform替代,具体看H2Platform.
在WEB应用中使用数据库,可以有多种方式,这里有一些针对Tomcat和JBoss的例子。
内嵌模式
最简单(目前)的方法就是将数据库内嵌到应用中,这样就意味着应用启动的时候就打开了一个连接(好的办法是使用Servlet监听器,看下面的说明)。数据库能被多个session和应用访问,他们跟应用运行在一个进程内,大部分的Servlet容器只适用一个进程(如Tomcat),这些容器都是没有问题的(除非你使用集群)。Tomcat使用多线程和多类加载器。如果多个应用同时访问同一个数据库,你需要将数据库的jar文件放在shared/lib或是server/lib目录。好的方案是WEB应用启动时打开数据库,WEB应用停止时关闭数据库。如果是多个应用,只需要一个应用来处理启动和关闭。好的方案是一个session一个连接,或者是一个请求(action)一个连接,连接使用完后尽可能的关闭它,当然不关闭并不会引起可怕的后果。
服务器模式
服务器模式是差不多的,但是它可以运行在其他的进程中。
使用Servlet监听去启动和停止数据库
增加h2*.jar文件到你的应用中,将下面的配置增加到你的web.xml中(在filter节下面的 context-param):
<listener>
<listener-class>org.h2.server.web.DbStarter</listener-class>
</listener>
关于具体访问数据库的细节,你可以看DbStarter.java。在这个工具中缺省打开的内嵌数据库URL为jdbc:h2:~/test,用户名sa,密码sa。如果你要去使用这个连接,你可以使用下面的访问方式:
Connection conn = getServletContext().getAttribute("connection");
DbStarter 也能够启动TCP服务,但是缺省状态下是不允许的。可以通过修改web.xml下的参数db.tcpServer来启用。下面是完整的配置选项,这些选项需要放在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服务,TCP服务也将被自动关闭。
使用H2控制Servlet
H2控制台是一个包含在WEB服务中的独立的应用,但是它也能作为一个servlet使用。为了做到这点,你需要将h2*.jar文件添加到你的应用中,在你的web.xml文件中增加下面的配置:
<servlet>
<servlet-name>H2Console</servlet-name>
<servlet-class>org.h2.server.web.WebServlet</servlet-class>
<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.
要创建一个合适的H2控制台的WEB应用,运行下面的命令:
build warConsole
CSV文件在数据库系统中支持CSVREAD和CSVWRITE方法,也可以把它作为数据库之外的一个工具来使用。
将数据库查询结果写成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文件
通过CSVREAD方法读取数据。如:
SELECT * FROM CSVREAD('test.csv');
在JAVA应用中写CSV文件
在数据库之外也可以使用CSV工具,如:
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", "[email protected]");
rs.addRow("John Jones", "[email protected]");
Csv.getInstance().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 = Csv.getInstance().
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();
}
}
数据库升级Database Upgrade
数据库升级的推荐方案是,老版本的数据库的数据备份成SQL脚本的方式,在新版本的数据库上执行这些SQL来恢复数据。
用脚本工具备份数据
备份数据库有多种方式。如可以直接拷贝数据库文件,但是不建议在数据库在使用的时候去拷贝文件,另外数据库文件是二进制的,不能直接读懂,并且数据库文件可能会比较大,推荐的备份方式是创建压缩的SQL脚本文件,并且H2提供了数据导出的脚本工具:
java org.h2.tools.Script -url jdbc:h2:~/test -user sa -script test.zip -options compression zip
也可能通过SQL命令脚本去备份数据库,关于更多的命令选项,请查看SQL命令脚本。备份也能通过远程来做,但是文件被创建在服务器上,你可以通过FTP服务获取备份的脚本文件。
用脚本恢复数据
从一个SQL脚本文件恢复数据库,你可以使用RunScript工具:
java org.h2.tools.RunScript -url jdbc:h2:~/test -user sa -script test.zip -options compression zip
关于更多的命令的选项,请参考SQL命令RUNSCRIPT。恢复也能通过远程来实现,但是恢复的文件需要在服务器上。可以通过FTP服务器上传恢复需要的脚本文件。也可以通过RUNSCRIPT执行SQL脚本,SQL脚本文件内也可以引用另外的SQL脚本文件,在服务器模式下,也可以远程执行SQL脚本,但是要求脚本文件和被引用的脚本未见都在服务器上。
在线备份
SQL命令BACKUP和备份工具都能创建全库的备份文件的压缩包。但是,这个文件的内容并不可读,相比脚本方式,BACKUP命令并不锁定数据库对象,也不阻塞用户,但是BACKUP命令备份结果是事务一致的。:
BACKUP TO 'backup.zip'
备份工具 (org.h2.tools.Backup)不能创建在线备份;程序在执行的时候,数据库不能使用。
并不支持数据库运行的同时创建数据库备份,除非是文件系统支持创建快照,但是快照不能保证数据拷贝顺序的正确性。
H2数据库提供了一组命令行工具,如果你需要了解这些工具,使用参数-?,如:
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文档。
OpenOffice.org基础框架支持通过JDBC连接数据库。你也可以通过OpenOffice框架连接到H2数据库。首先将JDBC驱动增加到OpenOffice中,下面的步骤可以连接到H2数据库:
· 启动OpenOffice Writer,进入[Tools], [Options]
· 确认你在OpenOffice.org / Java中选择了JAVA运行环境
· 单击 [Class Path...], [Add Archive...]
· 选择你的h2的jar文件(本机上的路径可以由你选择)
· 单击 [OK] (按要求的点击), 停止OpenOffice (包括Quickstarter)
· 启动OpenOffice框架
· 连接到一个存在的数据库;选择 [JDBC]; [Next]
· 输入数据库URL,如: jdbc:h2:~/test
· 输入JDBC驱动类: org.h2.Driver
你可以访问存于用户当前目录的数据库。使用H2数据通过NeoOffice (去掉X11的OpenOffice):
· 在NeoOffice,到[NeoOffice], [Preferences]
· 在[NeoOffice]页下找到[Java]
· 单击[Class Path], [Add Archive...]
· 选择h2的jar文件(本地目录,任你选择合适的目录)
· 单击[OK](根据需要),重启NeoOffice.
现在,你可以通过"Database Wizard"创建一新的数据库:
· 单击[File], [New], [Database].
· 选择[Connect to existing database],并且选择[JDBC],单击next.
· 输入数据源的URL,例如:jdbc:h2:~/test
· JDBC驱动类: org.h2.Driver
其他的在NeoOffice中使用H2的方法:
· 将H2的jar包打包到一个扩展包中
· 在NeoOffice中作为扩展JAVA包进行安装
这个能通过使用NetBeans OpenOffice插件来创建。详细看Extensions Development.
当使用/ JNLP (JAVA网络加载协议)启动JAVA WEB,允许访问标签必须被设置在.jnlp文件,并且.jar的应用文件必须被签名,否则,当你试着去写文件系统,下面的异常将会被抛出:java.security.AccessControlException: access denied (java.io.FilePermission ... read). 如访问标签:
<security>
<all-permissions/>
</security>
如果H2的数据库已经打开,打开一个连接很快。如果要打开和关闭许多连接,使用连接池,可以提升性能。H2包含了一个简单的连接池,它是基于Christian d'Heureuse的Mini Connection Pool Manager。还有其他更复杂的开源连接池可以使用,如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);
PUBLIC是schema的名字, TEST是索引表名。字段名列表是可选的,在上面的例子中,所有的字段都被索引,索引的更新是实时的,使用下面的查询语句可以进行搜索:
SELECT * FROM FT_SEARCH('Hello', 0, 0);
下面的语句将得到一个指定内容的搜索结果集。
QUERY: "PUBLIC"."TEST" WHERE "ID"=1
要得到原始的数据,需要使用 FT_SEARCH_DATA('Hello', 0, 0)。结果包含字段SCHEMA (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加入到 classpath中,并且处理相关的依赖,如果你使用H2控制台,你能增加Lucene的jar文件到环境变量H2DRIVERS或CLASSPATH中。通过下面的语句初始化Lucene全文检索:
CREATE ALIAS IF NOT EXISTS FTL_INIT FOR "org.h2.fulltext.FullTextLucene.init";
CALL FTL_INIT();
如果你需要是使用Lucene全文检索,你每个数据库都需要初始化。你也能通过下面的语句创建全文索引表:
CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR);
INSERT INTO TEST VALUES(1, 'Hello World');
CALL FTL_CREATE_INDEX('PUBLIC', 'TEST', NULL);
PUBLIC是schema名, TEST是表名. 字段名列表是可选的,在上面的例子中,所有的字段都被索引,索引的更新是实时的,使用下面的查询语句可以进行搜索:
SELECT * FROM FTL_SEARCH('Hello', 0, 0);
下面的语句将得到一个指定内容的搜索结果集:
QUERY: "PUBLIC"."TEST" WHERE "ID"=1
要得到原始的数据,需要使用FTL_SEARCH_DATA('Hello', 0, 0);.结果包含字段SCHEMA (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);
数据库支持用户自定义变量,自定义变量使用@开头,能够被用于任何表达式和参数中。变量是不能持久的,作为范围为session,这就意味着变量只在定义它的那个session里是有效的。一个变量通常使用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数据库文件中的日期和时间是使用GMT(格林威治时间)。如果数据库被另一个时区的系统打开,日期和时间将根据时区进行换算。如果你希望移动数据从一个时区的系统到另一个时区的系统,并且不希望发生时区换算,你需要使用脚本命令或工具将数据导出为SQL脚本文件,再使用RUNSCRIPT在新时区的系统中导入数据。
通过下面的配置在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方法能防止热振动和重启异常。