返回列表 回复 发帖

嵌入式数据库HSQLDB

数据库环境配置和使用
4 U- I" ~$ L' j9 x& N" U忽悠社区
5 P1 N' z5 o9 `忽悠社区是综合性社区网站,将最新、最快、最专业的资讯、新闻,图片,视频奉献给所有爱好者。首先从http://www.hsqldb.org/下载一个hsqldb的稳定版本,解压后可以浏览解压目录下的index.html,它描述了各个目录所包含内容,在doc段里有一个重要的链接User Guide: index.html,有空好好研究吧!
! q% `* F7 s/ i, |% B% Q( f, Y# ?
' h' C! E  `2 |" R. C忽悠,忽悠社区,忽悠论坛.数据库实例创建 * E: o$ A+ t8 L! N2 O
在hsqldb的管理中,如果启动的数据库文件不存在,就新建该数据库文件。 www.huuoo.com' C' t" n) N. e3 W- ?& j9 Q+ ]5 @

$ ^4 l  `2 h1 THsldb启动 $ M$ `1 @  j' D9 ^0 C
Hsqldb的启动模式有三种主要模式,其他参见User Guide:( q5 c* s9 ?$ l+ a
lServer 忽悠社区6 }% O5 O& s# M/ c" n$ M  n
该模式就像启动mysql、oracle等数据库一样,数据库启动后作为一个服务存在,其他数据库工具可以通过jdbc的方式访问他,这是我们最熟悉的模式。启动脚本如下:
  1. java -cp hsqldb.jar org.hsqldb.Server -database.0 ./db/test -dbname.0 test
