数据库环境配置和使用
首先从hsqldb的稳定版本,解压后可以浏览解压目录下的index.html,它描述了各个目录所包含内容,在doc段里有一个重要的链接User Guide: index.html,有空好好研究吧!
数据库实例创建
在hsqldb的管理中,如果启动的数据库文件不存在,就新建该数据库文件。
Hsldb启动
Hsqldb的启动模式有三种主要模式,其他参见User Guide:
lServer
该模式就像启动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
lIn-Process (Standalone)
该模式更接近于文件型数据库这个概念,当你访问时他就启动,这种模式访问速度最快,缺点是只能当前访问线程使用,其他数据库工具不能同时访问。例如jdbc访问:
Connection c = DriverManager.getConnection("jdbc:hsqldb:file:/opt/db/testdb", "sa", "");
lIn-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
对于第一次使用可以使用它自带的功能,创建一些测试表,挺好的吧:
好了你就可以写些语法数据库语法了:
你可以直接关闭它但数据库不受影响,仍然启动着。
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配置增加如下:
…
hsql.dbPath
{webapp.root}/WEB-INF/dbms/db
hsql.dbName
weed
hsql.port
9002
…
test.HsqlListener
好了,你现在可以像访问mysql、oracle等其他数据库一样配置jdbc连接访问hsqldb了,在HsqlListener中有一个类org.hsqldb.Server,有空你可以研究一下他的源码。
作者:fengyifei11228 发表于2010-12-11 18:17:00 原文链接
阅读:4 评论:0 查看评论