数据库环境配置和使用

首先从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 野草 阅读(11244) 评论(1)  编辑  收藏 所属分类: hsqldb

评论:
# re: hsqldb快速入门 2008-03-25 12:18 | zhoujiang
不错,赞一个^_^  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: