<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    數據庫環境配置和使用

    首先從http://www.hsqldb.org/下載一個hsqldb的穩定版本,解壓后可以瀏覽解壓目錄下的index.html,它描述了各個目錄所包含內容,在doc段里有一個重要的鏈接User Guide: index.html,有空好好研究吧!

    ?

    數據庫實例創建

    hsqldb的管理中,如果啟動的數據庫文件不存在,就新建該數據庫文件。

    Hsldb啟動

    Hsqldb的啟動模式有三種主要模式,其他參見User Guide:

    l??????? Server

    該模式就像啟動mysql、oracle等數據庫一樣,數據庫啟動后作為一個服務存在,其他數據庫工具可以通過jdbc的方式訪問他,這是我們最熟悉的模式。啟動腳本如下:

    java -cp hsqldb.jar org.hsqldb.Server -database.0 ./db/test -dbname.0 test

    后面參數:

    -database.n 數據庫文件(其他數據庫中對應:數據庫實例)地址,支持相對路徑,注意使用反斜杠

    -dbname.n 數據庫文件的訪問同義詞,就是用這個名稱訪問數據庫的

    server模式jdbc訪問方式:

    Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:9002/test", "sa", "");

    ?

    可以啟動多個數據庫文件,例如:

    java -cp hsqldb.jar org.hsqldb.Server -database.0 ./db/test0 -dbname.0 test0? -database.1 ./db/test1 -dbname.1 test1

    ?

    l??????? In-Process (Standalone)

    該模式更接近于文件型數據庫這個概念,當你訪問時他就啟動,這種模式訪問速度最快,缺點是只能當前訪問線程使用,其他數據庫工具不能同時訪問。例如jdbc訪問:

    Connection c = DriverManager.getConnection("jdbc:hsqldb:file:/opt/db/testdb", "sa", "");

    ?

    ?

    l??????? In-Memory

    顧名思義,內存中的數據庫,你所做的數據庫ddl、dml不會寫入磁盤,也是當你訪問時他就啟動。例如jdbc訪問:

    Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:aname", "sa", "");

    ?

    Hsqldb 管理工具

    hsqldb.jar中自帶了一個數據庫管理工具:DatabaseManagerSwing(Swing界面,還有一個是Awt界面的:DatabaseManager),該工具可以通過jdbc訪問多種數據庫。

    我們使用server模式啟動hsqldb數據庫,然后運行下列命令:

    java -cp hsqldb.jar org.hsqldb.util.DatabaseManagerSwing

    就可打開主界面

    ?

    連接時注意選擇:Type,應該是HSQL Database Engine Server

    對于第一次使用可以使用它自帶的功能,創建一些測試表,挺好的吧:

    [圖片1]

    好了你就可以寫些語法數據庫語法了:

    [圖片2]

    你可以直接關閉它但數據庫不受影響,仍然啟動著。

    [圖片3]

    Hsldb關閉

    對于任何一種啟動模式,都可以在輸入sql腳本的狀態輸入:SHUTDOWN 或 SHUTDOWN COMPACT 語法來關閉數據庫。

    對于In-process和In-memory這兩種模式只要所有的連接關閉了,數據庫也就關閉了。

    ?

    Server模式參數設置

    server模式下可以設置一些參數,主要的例如訪問端口,可以參見User Guide的第四章高級屬性,一般我們可以在啟動腳本的目錄下編輯一個server.properties,內容如下:

    server.port=9002

    server.trace=true

    ?

    ?

    Sqltool工具使用

    ?

    在目錄src\org\hsqldb\sample下有一個sqltool.rc文件,將其拷貝到工具使用命令目錄中,修改如下片斷:

    urlid test

    url jdbc:hsqldb:hsql://localhost:9002/test

    username sa

    password

    其中urlid就是啟動hsqldb的參數-dbname.0 test

    ?

    然后使用如下命令:

    java -jar hsqldb.jar --sql "select * from customer" --rcfile sqltool.rc test

    ?

    大家可以通過“java -jar hsqldb.jar –help”看看其他的參數

    ?

    好了給大家一個整理的壓縮包[下載],別忘了裝jdk1.4

    ?

    ?

    web應用中嵌入hsqldb

    寫一個Listener

    hsqldb嵌入到web應用首要解決的問題是數據庫的啟動和關閉問題,參考springside項目的方法加入一個容器級的Listener,代碼如下:

    import java.sql.Connection;

    import java.sql.DriverManager;

    import java.sql.Statement;

    ?

    import javax.servlet.ServletContextEvent;

    import javax.servlet.ServletContextListener;

    ?

    import org.apache.commons.lang.StringUtils;

    import org.apache.log4j.Logger;

    import org.hsqldb.Server;

    ?

    /**

    ?* 該類的職責是在WebApp啟動時自動開啟HSQL服務. 依然使用Server方式,不受AppServer的影響.

    ?*

    ?* @author frank

    ?* @author calvin

    ?*/

    public class HsqlListener implements ServletContextListener {

    ??? protected Logger logger = Logger.getLogger(getClass());

    ?

    ??? /*

    ???? * (非 Javadoc)

    ???? *

    ???? * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)

    ???? */

    ??? public void contextInitialized(ServletContextEvent sce) {

    ??????? logger.info(" ============= HsqlListener initialize...");

    ?

    ??????? // 獲得數據庫文件訪問路徑

    ??????? String path = getDbPath(sce);

    ??????? if (!path.endsWith("/"))

    ??????????? path = path + "/";

    ?

    ??????? if (StringUtils.isEmpty(path)) {

    ??????????? logger.info(" ============= Can't get hsqldb.path from web.xml Context Param");

    ??????????? return;

    ??????? }

    ?

    ??????? logger.debug("hsqldb_path:" + path);

    ?

    ??????? // 數據庫文件名

    ??????? String dbName = sce.getServletContext().getInitParameter("hsql.dbName");

    ??????? if (StringUtils.isEmpty(dbName)) {

    ??????????? logger.info(" ============= Can't get hsqldb.dbName from web.xml Context Param");

    ??????????? return;

    ??????? }

    ?

    ??????? // 數據庫訪問端口

    ??????? int port = -1;

    ??????? try {

    ??????????? port = Integer.parseInt(sce.getServletContext().getInitParameter("hsql.port"));

    ??????? } catch (Exception e) {

    ??????????? e.printStackTrace();

    ??????????? return;

    ??????? }

    ?

    ??????? // 啟動數據庫

    ??????? startServer(path, dbName, port);

    ??? }

    ?

    ??? /**

    ???? * 獲得數據庫文件訪問路徑

    ???? *

    ???? * @param sce

    ???? * @return

    ???? */

    ??? private String getDbPath(ServletContextEvent sce) {

    ??????? String path = sce.getServletContext().getInitParameter("hsql.dbPath");

    ?

    ??????? if (path.startsWith("{user.home}")) {

    ??????????? path = path.replaceFirst("\\{user.home\\}", System.getProperty("user.home").replace('\\', '/'));

    ??????? }

    ??????? if (path.startsWith("{webapp.root}")) {

    ??????????? path = path.replaceFirst("\\{webapp.root\\}", sce.getServletContext().getRealPath("/").replace('\\', '/'));

    ??????? }

    ?

    ??????? return path;

    ??? }

    ?

    ??? /**

    ???? * 啟動數據庫

    ???? *

    ???? * @param dbPath

    ???? * @param dbName

    ???? * @param port

    ???? */

    ??? private void startServer(String dbPath, String dbName, int port) {

    ??????? Server server = new Server();

    ?

    ??????? server.setDatabaseName(0, dbName);

    ??????? server.setDatabasePath(0, dbPath + dbName);

    ?

    ??????? if (port != -1)

    ??????????? server.setPort(port);

    ?

    ??????? server.setSilent(true);

    ??????? server.setTrace(true);

    ?

    ??????? server.start();

    ?

    ??????? logger.info(" ============= hsqldb started...");

    ??????? // 等待Server啟動

    ??????? try {

    ??????????? Thread.sleep(800);

    ??????? } catch (InterruptedException e) {

    ??????????? e.printStackTrace();

    ??????? }

    ??? }

    ?

    ??? /*

    ???? * (非 Javadoc)

    ???? *

    ???? * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)

    ???? */

    ??? public void contextDestroyed(ServletContextEvent sce) {

    ??????? logger.info(" ============= HsqlListener destroyed...");

    ?

    ??????? Connection conn = null;

    ??????? try {

    ??????????? Class.forName("org.hsqldb.jdbcDriver");

    ??????????? conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:9002/weed", "sa", "sa");

    ??????????? Statement stmt = conn.createStatement();

    ?

    ??????????? stmt.executeUpdate("SHUTDOWN;");

    ?

    ??????????? logger.info(" ============= hsqldb shutdown...");

    ??????? } catch (Exception e) {

    ??????????? e.printStackTrace();

    ??????? }

    ??? }

    }

    ?

    增加web.xml配置

    web.xml配置增加如下:

    <!--HSQLDB Listener的參數,隨WebApp啟動停止的Listener

    ??????? {user.home}??????? System.getProperty("user.home")

    ??????? {webapp.root}????? servletContext.getRealPath("/")

    ??? -->

    ??? <context-param>

    ??????? <param-name>hsql.dbPath</param-name>

    ??????? <param-value>{webapp.root}/WEB-INF/dbms/db</param-value>

    ??? </context-param>

    ?

    ??? <context-param>

    ??????? <param-name>hsql.dbName</param-name>

    ??????? <param-value>weed</param-value>

    ??? </context-param>

    ?

    ??? <context-param>

    ??????? <param-name>hsql.port</param-name>

    ??????? <param-value>9002</param-value>

    </context-param>

    <!--

    ??? 控制HSQLDB隨Web App 啟動停止

    ??? -->

    ??? <listener>

    ??????? <listener-class>test.HsqlListener</listener-class>

    ??? </listener>

    好了,你現在可以像訪問mysql、oracle等其他數據庫一樣配置jdbc連接訪問hsqldb了,在HsqlListener中有一個類org.hsqldb.Server,有空你可以研究一下他的源碼。

    posted on 2006-10-18 17:24 野草 閱讀(11287) 評論(1)  編輯  收藏 所屬分類: hsqldb

    評論:
    # re: hsqldb快速入門 2008-03-25 12:18 | zhoujiang
    不錯,贊一個^_^  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 永久免费无码日韩视频| 国产成人亚洲午夜电影| 一级毛片不卡片免费观看| 中文字幕亚洲图片| 国产激情久久久久影院老熟女免费 | 久久亚洲精品成人无码网站| 日本不卡免费新一区二区三区| 亚洲精品自在在线观看| 三年片在线观看免费西瓜视频| 亚洲AV无码日韩AV无码导航| 日本在线免费观看| 91亚洲国产成人久久精品| 四虎永久在线观看免费网站网址| 国产精品亚洲精品| 国产色爽免费视频| 色老头综合免费视频| 久久精品国产亚洲综合色| 8x成人永久免费视频| 亚洲综合色7777情网站777| 浮力影院第一页小视频国产在线观看免费| 青草久久精品亚洲综合专区| 亚洲av再在线观看| 午夜无遮挡羞羞漫画免费| 亚洲精品理论电影在线观看| 一本色道久久88亚洲综合| 91精品成人免费国产| 亚洲国产精品成人综合色在线婷婷| 日韩版码免费福利视频| 美女尿口扒开图片免费| 亚洲精品成人无码中文毛片不卡| 91高清免费国产自产| 男男gay做爽爽免费视频| 亚洲成色www久久网站夜月| 可以免费看黄视频的网站| 麻豆一区二区三区蜜桃免费| 久久亚洲国产成人亚| 女人被男人躁的女爽免费视频| 久久国产福利免费| 久久亚洲精品专区蓝色区| 亚洲日本一区二区一本一道 | 日韩精品亚洲专区在线观看|