HsqlDB使用
來源:http://blog.csdn.net/xubo578/article/details/5191061
服務的安裝,下載解壓即安裝?
HSQLDB服務器模式的啟動方法?
In-Process、Memory-Only模式無需另外啟動HSQLDB?
服務器模式的處理流程(創建和啟動mydb數據庫):?
1.?數據庫安裝文件跟目錄,創建mydb文件夾?
2.?創建runMydb.bat?
java -cp ../lib/hsqldb.jar org.hsqldb.Server -database mydb?
或?
java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 mydb?
3.?創建manageMydb.bat?
java -cp ../lib/hsqldb.jar org.hsqldb.Server -database mydb?
或?
java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 mydb?
4.?主要的工具類?
org.hsqldb.util.DatabaseManager?
org.hsqldb.util.DatabaseManagerSwing?
org.hsqldb.util.Transfer?
org.hsqldb.util.QueryTool?
org.hsqldb.util.SqlTool?
5.?使用JDBC連接HSQLDB數據庫?
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/mydb", "sa", "");?
6. Hibernate中使用HSQLDB hibernate.cfg.xml?
7. <hibernate-configuration>?
??? <session-factory>?
...?
??????? <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>?
????????
??????? <property name="connection.url">jdbc:hsqldb:hsql://localhost/mydb</property>?
??????? <property name="connection.username">sa</property>?
??????? <property name="connection.password"></property>?
????????
??????? <property name="dialect">org.hibernate.dialect.HSQLDialect</property>?
...?
??? </session-factory>?
</hibernate-configuration>?
8.?????數據庫具體表、數據的創建應該可以在?manage客戶端進行(一般都是applet或者web頁面)?
本地聯系? mytest數據庫,通過?管理客戶端進行數據庫的設計?
問題:?HSQL的SQL語句的規則?
通過link(http://zeroliu.blogdriver.com/zeroliu/1242671.html)的學習了解到?HSQL號稱內存數據,在內存模式下所有數據不會保持;單機、服務器等模式下?所有的數據庫操作會保存到一個?database.script?中,再次啟動HSQLDB的時候?會快速的運行這個腳本回復數據庫?
1.內存駐留模式中只允許有一個數據庫連接,所以在進行處理的時候要注意數據庫連接的釋放?
Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:aname", "sa", "");?
2.單機模式,應用程序使用JDBC創建數據庫連接,并且hsqldb引擎作為應用程序的一部分運行在同一個jvm之下。此時數據庫只允許一個應用去訪問,也就是應用程序無法和數據庫管理同時進行,適合部署模式?
jdbc:hsqldb:zzq?
或者?jdbc:hsqldb:c:/db/zzq?
3.服務器模式,允許使用TCP套接字的并發鏈接?
java -cp ../lib/hsqldb.jar org.hsqldb.Server ?database zzq?
4.web服務器模式,db以web服務器的形式啟動,允許jdbc驅動通過http執行sql;也可以以標準的servlet運行,運用于需要穿透防火墻的情況?
Java org.hsqldb.WebServer ?database zzq?
回到上面的問題,hsql的腳步可以在?database.script?里面閱讀?
CREATE MEMORY TABLE CUSTOMER(ID INTEGER NOT NULL PRIMARY KEY,FIRSTNAME VARCHAR,LASTNAME VARCHAR,STREET VARCHAR,CITY VARCHAR)?
CREATE SEQUENCE S_PROCESS_UNIFY_SENDER AS INTEGER START WITH 0?
CREATE SCHEMA PUBLIC AUTHORIZATION DBA?
CREATE INDEX INDEX_PROCESS_PI ON PROCESS_INSTANCE(TEMPLATENAME,DRAFTERNAME,STATUS)?
GRANT DBA TO SA?
INSERT INTO PROCESS_TEMPLATE VALUES('ContractSupport',''.....)
?
?
?
具體例子:
?
1.Server模式
首先要啟動server?端:
例如,在命令行窗口執行:
1.??????E:/1008/study/hsqldb/hsqldb_1_8_0_9/hsqldb/lib>java?-cp?hsqldb.jar?org.hsqldb.Se ??
2.??????rver?-database.0?file:c:/hsqldb/xxx?-dbname.0?x?-database.1?c:/hsqldb/test/mydat ??
3.??????abase2?-dbname.1?db2??
?
創建了2個數據庫,如:database.0 database.1?最多只能創建10個
dbname.0 x ,dbname.1 db2這里的x和db2都是給客戶端鏈接時使用的。
database.0 file:c:/hsqldb/xxx,database.1 c:/hsqldb/test/mydatabase2?這里的xxx和mydatabase2是hsqldb文件的文件名,客戶端鏈接時不能使用這個名字
然后啟動工具窗口可以對建立的數據庫進行操作。比如:
java?代碼
1.??????E:/1008/study/hsqldb/hsqldb_1_8_0_9/hsqldb/lib>java?-cp?hsqldb.jar?org.hsqldb.util.DatabaseManager??
?
?這時會彈出一個工具窗口,可以對其進行設置
Recent:選擇你最近的登錄方案,[可選]?
Setting Name:本次登錄方案名稱,如果本次登錄成功,那么等你下次登錄的時候在Recent下拉列表中將看到你的成功登錄方案[可選]?
Type:登錄模式,其中包括In-Memory模式、Standalone(In-process)模式、Server模式、WebServer模式... ...[必選]?
Driver:連接數據庫的驅動程序[必選]?
URL:連接數據庫的URL[必選]?
User:用戶名[必選]?
Password:密碼[?除非密碼為空]?,默認密碼是為空的,可以登錄后對密碼進行修改。只需要set password "123456",修改的只是當前鏈接的數據庫,對其它數據庫沒有影響,hsqldb可以看著是一個庫一個密碼
2.?嵌入式In-Process打開
In-Process方式不用啟動Server,直接設定JDBC URL即可,非常方便。但有一個缺點是只能在Java進程內共享信息,如果另外打開一個管理器,是沒辦法看到In-Process時的狀態
1.??????jdbc:hsqldb:file:C:/hsqldb/testdb??
?
其中路徑是script文件不帶后綴名的全路徑,可以絕對路徑,也可以是打開應用的相對路徑。
另外有一種讀取jar/classpath中的script文件的In-Process方式,方便發布war時不知道具體路徑的情況。不過這種方式是只讀不存盤的,利用來單元測試也不錯。下面的設置將讀取classpath根目錄下的test.script
1.??????jdbc:hsqldb:res:/hsqldb/testdb??
?
3.Memory方式打開
與In-Process方式最大區別是不能讀取Script文件進行初始化
1.??????Connection?c?=?DriverManager.getConnection("jdbc:hsqldb:mem:dbName",?"sa",?"");??
?
注意事項:當一個服務器實例啟動或者建立一個in-process數據庫連接的時候,如果指定的路徑沒有數據庫存在,那么就會創建一個新的空的數據庫。這個特點的副作用就是讓那些新用戶產生疑惑。在指定連接已存在的數據庫路徑的時候,如果出現了什么錯誤的話,就會建立一個指向新數據庫的連接。為了解決這個問題,你可以指定一個連接屬性ifexists=true只允許和已存在的數據庫建立連接而避免創建新的數據庫,如果數據庫不存在的話,getConnection()方法將會拋出異常。
在hibernate中,使用hsql中,如果設置主鍵類型用Idenetity,那么java的field用Integer類型,不能用Long。
當你啟動數據庫執行創建表,增加數據的時候就會生成對應的sql語句。刪除操作不會記錄在script文件中。如果沒有以正確的方式退出hsqldb那么會增加*.lck和*.log文件,來記錄你的操作,直到你正確保存數據并且退出數據庫,這兩個文件才會消失。?
正確的退出數據庫是執行shutdown命令
比如:
1.??????public?class?Test?{ ??
2.????????
3.??????????public?static?void?main(String[]?args){ ??
4.??????????????try{???? ??
5.??????????????????Class.forName("org.hsqldb.jdbcDriver");?????????? ??
6.??????????????????Connection?conn?=?DriverManager.getConnection("jdbc:hsqldb:file:C:/hsqldb/testdb4/mydb4","sa","");???? ??
7.??????????????????Statement??st?=?conn.createStatement();?//?statement?objects?can?be?reused?with???????
8.??????????????????ResultSet??rs?=?st.executeQuery("select?*?from?users");?//?run?the?query???????
9.??????????????????while(rs.next()){??? ??
10.??????????????????String?s1=rs.getString("name");???? ??
11.??????????????????System.out.println(s1); ??
12.??????????????} ??
13.??????????????st.close();???? ??
14.??????????????st?=?conn.createStatement();???? ??
15.??????????????st.execute("SHUTDOWN");???? ??
16.??????????????conn.close();?//?if?there?are?no?other?open?connection???????
17.??????????????}catch(Exception?e){???? ??
18.??????????????????e=null;???? ??
19.??????????????????e.printStackTrace(); ??
20.??????????????}??? ??
21.????
22.??????} ??
23.??}?
總結
- 上一篇: 开银行卡需要花钱么
- 下一篇: springsecurity-sampl