`
newdebug
  • 浏览: 38151 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

HsqlDb的持续化构建

阅读更多
在开发程序过程中,自从无意中使用了HsqlDb后,由于其速度特快,爱不释手(“不用不知道,谁用谁知道”),将原来所使用的Sybase,Sql Anywhere, MySql全都通通扔到了一边。在持续化构建过程中,因其尚未提供ant的第三方任务插件,因此需要清楚地了解在命令行下进行相应操作的方法,再通过<java>进行转化,进而针对其特点特作此小结。而大众化的知识,如驱动类名(org.hsqldb.jdbcDriver),如何在Java代码中进行连接,用户名(默认为”sa”)与密码(默认为””),“地球人都知道”,就不作详细介绍了。

1. HsqlDb自带工具
 org.hsqldb.util.DatabaseManager
 org.hsqldb.util.DatabaseManagerSwing
 org.hsqldb.util.Transfer
 org.hsqldb.util.QueryTool
 org.hsqldb.util.SqlTool
调用方法:java -cp hsqldb.jar org.hsqldb.util.DatabaseManager(在hsqldb.jar的当前路径下)

2. HsqlDb的数据库
 以文件形式存在。
 未指定文件名时,默认为"test",会产生以下几种文件
 test.properties
 test.script
 test.log
 test.data
 test.backup

3. HsqlDb数据库的类型
服务器模式:允许多个连接
    Server模式: jdbc:hsqldb:hsql://localhost/<dbname>
    Web Server模式: jdbc:hsqldb:http://<hostname>/<dbname>
    Servlet模式: 只能通过Tomcat等服务器提供服务
独占模式:只允许一个连接
    jdbc:hsqldb:file:<dbname>
内存模式:存在于内存中,速度最快,但最后一个连接关闭或数据库关闭时,数据丢失。
    jdbc:hsqldb:mem:<dbname>

4. HsqlDb的启动
 当服务器启动时,如果在指定的路径中找不到相应的数据库名称,会自动创建数据库。
 未指定路径及文件名,则在执行java命令的当前路径下创建test数据库

下面举几个例子。下载HsqlDb后,将其解压到某个文件夹下面,假设F:\temp\hsqldb。打开一个命令行窗口,执行

F: (回车)
cd F:\temp\hsqldb (回车)

将当前路径设为F:\temp\hsqldb。

 执行
java -classpath ./lib/hsqldb.jar org.hsqldb.Server
启动Server模式数据库,则在F:\temp\hsqldb下面新建test.lck、test.txt及test.properties三个文件。此三个文件组成了名为test的数据库。
 执行
java -classpath ./lib/hsqldb.jar org.hsqldb.Server -database.0 adb -dbname.0 adb
在F:\temp\hsqldb下面新建adb.lck、adb.txt及adb.properties三个文件。其中,由-database.0指定的adb是存放数据库的文件名,由-dbname.0指定的adb是对外提供连接的数据库名称(也称为别名),可用jdbc:hsqldb:hsql://localhost/adb进行连接。
 执行
java -classpath ./lib/hsqldb.jar org.hsqldb.Server -database.0 data/adb -dbname.0 adb
在F:\temp\hsqldb\data下面新建adb.lck、adb.txt及adb.properties三个文件。如果data这个文件夹不存在,会自动创建。与上面比较,存放数据库的路径变了,但别名未变,因此,也用jdbc:hsqldb:hsql://localhost/adb进行连接。

5. 执行SQL语句
执行SQL语句时,出于安全原因,需要在用户根目录(Windows XP中是C:\Documents and Settings\<username>,注意,不是”我的文档”)下面新建一个名为sqltool.rc文件。对于Server模式,其内容如下:

urlid localhost-sa
url jdbc:hsqldb:hsql://localhost/<dbname>
username sa
password

其中,url、username及password是我们所熟悉的数据库连接参数,而urlid是在执行SQL语句时需要用于验证用户身份的id。此值可相对任意取,但在同一sqltool.rc文件中必须唯一。使用方法见下面。

5.1 通过命令行执行SQL语句

java -jar ./lib/hsqldb.jar --sql " INSERT INTO Person VALUES(1, ‘Mike’);select * from Person " localhost-sa

通过调用java命令,执行hsqldb.jar,将参数设为--sql,表示要执行SQL语句。SQL语句在两个以上时,用括号包围,之间以分号隔开。SQL语句之后紧跟着的就是sqltool.rc中的urlid。这里的urlid必须与sqltool.rc致时才能执行SQL语句。这样可在一定程度上防范SQL注入侵犯。

5.2 通过SQL文件执行SQL语句

java -jar ./lib/hsqldb.jar localhost-sa sample.sql

sample.sql为SQL文件名,跟在urlid之后。因其有一定特点,特列出全部内容,以便说明:

/*
    $Id: sample.sql,v 1.5 2005/05/02 15:07:27 unsaved Exp $
    Examplifies use of SqlTool.
    PCTASK Table creation
*/

/* Ignore error for these two statements */
\c true
DROP TABLE pctasklist;
DROP TABLE pctask;
\c false

\p Creating table pctask
CREATE TABLE pctask (
    id integer identity,
    name varchar(40),
    description varchar,
    url varchar,
    UNIQUE (name)
);

\p Creating table pctasklist
CREATE TABLE pctasklist (
    id integer identity,
    host varchar(20) not null,
    tasksequence int not null,
    pctask integer,
    assigndate timestamp default current_timestamp,
    completedate timestamp,
    show bit default true,
    FOREIGN KEY (pctask) REFERENCES pctask,
    UNIQUE (host, tasksequence)
);

\p Granting privileges
GRANT select ON pctask TO public;
GRANT all ON pctask TO tomcat;
GRANT select ON pctasklist TO public;
GRANT all ON pctasklist TO tomcat;

\p Inserting test records
INSERT INTO pctask (name, description, url) VALUES (
    'task one', 'Description for task 1', 'http://cnn.com');
INSERT INTO pctasklist (host, tasksequence, pctask) VALUES (
    'admc-masq', 101, SELECT id FROM pctask WHERE name = 'task one');

commit;

说明:
 以/* …… */包围的内容为注解部分
 \c true意思为,即使有错误,也是继续执行。因此,对于”DROP TABLE pctasklist”,即使pctasklist表不存在,无法删除该表而出错,也会继续执行下面的SQL语句。
 \c false则相反,意思为,对于下面的SQL语句,出果出错,马上终止执行。
 \p为打印信息,此信息在将SQL语句输出到其他文件中时,将按原文输出。
 当执行到GRANT all ON pctask TO tomcat;时,由于tomcat的schema(用户或用户组)不存在,出错,后面的语句将不再执行,包括最后一行commit语句。
 默认情况下,SQL文本中的SQL语句在执行完毕后不会自动提交,因此需要在最后用commit;提交事务。但由于之前的SQL语句已经出错,因此这条语句在这里形同虚设,事务将回滚。

 

6. HsqlDb的关闭
根据5.1,在HsqlDb8.0中,可通过发送shutdown的SQL语句来关闭数据库服务器:

java -jar ./lib/hsqldb.jar --sql "shutdown" localhost-sa


7. 输出结果

输出日志。我们使用上面的语句来输出报表:

java -jar ./lib/hsqldb.jar localhost-sa sample.sql > log.txt

使用”>”符号,将结果输出至当前路径的log.txt。执行终止后,log.txt的内容如下:

Continue-on-error is set to: true          /* 对应于\c true */
Continue-on-error is set to: false         /* 对应于\c false */
Creating table pctask                  /* 对应于\p */
Creating table pctasklist               /* 对应于\p */
Granting privileges                   /* 对应于\p */

通过\o指令输出SQL查询结果。
在HsqlDb\src\org\hsqldb\sample文件夹下有一sampledata.sql文件,里面存放了许多生成数据库及插入数据的语句。我们先通过它来插入记录。执行以下语句:

java -jar ./lib/hsqldb.jar localhost-sa ./src/org/hsqldb/sample/sampledata.sql

然后,在F:\temp\hsqldb文件夹下面创建一个名为querydata.sql的文件,内容如下:

\o report.txt
select * from Product;
COMMIT;

其中,在第一行的”\o report.txt”中,”\o”为输出查询结果指令,将结果存放在当前路径的report.txt中。执行下面的语句:

java -jar ./lib/hsqldb.jar localhost-sa querydata.sql

执行后,除了在屏幕输出我们想要的结果外,HsqlDb还在当前路径下生成一个report.txt文件,里面除了在屏幕上显示的结果外,还在第一行中自动加上时间及生成工具:

# Sat Apr 29 02:26:31 CST 2006.  Query output from org.hsqldb.util.SqlFile.
ID  NAME               PRICE
--  -----------------  -----
0  Iron Iron            5.4
1  Chair Shoe          24.8
2  Telephone Clock     24.8
……

如果以上语句再执行一遍,则会将查询结果添加到report.txt的末端,而原来的查询结果依然保留。

除了文本文件,我们还可以输出html格式的网页报表。将querydata.sql内容修改如下:

\H
\o report.html
select * from Product;
COMMIT;

“\H”指令将生成html格式的报表,而”\o”指令后面的report也相应地改成了.html文件。再次执行上面的SQL语句:

java -jar ./lib/hsqldb.jar localhost-sa querydata.sql

屏幕输出了report.html的源码,同时也生成了report.html文件。在querydata.sql文件中,我们打开了”\H”的指令,如果想把它改为默认的文本格式,再设一次”\H”就行了。

Html文件也是自动添加的格式。

可以通过”\p”指令添加表头、、”\d”指令过滤字段等。

8. Ant持续化构建
有了上面的基础,我们可以换成ant指令,以便实现持续化构建。在F:\temp\hsqldb下新建一个build.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project name="appfuse" basedir="." default="help">

<property name="hsqldb.path" value="lib/hsqldb.jar" />
<property name="database.dir" value="db" />
<property name="database.name" value="testdb" />
<property name="database.urlid" value="localhost-sa" />
<property name="datafile.dir" value="src/org/hsqldb/sample/sampledata.sql" />
<property name="queryfile.name" value="querydata.sql" />
<property name="reportoutput.dir" value="report" />
<property name="reportfile.name" value="genreport.sql" />

<target name="help"
  description="Show help information">
  <echo level="info">HsqlDB Utils</echo>
  <echo level="info">================================================================</echo>
  <echo level="info">=> browseServer:   Query HsqlDb with its DatabaseManagerSwing ==</echo>
  <echo level="info">=> clean:          Clean all output results                   ==</echo>
  <echo level="info">=> help:           Show this information                      ==</echo>
  <echo level="info">=> shutdownServer: Shutdown HsqlDb Server                     ==</echo>
  <echo level="info">=> startServer:    Start HsqlDb Server in Server mode         ==</echo>
  <echo level="info">=> populate:       Insert sample data                         ==</echo>
  <echo level="info">=> queryData:      Query data from database                   ==</echo>
  <echo level="info">=> report:         Make data report                           ==</echo>
  <echo level="info">================================================================</echo>
</target>

    <target name="startServer"
        description="Start HsqlDb Server">
        <echo level="info">Starting HsqlDb Server...</echo>
        <java
            classname="org.hsqldb.Server"
            classpath="${hsqldb.path}"
            fork="true"
            failonerror="true">
            <arg value="-database.0" />
            <arg value="file:${database.dir}/${database.name}" />
            <arg value="-dbname.0" />
            <arg value="${database.name}" />
        </java>
    </target>
   
    <target name="shutdownServer">
     <echo level="info">Shutdown HsqlDb Server...</echo>
  <java
   jar="${hsqldb.path}"
   classpath="${hsqldb.path}"
   fork="true"
            failonerror="true">
            <arg value="--sql" />
            <arg value="shutdown" />
            <arg value="localhost-sa" />
        </java>
    </target>
   
    <target name="browseServer"
        description="Browse Database Server">
        <echo level="info">Opening HsqlDb ManagerSwing...</echo>
        <java
         classname="org.hsqldb.util.DatabaseManagerSwing"
         classpath="${hsqldb.path}"
         fork="true"
         failonerror="true">
            <arg value="-url"/>
            <arg value="jdbc:hsqldb:hsql://localhost/${database.name}" />
        </java>
    </target>

    <target name="populate"
     description="Insert sample data">
  <java
   jar="${hsqldb.path}"
   classpath="${hsqldb.path}"
   fork="true"
            failonerror="true">
            <arg value="${database.urlid}" />
            <arg value="${datafile.dir}" />
        </java>
    </target>
   
    <target name="queryData"
     description="Query data from database">
  <java
   jar="${hsqldb.path}"
   classpath="${hsqldb.path}"
   fork="true"
            failonerror="true">
            <arg value="${database.urlid}" />
            <arg value="${queryfile.name}" />
        </java>
    </target>
   
    <target name="report"
     description="Make data report">
        <mkdir dir="${reportoutput.dir}" />
  <java
   jar="${hsqldb.path}"
   classpath="${hsqldb.path}"
   fork="true"
            failonerror="true">
            <arg value="${database.urlid}" />
            <arg value="${reportfile.name}" />
        </java>
    </target>
   
    <target name="clean"
     description="Clean all outputs results">
     <delete dir="${reportoutput.dir}" />
    </target>
</project>
分享到:
评论

相关推荐

    oppna-program-notessystem-calendar-composite-types-1.7.zip

    6. **构建过程自动化**:使用HSQldb-Maven-Plugin,开发者可以自动管理数据库服务器的启动和关闭,无需手动干预,这极大地提高了开发效率和自动化程度。 7. **依赖管理**:Maven的依赖管理功能确保了项目中所有依赖...

    junit-test-dao

    - **自动化测试**:使用构建工具(如Maven或Gradle)配置测试执行命令,确保每次构建时都能自动执行所有单元测试。 - **持续集成**:将测试集成到CI/CD流程中,确保每次代码提交时都会自动执行测试。 #### 五、...

    BuildTools测试用例

    3. **持续集成/持续部署(CI/CD)**:Jenkins、Travis CI或GitHub Actions等工具,它们自动化构建过程,当代码发生变化时自动运行测试,并在所有测试通过后部署软件。 4. **代码覆盖率工具**:如JaCoCo(Java)、...

    nexus-2-bundle.zip

    8. **持续集成**: Nexus常与持续集成工具(如Jenkins、Travis CI等)集成,自动化构建、测试和部署流程。 综上所述,"nexus-2-bundle.zip"是一个用于在Linux系统上搭建Nexus Maven私服的压缩包,它包含了运行Nexus...

    liferay_6_开发文档

    - **持续集成/持续部署(CI/CD)**:结合Jenkins等工具,实现自动化构建、测试和部署流程。 通过以上指南,开发者不仅能够顺利安装和使用Liferay 6,还能搭建起高效的开发环境,从而在实际项目中充分发挥Liferay的...

    Apache Lenya安装

    **持续更新和维护** 保持Lenya的最新状态非常重要,定期检查官方更新,遵循相同的构建和部署步骤来升级到新版本。同时,监控系统性能和日志,确保所有组件运行正常。 总结来说,Apache Lenya是一个强大且灵活的内容...

    maven私服apache-archiva-2.2.3-bin.tar.gz

    在实际使用中,Archiva可以与其他工具如Jenkins、GitLab CI/CD等集成,实现自动化构建和部署流程。此外,Archiva支持多种插件,可以扩展其功能,例如与Artifactory或Nexus等其他仓库管理器进行互操作,或者集成身份...

    流程设计 开发 向导

    - **构建工具**:Ant,用于项目构建自动化。 **数据库服务器支持:** RunaWFE支持多种数据库管理系统,包括: - MSSQL Server - MySQL - HSQLDB - Oracle - PostgreSQL 综上所述,RunaWFE通过一系列精心挑选的技术...

    jenkins_ml:与詹金斯有关

    此外,詹金斯2.0引入了基于Groovy的Declarative Pipeline,提供了更直观和可读的脚本化构建方式。 ### 4. 插件系统 詹金斯的插件生态系统是其强大功能的关键。通过插件,用户可以集成各种工具和服务,如Docker、...

    模仿知乎做的SpringBoot问答社交网站项目

    使用JUnit、Mockito进行单元测试,配合Jenkins、GitLab CI/CD等工具实现持续集成和自动化部署。 以上就是基于SpringBoot构建问答社交网站的一些核心知识点,涵盖了后端开发、数据库设计、安全、API设计等多个方面...

    spring-roo-1.3.2.zip

    7. **持续集成**:Spring Roo也考虑到了持续集成,它可以与Hudson、Jenkins等工具集成,自动创建构建脚本,使得自动化测试和部署更加便捷。 8. **社区支持和扩展**:Spring Roo有一个活跃的开发者社区,提供了大量...

    J2EE程序员需掌握的技术

    18. **项目构建和安装包制作**:Ant和Maven负责构建自动化,Izpack等工具用于创建安装程序。 19. **软件过程和建模设计**:CMMI、RUP、XP等软件过程模型,以及Rose、PowerDesigner等建模工具,对大型项目的管理至关...

    Barracuda Utility-开源

    4. **自动化构建**:可能包含自动化构建和部署工具,如构建脚本和持续集成支持,简化版本控制和团队协作。 5. **错误跟踪和调试**:可能提供详细的错误报告和调试工具,帮助开发者快速定位和修复问题。 6. **插件...

    springboot架构代码版

    此外,持续集成工具如Jenkins和自动化测试框架JUnit也是开发过程中的重要组成部分。 总的来说,SpringBoot架构代码版是一个综合性的Java应用项目,涵盖了Spring生态系统的多个方面,通过精简配置和自动化,使得...

    JAVA开源软件分类

    - **持续集成工具**:如Jenkins,用于自动化构建和部署。 #### 4. Java中间件(Middleware) 中间件是连接不同应用的关键组件,确保了数据和服务之间的高效交互。 - **P1:消息队列** - **ActiveMQ**:一个高...

    software测试指南

    3. **持续集成/持续部署(CI/CD)**:Jenkins、GitLab CI/CD、Travis CI等工具能实现代码自动构建、测试和部署,加速开发流程并保证代码质量。 4. **缺陷管理**:Bugzilla、Jira和GitHub Issues等工具用于追踪和管理...

    README.zip

    9. **持续集成/持续部署(CI/CD)**:可能包括Travis CI、Jenkins等工具的配置,自动化构建和部署流程。 10. **版本控制**:推荐使用Git进行版本控制,并给出仓库地址。 11. **许可证信息**:项目所遵循的开源许可...

    rundeck部署+rundeck配置mysql元数据库

    Rundeck支持访问控制、工作流构建、调度、日志记录以及与其他外部数据源的集成,极大地简化了自动化流程。 **部署流程** 1. 首先,你需要从官方网站`http://download.rundeck.org/`下载Rundeck-launcher文件。 2. ...

    测试自动化

    最后,持续改进是测试自动化的核心。通过分析测试结果,识别性能瓶颈和失败原因,可以不断优化测试用例和框架,提高测试覆盖率和效率。同时,也要关注自动化测试的维护性,避免过度复杂化,确保测试代码与业务代码...

    openfire二次开发

    为了保持代码版本管理和团队协作,推荐使用版本控制系统(如Git)进行代码管理,并结合Jenkins或Travis CI等工具实现持续集成,自动化构建和测试过程。 7. **文档与调试** 开发过程中,编写清晰的文档至关重要,...

Global site tag (gtag.js) - Google Analytics