运行模式 | 说明 | 启动命令 | JDBC例 |
---|---|---|---|
内存(Memory-Only)模式 | 所有数据都在内存里操作。应用程序退出后则数据被销毁。 无需另外启动HSQLDB Server |
启动方式1:通过程序中首次调用Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:myDbName", "sa", "");时 启动方式2:你也可以在server.properties中指定相同的URL来运行一个Memory-Only(仅处于内存中)服务器实例。 |
jdbc:hsqldb:mem:myDbName |
进程In-Process(Standalone)模式 数据库引擎作为应用程序的一部分在同一个JVM中运行 |
从应用程序启动数据库。因为所有数据被写入到文件中,所以即使应用程序退出后,数据也不会被销毁。 无需另外启动HSQLDB Server |
跟Memory-Only模式一样,In-Process不需要另外启动,通过DriverManager.getConnection(jdbcUriName, "sa", "");方式既可启动 |
数据库文件的路径格式在Linux主机和Windows主机上都被指定采用前斜线(”/”) jdbc:hsqldb:file:/C:/mydb/myDbName jdbc:hsqldb:file:/opt/db/myDbName jdbc:hsqldb:file:myDbName
|
服务器模式 | 该模式下HSQLDB跟其他数据库服务器一样,以服务器的形式被启动。 | 通过java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 myDbName之类的命令启动HSQLDB守护进程。 | jdbc:hsqldb:hsql://localhost:9001/myDbName |
Web服务器模式 | 该模式HSQLDB以WEB服务器的形式启动,并通过HTTP协议接受客户端命令。从1.7.2开始,WEB服务器模式的HSQLDB开始支持事务。 | java -cp ../lib/hsqldb.jar org.hsqldb.WebServer -database.0 mydb -dbname.0 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/45272
http://blog.csdn.net/luxideyao/article/details/19834959
http://maimode.iteye.com/blog/1415644
http://www.cnblogs.com/kenkofox/archive/2010/12/01/1893782.html
内存模式:
package db.hsqldb; import java.sql.*; 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", "sa", ""); 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"); // 插入数据 String sql1 = "INSERT INTO person VALUES('TPP',22,0.3)"; String sql2 = "INSERT INTO person VALUES('WTO','25',0.5)"; // stat.executeUpdate(sql1); // stat.executeUpdate(sql2); conn.setAutoCommit(false); stat.addBatch(sql1); stat.addBatch(sql2); stat.executeBatch(); conn.commit(); conn.setAutoCommit(true); System.out.println("insert data into TABLE:person OK!"); conn.close(); // stat.execute("SHUTDOWN"); conn = DriverManager.getConnection("jdbc:hsqldb:mem:memdb", "sa", ""); // 查询数据 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 OK insert 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.jar
runServer.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(""); } } }
java.sql.ResultSet
getString
String getString(int columnIndex) throws SQLException
- Retrieves the value of the designated column in the current row of this
ResultSet
object as aString
in the Java programming language.
-
- Parameters:
-
columnIndex
- the first column is 1, the second is 2, ... - Returns:
- the column value; if the value is SQL
NULL
, the value returned isnull //需要使用null==value来判断这个字段的值是否存在
- Throws:
-
SQLException
- if the columnIndex is not valid; if a database access error occurs or this method is called on a closed result set