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

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

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

    數(shù)據(jù)庫環(huán)境配置和使用

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

    ?

    數(shù)據(jù)庫實(shí)例創(chuàng)建

    hsqldb的管理中,如果啟動(dòng)的數(shù)據(jù)庫文件不存在,就新建該數(shù)據(jù)庫文件。

    Hsldb啟動(dòng)

    Hsqldb的啟動(dòng)模式有三種主要模式,其他參見User Guide:

    l??????? Server

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

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

    后面參數(shù):

    -database.n 數(shù)據(jù)庫文件(其他數(shù)據(jù)庫中對(duì)應(yīng):數(shù)據(jù)庫實(shí)例)地址,支持相對(duì)路徑,注意使用反斜杠

    -dbname.n 數(shù)據(jù)庫文件的訪問同義詞,就是用這個(gè)名稱訪問數(shù)據(jù)庫的

    server模式j(luò)dbc訪問方式:

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

    ?

    可以啟動(dòng)多個(gè)數(shù)據(jù)庫文件,例如:

    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)

    該模式更接近于文件型數(shù)據(jù)庫這個(gè)概念,當(dāng)你訪問時(shí)他就啟動(dòng),這種模式訪問速度最快,缺點(diǎn)是只能當(dāng)前訪問線程使用,其他數(shù)據(jù)庫工具不能同時(shí)訪問。例如jdbc訪問:

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

    ?

    ?

    l??????? In-Memory

    顧名思義,內(nèi)存中的數(shù)據(jù)庫,你所做的數(shù)據(jù)庫ddl、dml不會(huì)寫入磁盤,也是當(dāng)你訪問時(shí)他就啟動(dòng)。例如jdbc訪問:

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

    ?

    Hsqldb 管理工具

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

    我們使用server模式啟動(dòng)hsqldb數(shù)據(jù)庫,然后運(yùn)行下列命令:

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

    就可打開主界面

    ?

    連接時(shí)注意選擇:Type,應(yīng)該是HSQL Database Engine Server

    對(duì)于第一次使用可以使用它自帶的功能,創(chuàng)建一些測(cè)試表,挺好的吧:

    [圖片1]

    好了你就可以寫些語法數(shù)據(jù)庫語法了:

    [圖片2]

    你可以直接關(guān)閉它但數(shù)據(jù)庫不受影響,仍然啟動(dòng)著。

    [圖片3]

    Hsldb關(guān)閉

    對(duì)于任何一種啟動(dòng)模式,都可以在輸入sql腳本的狀態(tài)輸入:SHUTDOWN 或 SHUTDOWN COMPACT 語法來關(guān)閉數(shù)據(jù)庫。

    對(duì)于In-process和In-memory這兩種模式只要所有的連接關(guān)閉了,數(shù)據(jù)庫也就關(guān)閉了。

    ?

    Server模式參數(shù)設(shè)置

    server模式下可以設(shè)置一些參數(shù),主要的例如訪問端口,可以參見User Guide的第四章高級(jí)屬性,一般我們可以在啟動(dòng)腳本的目錄下編輯一個(gè)server.properties,內(nèi)容如下:

    server.port=9002

    server.trace=true

    ?

    ?

    Sqltool工具使用

    ?

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

    urlid test

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

    username sa

    password

    其中urlid就是啟動(dòng)hsqldb的參數(shù)-dbname.0 test

    ?

    然后使用如下命令:

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

    ?

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

    ?

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

    ?

    ?

    web應(yīng)用中嵌入hsqldb

    寫一個(gè)Listener

    hsqldb嵌入到web應(yīng)用首要解決的問題是數(shù)據(jù)庫的啟動(dòng)和關(guān)閉問題,參考springside項(xiàng)目的方法加入一個(gè)容器級(jí)的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;

    ?

    /**

    ?* 該類的職責(zé)是在WebApp啟動(dòng)時(shí)自動(dòng)開啟HSQL服務(wù). 依然使用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...");

    ?

    ??????? // 獲得數(shù)據(jù)庫文件訪問路徑

    ??????? 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);

    ?

    ??????? // 數(shù)據(jù)庫文件名

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

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

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

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

    ??????? }

    ?

    ??????? // 數(shù)據(jù)庫訪問端口

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

    ??????? try {

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

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

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

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

    ??????? }

    ?

    ??????? // 啟動(dòng)數(shù)據(jù)庫

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

    ??? }

    ?

    ??? /**

    ???? * 獲得數(shù)據(jù)庫文件訪問路徑

    ???? *

    ???? * @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;

    ??? }

    ?

    ??? /**

    ???? * 啟動(dòng)數(shù)據(jù)庫

    ???? *

    ???? * @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啟動(dòng)

    ??????? 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的參數(shù),隨WebApp啟動(dòng)停止的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 啟動(dòng)停止

    ??? -->

    ??? <listener>

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

    ??? </listener>

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

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

    評(píng)論:
    # re: hsqldb快速入門 2008-03-25 12:18 | zhoujiang
    不錯(cuò),贊一個(gè)^_^  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 污污污视频在线免费观看| 亚洲第一成年免费网站| 亚洲一区二区三区免费观看 | 国产免费爽爽视频免费可以看| 一本久久综合亚洲鲁鲁五月天| 91麻豆国产自产在线观看亚洲| 亚洲va无码手机在线电影| 亚洲精品中文字幕乱码影院| 亚洲精品无码av片| 色www永久免费网站| 国产91色综合久久免费| 国产成人无码区免费A∨视频网站| 亚洲一级特黄大片无码毛片| 中文字幕亚洲综合久久2| 亚洲另类无码专区首页| www免费黄色网| 成人女人A级毛片免费软件| 亚洲AV网站在线观看| 亚洲一区中文字幕久久| 亚洲日本VA午夜在线影院| 国产区在线免费观看| 亚洲一级免费视频| 亚洲国产一区二区三区| 亚洲综合在线观看视频| 国产精品久久亚洲一区二区| 免费国产99久久久香蕉| 在线免费观看一级毛片| 亚洲精品无码久久久久去q| 亚洲香蕉久久一区二区三区四区| 成年免费大片黄在线观看com| 四虎最新永久免费视频| 亚洲色欲久久久久综合网| 亚洲日韩中文字幕天堂不卡| 色吊丝性永久免费看码| 91黑丝国产线观看免费| 亚洲人成影院在线观看| 亚洲国产综合精品中文第一| 在线免费观看h片| 日韩免费三级电影| 亚洲美女精品视频| 国产精品免费视频观看拍拍|