hsqldb快速入門

   數據庫環境配置和使用

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

 

數據庫實例建立

hsqldb的管理中,若是啓動的數據庫文件不存在,就新建該數據庫文件。java

Hsldb啓動

Hsqldb的啓動模式有三種主要模式,其餘參見User Guidemysql

l        Serverweb

該模式就像啓動mysqloracle等數據庫同樣,數據庫啓動後做爲一個服務存在,其餘數據庫工具能夠經過jdbc的方式訪問他,這是咱們最熟悉的模式。啓動腳本以下:spring

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

 

後面參數:sql

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

-dbname.n 數據庫文件的訪問同義詞,就是用這個名稱訪問數據庫的server模式jdbc訪問方式:apache

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

 

能夠啓動多個數據庫文件,例如:oracle

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)app

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

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

l        In-Memory

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

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

Hsqldb 管理工具

hsqldb.jar中自帶了一個數據庫管理工具:DatabaseManagerSwingSwing界面,還有一個是Awt界面的:DatabaseManager),該工具能夠經過jdbc訪問多種數據庫。

咱們使用server模式啓動hsqldb數據庫,而後運行下列命令:

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

就可打開主界面

 

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

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

 

好了你就能夠寫些語法數據庫語法了:

 

你能夠直接關閉它但數據庫不受影響,仍然啓動着。

 

Hsldb關閉

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

對於In-processIn-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>

好了,你如今能夠像訪問mysqloracle等其餘數據庫同樣配置jdbc鏈接訪問hsqldb了,在HsqlListener中有一個類org.hsqldb.Server,有空你能夠研究一下他的源碼。

相關文章
相關標籤/搜索