hsqldb.jar包
这个包位于/lib目录下包括一些组件和程序,可以用不同的命令来启动这些程序。hsqldb.jar中的组件:
HSQLDB RDBMS HSQLDB JDBC Driver Database Manager (Swing and AWT versions) Transfer Tool (AWT version) Query Tool (AWT) Sql Tool (command line) |
java -cp ../lib/hsqldb.jar org.hsqldb.util.DatabaseManager java -cp hsqldb.jar org.hsqldb.util.DatabaseManager |
org.hsqldb.util.DatabaseManager org.hsqldb.util.DatabaseManagerSwing org.hsqldb.util.Transfer org.hsqldb.util.QueryTool org.hsqldb.util.SqlTool |
test.properties test.script test.log test.data test.backup |
properties文件包含数据库的一般配置。script文件包含表的定义,其他数据库对象,以及non-cached表的数据。log文件则包含数据库最近的更新。data文件包含cached表的数据,backup文件则是上次持久化后的data文件的打包文件。这些文件都是有用的不能被删除。如果数据库没有cached表,则.data和.backup文件是不会存在的。
当test数据库被操作的时候,test.log文件被用来纪录数据的修改。这个文件在数据库正常关闭时会被删除掉,否则(非正常关闭)这个文件将会用来在下次启动时重新更新数据。一个test.lck文件用来纪录数据库是打开的。这个文件也会在正常关闭时删除。在某些情况下,test.data.old会被创建接着被删除。
注意:当引擎关闭数据库的时候,它将会创建以.new为后缀的临时文件,再将它们重命名为上述这些文件。
Server模式
Server模式提供了最大的可访问性。在这种模式下,数据库引擎运行在一个JVM中,并且监听同一台机器上或网络上其他机器上程序的连接。几个不同的程序可以连接到服务并且取得和更新信息。应用程序通过HSQLDB JDBC驱动连接数据库。
根据客户端和服务器通信的协议不同,Server模式可以分为以下三种:
Hsqldb Server:
这种模式是首选的并且是最快的。它使用hsqldb私有的通信协议。启动数据库的命令和上面的启动工具的命令差不多,以下就是一个例子,它将启动一个文件名为"mydb.*"的数据库服务。
java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 xdb |
try { Class.forName("org.hsqldb.jdbcDriver" ); } catch (Exception e) { System.out.println("ERROR: failed to load HSQLDB JDBC driver."); e.printStackTrace(); return; } Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb", "sa", ""); |
Class.forName("org.hsqldb.jdbcDriver").newInstance(); |
Connection c = DriverManager.getConnection("jdbc:hsqldb:file:testdb", "sa", ""); |
Connection c = DriverManager.getConnection("jdbc:hsqldb:file:/opt/db/testdb", "sa", ""); |
Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:aname", "sa", ""); |
前面已经看到HSQLDB可以在同一个JVM中以服务的形式启动,我们可以在应用启动的时候,比如在app加载的时候,在listener中启动数据库,然后就可以使用数据库了,不需要再去专门启动数据库。
下面是我写的DatabaseThread以及测试代码,可以把启动的工作放到app加载的时候。
package rst.hsqldb.start; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.hsqldb.Server; import junit.framework.TestCase; /** * Class description. * * @author rst */ public class TestStartServerInCode extends TestCase { /* * @see TestCase#setUp() */ protected void setUp() throws Exception { DatabaseThread db = new DatabaseThread(); //mostly can add 10 database instance. db.addDatabase("db/db"); new Thread(db).run(); //wait for finishing start. Thread.sleep(5000); } /* * @see TestCase#tearDown() */ protected void tearDown() throws Exception { } public void testStart() throws ClassNotFoundException, SQLException{ Class.forName("org.hsqldb.jdbcDriver"); Connection conn=DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/db;ifexists=true","sa",""); assertNotNull(conn); conn.close(); } } class DatabaseThread implements Runnable { private String address = "localhost"; private int port = 9001; private boolean silent = true; private boolean trace = true; private List databases = new ArrayList(); public void addDatabase(String path){ databases.add(path); } /** * @return Returns the address. */ public String getAddress() { return address; } /** * @param address The address to set. */ public void setAddress(String address) { this.address = address; } /** * @return Returns the databases. */ public List getDatabases() { return databases; } /** * @param databases The databases to set. */ public void setDatabases(List databases) { this.databases = databases; } /** * @return Returns the dbnames. */ public String[] getDbnames() { return dbnames; } /** * @param dbnames The dbnames to set. */ public void setDbnames(String[] dbnames) { this.dbnames = dbnames; } /** * @return Returns the port. */ public int getPort() { return port; } /** * @param port The port to set. */ public void setPort(int port) { this.port = port; } /** * @return Returns the silenct. */ public boolean isSilent() { return silent; } /** * @param silenct The silenct to set. */ public void setSilent(boolean silent) { this.silent = silent; } /** * @return Returns the trace. */ public boolean isTrace() { return trace; } /** * @param trace The trace to set. */ public void setTrace(boolean trace) { this.trace = trace; } private String[] dbnames; /* (non-Javadoc) * @see java.lang.Runnable#run() */ public void run() { String[] args = null; ArrayList list = new ArrayList(); if(address != null){ list.add("-address"); list.add(address); } if(port != 0){ list.add("-port"); list.add(""+port); } list.add("-silent"); list.add("" + silent); list.add("-trace"); list.add("" + trace); for(int i = 0; i < databases.size(); i++){ list.add("-database." + i); list.add((String) databases.get(i)); list.add("-dbname." + i); String database = (String) databases.get(i); String dbname = database.substring(database.lastIndexOf("/")+1); list.add(dbname); } //args = (String[]) list.toArray(); args = new String[list.size()]; for(int i = 0; i < list.size(); i++){ args = (String) list.get(i); System.out.println(args); } //System.out.println(args); //调用HSQLDB的服务入口 Server.main(args); } } |