中指定相同的URL来运行一个Memory-Only(仅处于内存中)服务器实例。
进程In-Process(Standalone)模式
数据库引擎作为应用程序的一部分在同一个JVM中运行
数据库文件的路径格式在Linux主机和Windows主机上都被指定采用前斜线(”/”)jdbc:hsqldb:file:/C:/mydb/myDbName jdbc:hsqldb:file:/opt/db/myDbName jdbc:hsqldb:file:myDbName
http://blog.csdn.net/youlianying/article/details/4217292
HSQLDB可以采用几种不同的方式运行。不过可以大致分为Serer模式和In-Process(进程内模式,也称之为Standalone(独立)模式)。对于每种模式,Jar中都有相应的子程序来运行HSQLDB。
每个HSQLDB数据库包含了2到5个命名相同但扩展名不同的文件,这些文件位于同一个目录下。例如,名位“test”的数据库包含了以下几个文件: test.properties test.script test.log test.data test.backup
properties文件描述了数据库的基本配置。 script文件记录了表和其它数据库对象的定义,此外还有non-cached(无缓冲)表的数据。 log文件是用来记录数据库的变动,它在HSQLDB正常关闭的时候会被移除掉。否则(在非正常退出的时候),它将用来在下次启动HSQLDB时重复“test.log”中记录的更新操作. data文件包含了cached(缓冲)表的数据。 backup文件是将data文件压缩备份,它包含了data文件上次的最终状态数据。所有这些文件都是必不可少的,千万不可擅自删除。 但如果你的数据库没有缓冲表(cached table),test.data和test.backup文件是不会存在。此外,HSQLDB数据库可以链接到磁盘上任何地方任何格式的文本文件,比如CSV 列表。 lck文件也可以用来记录数据库是否被打开,它在HSQLDB正常退出的时候会被移除。有些情况下,HSQLDB会生成test.data.old ”文件,但随后会被删除掉。http://blog.itpub.net/47598/viewspace-22397/java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 testdb -dbname.0 testdbname[-database.0 ]、 [dbname.0]为什么在后面加[0]。_... ...我们不是在前面说服务模式运行的时候可以指定10个数据库吗,如有多个数据库,则继续写命令行参数-database.1 aa -dbname.1 aa -database.2 bb-dbname.2 bb ... ...http://cxh61207.iteye.com/blog/904444
in-process(standalone)模式:
这种模式的特点有2个。 第一个特点,顾名思义,standalone。也就是这个数据库是可以不依赖其它任何东西,独立存在,包括数据库引擎。和in-memory模式相比,这种模式的数据是可以持久化的,存在形式就是几个文件。和server方式比,要使用这种模式下的数据库不需要启动任何的server或者监听。 第二个特点,同样可以顾名思义,in-process。这种模式下,数据库引擎和应用程序跑在一个jvm中。对大部分应用,这种模式可以加快速度,因为数据不再需要在网络中传输。但是这种方法也有个缺点,就是process之外的程序,比如database manager,无法看到数据库中的数据。
hsqldb官方推荐:开发的时候用server模式,部署到实际生产环境的时候才用standalone模式。缺省时,数据也是保存在memory中的,如果想要持久化数据,需要在关闭vm之前执行hsqldb的命令 SHUTDOWN。 http://pupi.iteye.com/blog/45272http://blog.csdn.net/luxideyao/article/details/19834959http://maimode.iteye.com/blog/1415644http://www.cnblogs.com/kenkofox/archive/2010/12/01/1893782.html内存模式:
package db.hsqldb;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;public class HsqldbDemo { public static void main(String[] args) throws ClassNotFoundException, SQLException { // 加载HSQLDB的JDBC驱动 Class.forName("org.hsqldb.jdbcDriver"); // 在内存中建立数据库memdb,用户名为sa,密码为空 Connection conn = DriverManager.getConnection("jdbc:hsqldb:mem:memdb", "username", "password"); Statement stat = conn.createStatement(); // 新建数据表 stat.executeUpdate("create table person(NAME VARCHAR(20), AGE INTEGER,estate DECIMAL(15,6))"); System.out.println("create TABLE:person OK"); // 插入数据 stat.executeUpdate("INSERT INTO person VALUES(‘TPP‘,22,0.3)"); stat.executeUpdate("INSERT INTO person VALUES(‘WTO‘,‘25‘,0.5)"); System.out.println("insert data into TABLE:person OK!"); conn.close(); // stat.execute("SHUTDOWN"); conn = DriverManager.getConnection("jdbc:hsqldb:mem:memdb", "username", "password"); // 查询数据 PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM person"); ResultSet rs = pstmt.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); while (rs.next()) { for (int i = 1; i <= rsmd.getColumnCount(); i++) { System.out.print(rsmd.getColumnLabel(i) + ":" + rs.getString(i) + " "); } System.out.println(""); } }}
Output:
create TABLE:person OKinsert data into TABLE:person OK!NAME:TPP AGE:22 ESTATE:0.300000 NAME:WTO AGE:25 ESTATE:0.500000
Server模式:目录结构:│ runServer.bat│├─data└─lib hsqldb.jarrunServer.bat:
cd data@java -classpath ../lib/hsqldb.jar org.hsqldb.server.Server -port 9001 -database.0 file:../data/mydb -dbname.0 mydb
package db.hsqldb;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;public class HsqlDemo { public static void main(String[] args) throws ClassNotFoundException, SQLException { Class.forName("org.hsqldb.jdbcDriver"); Connection conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:9001/mydb", "sa", ""); System.out.println("Connected db success!"); String sql = "CREATE TABLE TBL_USERS(ID INTEGER, NAME VARCHAR(20), BIRTHDAY DATE);"; Statement st = conn.createStatement(); st.execute(sql); sql = "INSERT INTO TBL_USERS(ID, NAME, BIRTHDAY) VALUES (‘1‘, ‘ADMIN‘, SYSDATE);"; st.executeUpdate(sql); PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM TBL_USERS"); ResultSet rs = pstmt.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); while (rs.next()) { for (int i = 1; i <= rsmd.getColumnCount(); i++) { System.out.print(rsmd.getColumnLabel(i) + ":" + rs.getString(i) + " "); } System.out.println(""); } }}
HSQLDB相关信息及用法汇总
标签:
小编还为您整理了以下内容,可能对您也有帮助:
现在Oracle中有一张表,要使用sqoop实时增量导入,没有自增id,也没有对应时间,怎么办?
sqoop使用hsql来存储job信息,开启metastor service将job信息共享,所有node上的sqoop都可以运行同一个job
一、sqoop的配置文件在sqoop.site.xml中:
1、sqoop.metastore.server.location
本地存储路径,默认在tmp下,改为其他路径
2、sqoop.metastore.server.port
metastore service端口号
3、sqoop.metastore.client.autoconnect.url
sqoop自动连接的metastore地址,默认是本地的metastore地址
4、sqoop.metastore.client.enable.autoconnect
开启自动连接。sqoop默认连接本地metastore。注释这个配置会开启自动连接。
二、开启metastore service
sqoop下,nohup bin/sqoop metastore
三、创建job
sqoop支持两种增量导入模式,
一种是 append,即通过指定一个递增的列,比如:
--incremental append --check-column num_iid --last-value 0
varchar类型的check字段也可以通过这种方式增量导入(ID为varchar类型的递增数字):
--incremental append --check-column ID --last-value 8
另种是可以根据时间戳,比如:
--incremental lastmodified --check-column created --last-value '2012-02-01 11:0:00'
就是只导入created 比'2012-02-01 11:0:00'更大的数据。
bin/sqoop job --meta-connect jdbc:hsqldb:hsql://10.106.1.234:16000/sqoop --create job_zyztest13 -- import --connect jdbc:oracle:thin:@10.106.1.236:1521:orcl --username SQOOP --password sqoop --table LXC_TEST_HBASE_TO_ORACLE --columns NAME,SEX,AGE,CSRQ -m 1 --hbase-table SQOOP_IMPORT_TEST3 --column-family info --hbase-row-key NAME --split-by NAME --incremental lastmodified --check-column CSRQ --last-value '2012-02-01 11:0:00' --verbose
nohup /opt/hadoopcluster/sqoop-1.4.2.bin__hadoop-2.0.0-alpha/bin/sqoop job --exec job_zyztest13 > job_zyztest13.out 2>&1 &
此时,在10.106.1.234上创建了job_zyztest13这个job,通过bin/sqoop job --meta-connect jdbc:hsqldb:hsql://10.106.1.234:16000/sqoop --list可以查看所有job
四、定时执行
使用linux定时器:crontab -e
编辑定时器,添加*/4 * * * * /opt/hadoopcluster/sqoop-1.4.2.bin__hadoop-2.0.0-alpha/bin/sqoop job --meta-connect jdbc:hsqldb:hsql://10.106.1.234:16000/sqoop --exec job_zyztest13 > job_zyztest13.out 2>&1 & 任务将会每四分钟执行一次
Windows下怎么打开hsqldb的操作界面
Hsqldb是一个开放源代码的JAVA数据库,其具有标准的SQL语法和JAVA接口,它可以自由使用和分发,非常简洁和快速的。具有Server模式,进程内模式(In-Process)和内存模式(Memory-Only)三种。运行Hsqldb需要hsqldb.jar包, 它包含了一些组件和程序。每个程序需要不同的命令来运行。它位于项目的lib目录下,目前的版本是1.8.0.5。官方的下载地址是:http://prdownloads.sourceforge.net/hsqldb/hsqldb_1_8_0_5.zip?download
在介绍这些模式之前我们需要了解一些Hsqldb所涉及的一些文件。每个Hsqld数据库包含了2到5个命名相同但扩展名不同的文件,这些文件位于同一个目录下。例如,名位"test"的数据库包含了以下几个文件:
test.properties <o:p></o:p>
test.script <o:p></o:p>
test.log <o:p></o:p>
test.data <o:p></o:p>
test.backup
properties文件描述了数据库的基本配置。 script文件记录了表和其它数据库对象的定义。log文件记录了数据库最近所做的更新。data文件包含了cached(缓冲)表的数据,而backup文件是将data文件压缩备份,它包含了data文件上次的最终状态数据。所有这些文件都是必不可少的,千万不可擅自删除。但如果你的数据库没有缓冲表(cached table),test.data和test.backup文件是不会存在。
接下来我们对Hsqldb的三种模式进行简单介绍,同时包括部分工具的启动的方式。
<o:p>一、 Server模式</o:p>
Server模式提供了最大的可访问性。应用程序(客户端)通过Hsqldb的JDBC驱动连接服务器。在服务器模式中,服务器在运行的时候可以被指定为最多10个数据库。根据客户端和服务器之间通信协议的不同,Server模式可以分为以下三种:
1、 Hsqldb Serve
这种模式是首选的也是最快的。它采用HSQLDB专有的通信协议。启动服务器需要编写批处理命令。Hsqldb提供的所有工具都能以java class归档文件(也就是jar)的标准方式运行。假如hsqldb.jar位于相对于当前路径的../lib下面。我们的命令将这样写:
java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 demoDB
现在你可能会疑惑,[-database.0 ]、 [dbname.0]为什么在后面加[0]。_... ...我们不是在前面说服务模式运行的时候可以指定10个数据库吗,如有多个数据库,则继续写命令行参数-database.1 aa -dbname.1 aa -database.2 bb-dbname.2 bb ... ...
新建文本文件保存上面命令,文件名可以随意,将后缀名改成bat,然后直接执行批处理文件即可。在以后介绍的执行启动工具的命令采用同样方法。
上面启动服务器的命令启动了带有一个(默认为一个数据库)数据库的服务器,这个数据库是一个名为"mydb.*"文件,这些文件就是mydb.Properties、mydb.script、mydb.log等文件。其中demoDB是mydb的别名,可在连接数据库时使用。<o:p></o:p>
<o:p>2、 Hsqldb Web Server</o:p>
<o:p> 这种模式只能用在通过HTTP协议访问数据库服务器主机,采用这种模式唯一的原因是客户端或服务器端的防火墙对数据库对网络连接强加了。其他情况下,这种模式不推荐被使用。</o:p>
<o:p> 运行web服务器的时候,只要将刚才命令行中的主类(main class)替换成:org.hsqldb.WebServer</o:p><o:p></o:p>
3、 Hsqldb Servlet
这种模式和Web Server一样都采用HTTP协议,当如Tomcat或Resin等servlet引擎(或应用服务器)提供数据库的访问时,可以使用这种模式。但是Servlet模式不能脱离servlet引擎启动。为了提供数据库的连接,必须将HSQLDB.jar中的hsqlServlet类放置在应用服务器的相应位置。
Web Server和Servlet模式都只能在客户端通过JDBC驱动来访问。Servlet模式只能启动一个单独的数据库。请注意做为应用程序服务器的数据库引擎通常不使用这种模式。<o:p></o:p>
连接到以Server模式运行的数据库
当HSQLDB服务器运行时,客户端程序就可以通过hsqldb.jar中带有的HSQLDB JDBC Driver连接数据库。
java 代码
try{
Class.forName("org.hsqldb.jdbcDriver") ;
}catch(ClassNotFoundException e){
e.printStackTrace();
}
Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb", "sa", "");
注:hsqldb的默认用户是sa密码为空。修改默认密码的方法我们将在工具使用部分做出介绍。
<o:p></o:p> 二、 In-Process模式
In-Process模式又称Standalone模式。这种模式下,数据库引擎作为应用程序的一部分在同一个JVM中运行。对于一些应用程序来说, 这种模式因为数据不用转换和通过网络的传送而使得速度更快一些。其主要的缺点就是默认的不能从应用程序外连接到数据库。所以当应用程序正在运行的时候,你不能使用类似于Database Manager的外部工具来查看数据库的内容。在<st1:chsdate isrocdate="False" w:st="on" year="1899" day="30" islunardate="False" month="12">1.8.0</st1:chsdate>版本中,你可以从同一个JVM的一个线程里面来运行一个服务器实例,从而可以提供外部连接来访问你的In-Process数据库。
推荐的使用In-Process模式方式是:开发的时候为数据库使用一个HSQLDB 服务器实例,然后在部属的时候转换到In-Process内模式。
一个In-Process模式数据库是从JDBC语句开始启动的,在连接URL中带有指定的数据库文件路径作为JDBC的一部分。例如,假如数据库名称为testdb,它的数据库文件位于与确定的运行应用程序命令相同的目录下,下面的代码可以用来连接数据库:
Connection c = DriverManager.getConnection("jdbc:hsqldb:file:testdb<v:shapetype id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" filled="f" stroked="f" coordsize="21600,21600" o:spt="75"> <v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" o:extrusionok="f" gradientshapeok="t"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id="_x0000_i1025" title="" style="WIDTH: 5.25pt; HEIGHT: 5.25pt" alt="" outside="" page="" o:button="t" type="#_x0000_t75" visit=""><v:imagedata src="file:///C:\DOCUME~1\lunch\LOCALS~1\Temp\msohtml1\12\clip_image001.gif" o:href="http://130.1.11.14:7001/wiki/images/icons/linkext7.gif"></v:imagedata></v:shape>", "sa", "");
数据库文件的路径格式在Linux主机和Windows主机上都被指定采用前斜线("/")。所以相对路径或者是相对于相同分区下相同目录路径的表达方式是一致的。使用相对路径的时候,这些路径表示的是相对于用于启动JVM的shell命令的执行路径。
三、Memry-Only数据库
Memory-Only数据库不是持久化的而是全部在随机访问的内存中。因为没有任何信息写在磁盘上。这种模式通过mem:协议的方式来指定:
Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:dbName", "sa", "");
你也可以在server.properties中指定相同的URL来运行一个Memory-Only(仅处于内存中)服务器实例。
注意事项:当一个服务器实例启动或者建立一个in-process数据库连接的时候,如果指定的路径没有数据库存在,那么就会创建一个新的空的数据库。这个特点的副作用就是让那些新用户产生疑惑。在指定连接已存在的数据库路径的时候,如果出现了什么错误的话,就会建立一个指向新数据库的连接。为了解决这个问题,你可以指定一个连接属性ifexists=true只允许和已存在的数据库建立连接而避免创建新的数据库,如果数据库不存在的话,getConnection()方法将会抛出异常。
四、 工具的使用
Hsqldb提供的主要的工具类:
org.hsqldb.util.DatabaseManager
org.hsqldb.util.DatabaseManagerSwing
org.hsqldb.util.Transfer
org.hsqldb.util.QueryTool
org.hsqldb.util.SqlTool
其中DatabaseManage和Sql Tool,只能用命令行参数来运行。你可以在命令行后面加上参数-?来查看这些工具可用的参数列表。其他工具可以通过DatabaseManager的主界面启动,便于交互式操作。
为了便于操作,我们同样把这些工具启动的命令做成批处理文件。方法和前面我们所介绍的创建启动服务模式命令的方法一样。在这里我们再强调一次hsqldb.jar的位置,因为所有启动命令都是参照hsqldb.jar的位置编写的
如果您觉得麻烦你也可以采用绝对路径编写命令。
现在我们一起运行AWT版本的DatabaseManager工具,hsqldb.jar位于相对于当前路径的../lib下面,命令如下:
Java -cp ../lib/hsqldb.jar org.hsqldb.util.DatabaseManager
将命令保存为后缀名为bat的批处理文件,保存为DatabaseManager.bat,也可根据个人习惯命名。执行DatabaseManager.bat你将看到如下画面:。
现在对这个简洁的登录界面做个简单的介绍*_*
Recent:选择你最近的登录方案,[可选]
Setting Name:本次登录方案名称,如果本次登录成功,那么等你下次登录的时候在Recent下拉列表中将看到你的成功登录方案[可选]
Type:登录模式,其中包括In-Memory模式、Standalone(In-process)模式、Server模式、WebServer模式... ...[必选]
Driver:连接数据库的驱动程序[必选]
URL:连接数据库的URL[必选]
User:用户名[必选]
Password:密码[ 除非密码为空]
注:如果Type项选择Server模式或者WebServer模式需要你事先启动与之对应的服务模式。而Standalone(In-process)默认是不支持DatabaseManager连接的,具体原因我们已经在前面解释过。至于In-Memory可以随意登录,所有的操作数据都不会记录在本地磁盘。而Type还有很多其他选项,具体的用法可以参考官方文档,位置在hsqldb目录\doc\guide\ guide.pdf。
如果你想运行DatabaseManagerSwing也很简单,相信你已经想到了。我们只需要把启动DatabaseManager命令修改成:
Java -cp ../lib/hsqldb.jar org.hsqldb.util. DatabaseManagerSwing
两种工具的操作方法类似,这里就不再赘述。
差点忘记,前面我说过要给出修改sa用户密码的方法。最后再占用大家一点点时间。当你用SA通过DatabaseManager登录成功后会出现如下界面:
在右上方的空白区域输入set password "newpassword" 点击执行即可。
到这里我们对Hsqldb的简单介绍就结束了。
本文参考自Hsqldb的官方文档,个人水平有限难免出现错误,
SQL实战新手入门:EXCEPT和MINUS操作符
EXCEPT和MINUS操作符
数据库程序设计的目标就是最大限度地减少需要通过网络传送的数据量 并消除客户端不必要的处理过程 也就是说 只向RDBMS请求需要的数据 不触动其余任何之物 INTERSECT操作符可以求取两个查询结果的交集 而EXCEPT操作符则用于求取两个查询结果的差集
INTERSECT操作符和EXCEPT操作符是一种便利的表示方式 可以使用INNER JOIN和OUTER JOIN来分别替代它们(加上某些调整 消除重复的记录)
在上面的例子中 如果使用EXCEPT操作符代替INTERSECT操作符 查询结果将显示在书柜上还没有分配到位置的所有图书(即在LOCATION表中没有相应的记录)
SELECT bk_id FROM books
EXCEPT
SELECT fk_bk_loc FROM location;
bk_id
( row(s) affected)
该查询仅返回在BOOKS表中存在的同时在LOCATION表中不存在相应记录的记录 在本章结尾的练习中将尝试使用INTERSECT操作符和EXCEPT操作符
可以使用NOT EXISTS操作符和相关子查询来代替EXCEPT(或MINUS)关键字 虽然没有获得SQL标准委员会的官方支持 但所有RDBMS都支持这种语法(除了在OpenOffice中作为嵌入式RDBMS的HSQLDB例外)
DB Microsoft SQL Server和PostgreSQL都实现了EXCEPT关键字 Oracle则使用MINUS关键字 MySQL和HSQLDB既支持EXCEPT操作符 又支持MINUS关键字 Microsoft Access对两者都不支持
试一试求取数据集的差集
为了进一步观察数据集操作符(例如INTERSECT操作符和EXCEPT操作符)的使用 下面将在已经完美匹配的数据中添加一些新数据 在本章之前讨论LEFT OUTER JOIN时已经执行过类似的操作 在下面的练习中可以再次使用相同的记录
接下来将在BOOKS表中添加一条不匹配的记录 用于演示INTERSECT操作符和EXCEPT操作符的应用
( ) 打开Microsoft SQL Server Management Studio 使用Windows身份验证连接到数据库
( ) 单击位于左上角的New Query按钮
( ) 在打开的查询窗口(中间的窗格)中输入下面的SQL查询
INSERT INTO books (bk_id bk_title)
VALUES ( UNMATCHED RECORD )
( ) 现在BOOKS表中已经具有一条新记录 该记录在LOCATION表中没有对应的位置 此时使用INTERSECT操作符和EXCEPT操作符将查询到什么结果呢?首先 执行一个使用INTERSECT操作符的查询
SELECT bk_id FROM books
INTERSECT
SELECT fk_bk_loc FROM location;
( ) 可以预见 该查询只会返回 条记录 BOOKS表与LOCATION表中都匹配的记录
( ) 运行使用EXCEPT操作符的查询将产生一个不同的结果
SELECT bk_id FROM books
EXCEPT
SELECT fk_bk_loc FROM location;
bk_id
( row(s) affected)
示例说明
在将一条新记录插入到BOOKS表之后 BOOKS表中包含了 条记录 但只有 条记录在LOCATION表中具有相匹配的记录 这模拟了买到一本新书但还没有在书柜中分配图书摆放位置的情形 INTERSECT操作符仅返回那些在两个表中都匹配的记录 因此 BK_ID = 的记录将被排除在外
当运行EXCEPT查询时 将分别从BOOKS表和LOCATION表中抽取匹配的记录 并将不匹配的记录返回 在本例中 不匹配的记录就是新插入的UNMATCHED RECORD这条记录
返回目录 SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
lishixin/Article/program/SQL/201311/16454