复制代码
后面参数:
$ P: E) k+ f8 Q2 N忽悠,忽悠社区,忽悠论坛.-database.n 数据库文件(其他数据库中对应:数据库实例)地址,支持相对路径,注意使用反斜杠 5 F9 a  g6 V( m9 [* ^
-dbname.n 数据库文件的访问同义词,就是用这个名称访问数据库的 忽悠,忽悠社区,忽悠论坛.$ [$ O1 T# F. a! [
server模式jdbc访问方式:
  1. Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:9002/test", "sa", "");
复制代码
可以启动多个数据库文件,例如:
  1. java -cp hsqldb.jar org.hsqldb.Server -database.0 ./db/test0 -dbname.0 test0  -database.1 ./db/test1 -dbname.1 test1
复制代码
lIn-Process (Standalone)
0 t/ @- m8 C$ l6 L6 h6 w! H该模式更接近于文件型数据库这个概念,当你访问时他就启动,这种模式访问速度最快,缺点是只能当前访问线程使用,其他数据库工具不能同时访问。例如jdbc访问:
  1. Connection c = DriverManager.getConnection("jdbc:hsqldb:file:/opt/db/testdb", "sa", "");
复制代码
lIn-Memory
6 z) X* o" n- u* X0 E( v8 H) r+ ?顾名思义,内存中的数据库,你所做的数据库ddl、dml不会写入磁盘,也是当你访问时他就启动。例如jdbc访问:
  1. Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:aname", "sa", "");
复制代码
Hsqldb 管理工具
& D+ P8 v1 ~* D- q忽悠社区是综合性社区网站,将最新、最快、最专业的资讯、新闻,图片,视频奉献给所有爱好者。hsqldb.jar中自带了一个数据库管理工具:DatabaseManagerSwing(Swing界面,还有一个是Awt界面的:DatabaseManager),该工具可以通过jdbc访问多种数据库。 7 o9 `/ a5 j- o3 D" C
我们使用server模式启动hsqldb数据库,然后运行下列命令:
  1. java -cp hsqldb.jar org.hsqldb.util.DatabaseManager
复制代码
就可打开主界面
* v  p* R; X4 V9 G1 s3 n) x0 Awww.huuoo.com连接时注意选择:Type,应该是HSQL Database Engine Server 忽悠社区1 F% p* h6 j. N) e5 N/ ^; Z
对于第一次使用可以使用它自带的功能,创建一些测试表,挺好的吧忽悠社区+ H: V, D: p8 o( j
忽悠,忽悠社区,忽悠论坛.  d5 u) k; g: S- e( _1 n- ~: g. K
Hsldb关闭
2 j2 V+ A, q. `5 b( A忽悠,忽悠社区,忽悠论坛.
对于任何一种启动模式,都可以在输入sql脚本的状态输入:SHUTDOWN 或 SHUTDOWN COMPACT 语法来关闭数据库。
, N; R+ n4 Y1 k# E8 A7 owww.huuoo.com对于In-process和In-memory这两种模式只要所有的连接关闭了,数据库也就关闭了。
. @' e- w, n/ ^/ V7 G& k* K
9 M4 O( X* A2 S  R; g( w  kServer模式参数设置 ' u9 A! n$ o( Y. w' x
在server模式下可以设置一些参数,主要的例如访问端口,可以参见User Guide的第四章高级属性,一般我们可以在启动脚本的目录下编辑一个server.properties,内容如下:
  1. server.port=9002
  2. server.trace=true
复制代码
Sqltool工具使用 ( M: q) A/ y  h% W! w
在目录src\org\hsqldb\sample下有一个sqltool.rc文件,将其拷贝到工具使用命令目录中,修改如下片断: 忽悠社区  \, t7 c) I7 K1 m- s; s9 l6 P5 a
www.huuoo.com% }" o, s) m% z
urlid test
4 M' I  Y/ x/ d' z5 u# }$ E. surl jdbc:hsqldb:hsql://localhost:9002/test 2 F! A3 H. d8 K2 b, I! a- ^
username sa
8 `) G: ]0 j% e. i! m忽悠社区是综合性社区网站,将最新、最快、最专业的资讯、新闻,图片,视频奉献给所有爱好者。password
* b& b" a* D% a2 ]8 A) y: P* S7 h+ ?1 M4 M( U. L* o* L2 r. a' l
其中urlid就是启动hsqldb的参数-dbname.0 test
% ^4 ~9 @+ F1 m$ u然后使用如下命令:
  1. java -jar hsqldb.jar --sql "select * from customer" --rcfile sqltool.rc test
复制代码
大家可以通过“java -jar hsqldb.jar
在web应用中嵌入hsqldb ' X$ Z& n! V( r& v" v
写一个Listener
% |! ?+ g6 B! i9 y' T4 }忽悠,忽悠社区,忽悠论坛.将hsqldb嵌入到web应用首要解决的问题是数据库的启动和关闭问题,参考springside项目的方法加入一个容器级的Listener,代码如下:
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.Statement;
  4.   
  5. import javax.servlet.ServletContextEvent;
  6. import javax.servlet.ServletContextListener;
  7.   
  8. import org.apache.commons.lang.StringUtils;
  9. import org.apache.log4j.Logger;
  10. import org.hsqldb.Server;
  11.   
  12. /**
  13. * 该类的职责是在WebApp启动时自动开启HSQL服务. 依然使用Server方式,不受AppServer的影响.
  14. *
  15. * @author frank
  16. * @author calvin
  17. */
  18. public class HsqlListener implements ServletContextListener {
  19.     protected Logger logger = Logger.getLogger(getClass());
  20.   
  21.     /*
  22.      * (非 Javadoc)
  23.      *
  24.      * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
  25.      */
  26.     public void contextInitialized(ServletContextEvent sce) {
  27.         logger.info(" ============= HsqlListener initialize...");
  28.   
  29.         // 获得数据库文件访问路径
  30.         String path = getDbPath(sce);
  31.         if (!path.endsWith("/"))
  32.             path = path + "/";
  33.   
  34.         if (StringUtils.isEmpty(path)) {
  35.             logger.info(" ============= Can't get hsqldb.path from web.xml Context Param");
  36.             return;
  37.         }
  38.   
  39.         logger.debug("hsqldb_path:" + path);
  40.   
  41.         // 数据库文件名
  42.         String dbName = sce.getServletContext().getInitParameter("hsql.dbName");
  43.         if (StringUtils.isEmpty(dbName)) {
  44.             logger.info(" ============= Can't get hsqldb.dbName from web.xml Context Param");
  45.             return;
  46.         }
  47.   
  48.         // 数据库访问端口
  49.         int port = -1;
  50.         try {
  51.             port = Integer.parseInt(sce.getServletContext().getInitParameter("hsql.port"));
  52.         } catch (Exception e) {
  53.             e.printStackTrace();
  54.             return;
  55.         }
  56.   
  57.         // 启动数据库
  58.         startServer(path, dbName, port);
  59.     }
  60.   
  61.     /**
  62.      * 获得数据库文件访问路径
  63.      *
  64.      * @param sce
  65.      * @return
  66.      */
  67.     private String getDbPath(ServletContextEvent sce) {
  68.         String path = sce.getServletContext().getInitParameter("hsql.dbPath");
  69.   
  70.         if (path.startsWith("{user.home}")) {
  71.             path = path.replaceFirst("\\{user.home\\}", System.getProperty("user.home").replace('\\', '/'));
  72.         }
  73.         if (path.startsWith("{webapp.root}")) {
  74.             path = path.replaceFirst("\\{webapp.root\\}", sce.getServletContext().getRealPath("/").replace('\\', '/'));
  75.         }
  76.   
  77.         return path;
  78.     }
  79.   
  80.     /**
  81.      * 启动数据库
  82.      *
  83.      * @param dbPath
  84.      * @param dbName
  85.      * @param port
  86.      */
  87.     private void startServer(String dbPath, String dbName, int port) {
  88.         Server server = new Server();
  89.   
  90.         server.setDatabaseName(0, dbName);
  91.         server.setDatabasePath(0, dbPath + dbName);
  92.   
  93.         if (port != -1)
  94.             server.setPort(port);
  95.   
  96.         server.setSilent(true);
  97.         server.setTrace(true);
  98.   
  99.         server.start();
  100.   
  101.         logger.info(" ============= hsqldb started...");
  102.         // 等待Server启动
  103.         try {
  104.             Thread.sleep(800);
  105.         } catch (InterruptedException e) {
  106.             e.printStackTrace();
  107.         }
  108.     }
  109.   
  110.     /*
  111.      * (非 Javadoc)
  112.      *
  113.      * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
  114.      */
  115.     public void contextDestroyed(ServletContextEvent sce) {
  116.         logger.info(" ============= HsqlListener destroyed...");
  117.   
  118.         Connection conn = null;
  119.         try {
  120.             Class.forName("org.hsqldb.jdbcDriver");
  121.             conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:9002/weed", "sa", "sa");
  122.             Statement stmt = conn.createStatement();
  123.   
  124.             stmt.executeUpdate("SHUTDOWN;");
  125.   
  126.             logger.info(" ============= hsqldb shutdown...");
  127.         } catch (Exception e) {
  128.             e.printStackTrace();
  129.         }
  130.     }
  131. }
复制代码
增加web.xml配置
; Z0 W) [& J8 T& _* V4 P忽悠,忽悠社区,忽悠论坛.web.xml配置增加如下:

  1. <!--HSQLDB Listener的参数,随WebApp启动停止的Listener
  2.         {user.home}        System.getProperty("user.home")
  3.         {webapp.root}      servletContext.getRealPath("/")
  4.     -->
  5.     <context-param>
  6.         <param-name>hsql.dbPath</param-name>
  7.         <param-value>{webapp.root}/WEB-INF/dbms/db</param-value>
  8.     </context-param>
  9.   
  10.     <context-param>
  11.         <param-name>hsql.dbName</param-name>
  12.         <param-value>weed</param-value>
  13.     </context-param>
  14.   
  15.     <context-param>
  16.         <param-name>hsql.port</param-name>
  17.         <param-value>9002</param-value>
  18. </context-param>

  19. <!--
  20.     控制HSQLDB随Web App 启动停止
  21.     -->
  22.     <listener>
  23.         <listener-class>test.HsqlListener</listener-class>
  24.     </listener>
复制代码
好了,你现在可以像访问mysql、oracle等其他数据库一样配置jdbc连接访问hsqldb了,在HsqlListener中有一个类org.hsqldb.Server,有空你可以研究一下他的源码。

hFQZMtipTFfJcXH

提示: 该帖被管理员或版主屏蔽

Hello DrJohn Hello

Hello my friends :)
;)
返回列表
高级回复 | 发新话题
B Color Image Link Quote Code Smilies
换一个