让Hsqldb随WebAPP一起启动

本文介绍如何在Web应用启动时自动开启HSQLDB数据库,通过配置Listener实现随WebAPP一同启动的功能,简化开发流程并提供性能支持。文中详细解释了配置参数的作用,并展示了启动和停止数据库的Java代码实现。
   首先说一下hsqldb几个优点
  1. 轻巧,只有600多K,运行速度非常快。结合Hibernate数据库无关的特性,非常适合在项目开发的时候使用。
  2. 作为单元测试数据库。单元测试的时候,启动HSQLDB的file模式,数据不存盘,可以保证测试原子性。
  3. 来回复制,随身携带。
  4. 不需要安装,使用非常方便。
  5. 稳定,而且支持的数据量足够大。
  6. 小型项目作为现场数据库使用,不需要安装Oracle之类的大型DB,减轻了维护成本,并且,HSQLDB非常容易备份。

        Hsqldb的各种好处就不再多说了,今天我们谈谈如何让它在我们日常开发中给我们带来更多的便捷。就像标题所说的,让Hsqldb随WebAPP一起启动。比平时用的DB2、Oracle、SQLServer... ...都要简洁方便许多,更重要从开发角度考虑Hsqldb的性能已经足够了。springside也是这么做的。

       废话不多说了,现在开始:

       我们借助Listener来实现此功能。

       先给出一段该Listener的配置信息吧,*^_^*是存在web.xml里的。

xml 代码
  1. <context-param>  
  2.       <param-name>hsql.dbPath</param-name>  
  3.       <param-value>D:/db</param-value>  
  4.   </context-param>  
  5.   
  6.   <context-param>  
  7.      <param-name>hsql.dbName</param-name>  
  8.      <param-value>mydb</param-value>  
  9.   </context-param>  
  10.   
  11.   <context-param>  
  12.       <param-name>hsql.port</param-name>  
  13.       <param-value>9002</param-value>  
  14.   </context-param>  
  15.     
  16.   <listener>  
  17.      <listener-class>  
  18.          systop.com.systopbase.common.HsqlStartListener   
  19.      </listener-class>  
  20.   </listener>  
简单解释一下:
  • hsql.dbPath: 采用绝对路径,且是固定的[D:/db]。而在实际应用中在这里我们更需要的是变量[或者说是相对路径],嘻嘻*^_^*不要着急,写这篇文章是为了让大家了解一下。在我们的systop-base项目中就采用了相对路径的方法,在那里你会有惊喜发现。
  • hsql.dbName:需要说明的是在D:/db目录下确认有mydb.script和mydb.properties两个文件.
  • hsql.port:设置hsqldb的端口,默认是9001,防止冲出使用9002。

接下来我们看看Listener是如何实现的:

java 代码


package systop.com.systopbase.common;   

  

import org.hsqldb.Server;   

import org.springframework.util.FileCopyUtils;   

  

import javax.servlet.ServletContextEvent;   

import javax.servlet.ServletContextListener;   

import java.io.File;   

import java.io.FileOutputStream;   

import java.io.IOException;   

import java.sql.Connection;   

import java.sql.DriverManager;   

import java.sql.Statement;   

  

 /**  

 * 该类的职责是在WebApp启动时自动开启HSQL服务. 依然使用Server方式,不受AppServer的影响. 

 */  

public class HsqlListener implements ServletContextListener {   

  

   /**  

   * Listener 初始化方法.  

   */  

  

  public void contextInitialized(ServletContextEvent sce) {   

  

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

    String path = sce.getServletContext().getInitParameter("hsql.dbPath");   

    int port = -1;   

  

    try {   

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

    }catch(Exception e){   

      port = 9001;   

    }   

  

    if (dbName == null || dbName.equals("")){   

     System.out.println("Cant' get hsqldb.dbName from web.xml Context Param");   

     return;   

    }   

     

    File dbDir = new File(path);   

  

    if (!dbDir.exists()) {//判断目录是否存在  

      if (!dbDir.mkdirs()) {//如果不存在创建,如果创建失败直接返回  

        System.out.println("Can not create DB Dir for Hsql:" + dbDir);   

        return;   

      }   

    }   

//以下代码是做数据库恢复的。我们把原始的数据库放在classpath下,当启动web的时候,检查目标  

//数据库是否存在,如果不存在,就把原始数据库复制为指定的数据库   

  

    if (!path.endsWith("/")){   

     path = path + "/";   

    }   

  

    File scriptFile = new File(path + dbName + ".script");   

    File propertiesFile = new File(path + dbName + ".properties");   

  

    if (scriptFile.exists() && propertiesFile.exists()){//判断数据文件是否存在  

      this.startServer(path, dbName, port);   

    } else{   

      System.out.println("Connect failed:Connect Hsqldb error or database files not exits!");   

    }   

  }   

  

  

  /**  

   * 启动Hsqldb服务的方法。  

   * @param dbPath 数据库路径  

   * @param dbName 数据库名称  

   * @param port 所使用的端口号  

   */  

