1 . 问题概述
 
      中国登记结算公司为了验证报表模型和附带的样例[内建的不算],都是需要连接携带的DEMO数据源才能够运行,
 
      应用程序[润乾报表]需要部署到UNIX服务器上,
 
      DEMO自带的HSQL数据库里面有中文表名无法通过执行脚本移植到DB2数据库上[DB2不支持中文表名,
 
      即使可以工作量大],另外安装部署HSQL数据库,需要在UNIX上执行脚本,
 
      过多的配置问题,种种原因比较麻烦,采取了另一种方式…
 
      2 . 案例
 
      中国登记结算上海分公司
 
      3 . HSQL优点
 
      轻巧,只有600多K,运行速度非常快,适合在项目开发的时候使用。作为单元测试数据库。单元测试的时候,
 
      启动HSQLDB的file模式,数据不存盘,可以保证测试原子性。 来回复制,随身携带。 
 
      不需要安装,使用非常方便。稳定,而且支持的数据量足够大。 小型项目作为现场数据库使用,
 
      不需要安装Oracle之类的大型DB,减轻了维护成本,并且,HSQLDB非常容易备份。
 
      在我们日常开发中给我们带来更多的便捷。让Hsqldb随WebAPP一起启动。
 
      比平时用的DB2、Oracle、SQLServer…都要简洁方便许多,更重要从开发角度考虑Hsqldb的性能已经足够了 
Hsqldb 提供的所有工具都能以java class 归档文件(也就是jar)的标准方式运行。
 
      在下面运行AWT 版本的DatabaseManager 的例子中,hsqldb.jar 位于相对于当前路径的../lib 下面。 
java -cp ../lib/hsqldb.jar org.hsqldb.util.DatabaseManager 运行工具 

 
      4 . JAVA程序的调用和配置文件的说明
 
      我们借助Listener来实现此功能。web.xml配置信息如下: 
<context-param> 
<param-name>hsql.dbPath</param-name> 
<param-value>/database/runqianDB</param-value> 
</context-param> 
<context-param> 
<param-name>hsql.dbName</param-name> 
<param-value>runqianDB</param-value> 
</context-param> 
<context-param> 
<param-name>hsql.port</param-name> 
<param-value>9001</param-value> 
</context-param> 
<listener> 
<listener-class> 
systop.com.systopbase.common.HsqlListener 
</listener-class> 
</listener> 
配置说明:hsql.dbPath:采用的相对路径,database直接放在WebRoot目录下. 
hsql.dbName:需要说明的是在WebRoot/database/runqianDB目录下确认有runqian.script和runqian.properties两个文件. 
hsql.port:设置hsqldb的端口,默认是9001. 
 
      
 
       
 
      构造函数说明:systop.com.systopbase.common.HsqlListener 
 
       
      package systop.com.systopbase.common; 
import org.hsqldb.Server; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import java.io.File; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.Statement; 
/** 
* @ClassName: HsqlListener 
* @Version:1.0 
* @Author: zHouHuiHui 
* 该类的职责是在WebApp启动时自动开启HSQL服务. 依然使用Server方式,不受AppServer的影响. 
*/ 
public class HsqlListener implements ServletContextListener { 
/** 
* * Listener 初始化方法. 
*/ 
public void contextInitialized(ServletContextEvent sce) { 
String dbName = sce.getServletContext().getInitParameter("hsql.dbName"); 
String cfgDir = sce.getServletContext().getRealPath(sce.getServletContext().getInitParameter("hsql.dbPath")); 
System.out.println("cfgDir:"+cfgDir); 
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(cfgDir); 
if (!dbDir.exists()) {// 判断目录是否存在 
if (!dbDir.mkdirs()) {// 如果不存在创建,如果创建失败直接返回 
System.out.println("Can not create DB Dir for Hsql:" + dbDir); 
return
} 
} 
// 以下代码是做数据库恢复的。我们把原始的数据库放在classpath下,当启动web的时候,检查目标 
// 数据库是否存在,如果不存在,就把原始数据库复制为指定的数据库 
if (!cfgDir.endsWith("/")) { 
cfgDir = cfgDir + "/"
} 
File scriptFile = new File(cfgDir + dbName + ".script"); 
File propertiesFile = new File(cfgDir + dbName + ".properties"); 
if (scriptFile.exists() && propertiesFile.exists()) {// 判断数据文件是否存在 
this.startServer(cfgDir, 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("HSQL数据库启动了***"); 
// 等待Server启动 
try { 
Thread.sleep(800); 
} catch (InterruptedException e) { 
e.printStackTrace(); 
} 
} 
public void contextDestroyed(ServletContextEvent arg0) { 
// 这里就不用说了,自然是关闭数据库操作 
Connection conn = null
try { 
Class.forName("org.hsqldb.jdbcDriver"); 
conn = DriverManager.getConnection( 
"jdbc:hsqldb:hsql://localhost:9001/runqianDB", "sa", ""); 
Statement stmt = conn.createStatement(); 
stmt.executeUpdate("SHUTDOWN;"); 
} catch (Exception e) {// do nothing 
} 
} 
} 
 
       
      
 
      6.运行连接:java -cp ../lib/hsqldb.jar org.hsqldb.util.DatabaseManager 
 
      
 
       
      剩下的操作和别的数据库一样了,关于HSQL的详细介绍有兴趣可参见网络
 
      5 . HSQL随WEB程序一起启动
 
      启动应用程序Tomcat,如图表明成功,可访问主页,报表: