zoukankan      html  css  js  c++  java
  • HSQL结合润乾报表同步部署问题

    
    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,如图表明成功,可访问主页,报表:
  • 相关阅读:
    JAVA地址通过百度地图API转化为经纬度
    JS验证手机号
    JAVA获取六位随机数
    JS判断是否为“YYYYMMDD”式的日期
    JAVA 通过url下载图片保存到本地
    JAVA汉字转拼音
    JS判断是否是苹果系统(ios)和安卓系统(Android)客户端
    JAVA获取请求链接中所有参数(GET请求)
    如何高效学习 Kubernetes 知识图谱?
    当云原生遇到混合云:如何实现“求变”与“求稳”的平衡
  • 原文地址:https://www.cnblogs.com/shiGuangShiYi/p/10117543.html
Copyright © 2011-2022 走看看