  private void startServer(String dbPath, String dbName, int port) {   

  

    Server server = new Server();//它可是hsqldb.jar里面的类啊。  

  

    server.setDatabaseName(0, dbName);   

    server.setDatabasePath(0, dbPath + dbName);   

  

     if (port != -1){   

      server.setPort(port);   

    }   

  

          server.setSilent(true);   

    server.start();   

    System.out.println("hsqldb started...");   

    // 等待Server启动   

    

    try {   

      Thread.sleep(800);   

    } catch (InterruptedException e){   

      // do nothing   

    }   

  }   

  

    /**  

   * Listener销毁方法,在Web应用终止的时候执行"shutdown"命令关闭数据库. 

   */  

   public void contextDestroyed(ServletContextEvent arg0) {   

    //这里就不用说了,自然是关闭数据库操作   

    Connection conn = null;   

    try {   

      Class.forName("org.hsqldb.jdbcDriver");   

      conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:9002/bookstore", "sa", "");   

      Statement stmt = conn.createStatement();   

      stmt.executeUpdate("SHUTDOWN;");   

    } catch (Exception e){   

      // do nothing   

   }   

  }   

}  

现在就部署到Web应用中去尝试一下吧。:)

源码来自:https://pan.quark.cn/s/a4b39357ea24 ### 操作指南:洗衣机使用方法详解#### 1. 启动与水量设定- **使用方法**:使用者必须首先按下洗衣设备上的“启动”按键,同时依据衣物数量设定相应的“水量选择”旋钮(高、中或低水量)。这一步骤是洗衣机运行程序的开端。- **运作机制**:一旦“启动”按键被触发,洗衣设备内部的控制系统便会启动,通过感应器识别水量选择旋钮的位置,进而确定所需的水量高度。- **技术执行**:在当代洗衣设备中,这一流程一般由微处理器掌管,借助电磁阀调控进水量,直至达到指定的高度。#### 2. 进水过程- **使用说明**:启动后,洗衣设备开始进水,直至达到所选的水位(高、中或低)。- **技术参数**:水量的监测通常采用浮子式水量控制器或压力感应器来实现。当水位达到预定值时,进水阀会自动关闭,停止进水。- **使用提醒**:务必确保水龙头已开启,并检查水管连接是否牢固,以防止漏水。#### 3. 清洗过程- **使用步骤**:2秒后,洗衣设备进入清洗环节。在此期间,滚筒会执行一系列正转和反转的动作: - 正转25秒 - 暂停3秒 - 反转25秒 - 再次暂停3秒- **重复次数**:这一系列动作将重复执行5次,总耗时为280秒。- **技术关键**:清洗环节通过电机驱动滚筒旋转,利用水流冲击力和洗衣液的化学效果,清除衣物上的污垢。#### 4. 排水与甩干- **使用步骤**:清洗结束后,洗衣设备会自动进行排水,将污水排出,然后进入甩干阶段,甩干时间为30秒。- **技术应用**:排水是通过泵将水抽出洗衣设备;甩干则是通过高速旋转滚筒,利用离心力去除衣物上的水分。- **使用提醒**:...
代码下载地址: https://pan.quark.cn/s/c289368a8f5c 在安卓应用开发领域,构建一个高效且用户友好的聊天系统是一项核心任务。 为了协助开发者们迅速达成这一目标,本文将分析几种常见的安卓聊天框架,并深入说明它们的功能特性、应用方法及主要优势。 1. **环信(Easemob)** 环信是一个专为移动应用打造的即时通讯软件开发套件,涵盖了文本、图片、语音、视频等多种消息形式。 通过整合环信SDK,开发者能够迅速构建自身的聊天平台。 环信支持消息内容的个性化定制,能够应对各种复杂的应用场景,并提供多样的API接口供开发者使用。 2. **融云(RongCloud)** 融云作为国内领先的IM云服务企业,提供了全面的聊天解决方案,包括一对一交流、多人群聊、聊天空间等。 融云的突出之处在于其稳定运行和高并发处理性能,以及功能完备的后台管理工具,便于开发者执行用户管理、消息发布等操作。 再者,融云支持多种消息格式,如位置信息、文件传输、表情符号等,显著增强了用户聊天体验。 3. **Firebase Cloud Messaging(FCM)** FCM由Google提供的云端消息传递服务,可达成安卓设备与服务器之间的即时数据交换。 虽然FCM主要应用于消息推送,但配合Firebase Realtime Database或Firestore数据库,开发者可以开发基础的聊天软件。 FCM的显著优势在于其全球性的推送网络,保障了消息能够及时且精确地传输至用户。 4. **JMessage(极光推送)** 极光推送是一款提供消息发布服务的软件开发工具包,同时具备基础的即时通讯能力。 除了常规的文字、图片信息外,极光推送还支持个性化消息,使得开发者能够实现更为复杂的聊天功能。 此...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值