zhyt710 发表于 2013-1-30 02:04:34

跑跑hsqldb

目前hsqldb应该上不了大的场合, 但是它的纯java可嵌入轻量级的特性,确实吸引这很多人。尤其想到在测试方面应该会给项目带来一定的方便。于是今天稍微的看看相关文档, 并进行了应用测试。
测试一下hsql的使用, 注意把从官网下载的分发包中的hsqldb.jar包包括在你的classpath中
TestConnector.java
package zhangyt.db.hsqldb;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class TestConnector {/** * @param args */public static void main(String[] args) throws Exception {Class.forName("org.hsqldb.jdbcDriver");//连接url的前缀//1. jdbc:hsqldb:                     内存运行模式//2. jdbc:hsqldb:file:                  标准模式//3. jdbc:hsqldb:hsql://localhost/xdb   服务模式 现在可以验证这个可以保持持久化Connection conn = DriverManager.getConnection("jdbc:hsqldb:file:"                + "testData/testDB",      // 数据库的文件名                "sa",                     // 用户名                "");                      // 密码Statement st = conn.createStatement();//建立表格st.executeUpdate("create table testTable(" +"id int," +"name varchar(20))");//插入一条数据int count = st.executeUpdate("insert into testTable values(1, 'zhangyt')");System.out.println("你插入了 " + count + " 条数据");//检索数据打印所有数据ResultSet rs = st.executeQuery("select * from testTable");while(rs.next()) {int i = rs.getInt("id");String name = rs.getString("name");System.out.println(i + " " + name);}//更新数据count = st.executeUpdate("update testTable set name = 'zhangyantao'");System.out.println("你更新了 " + count + " 条数据");//检索数据打印所有数据rs = st.executeQuery("select * from testTable");while(rs.next()) {int i = rs.getInt("id");String name = rs.getString("name");System.out.println(i + " " + name);}rs.close();st.close();conn.close();}} 
 
HsqldbUtil.java
package zhangyt.db.hsqldb;import java.util.Scanner;import org.hsqldb.Server;public class HsqldbUtil {public static Server startServer() {      Server server = new Server();      server.setDatabaseName(0, "testDB");      server.setDatabasePath(0, "testData" + "/testDB");      //if (port != -1)      //    server.setPort(port);      server.setSilent(true);                server.start();      // 等待Server启动   try {            Thread.sleep(800);      }      catch (InterruptedException e) {            // do nothing      }                        return server;}/** * @param args */public static void main(String[] args) {//启动数据库Server server = HsqldbUtil.startServer();Scanner snr = new Scanner(System.in);System.out.println("数据库服务已经启动, 输入 exit 停止服务");while(!snr.nextLine().equals("exit")) {}      //关闭数据库server.shutdown();}} 
问题点: 在标准模式中并没有看到能够把数据持久化的文件。 而只是和内存模式相同?
 
要想在web测试中用此数据库的服务模式(保证持久化), 可以定义监听servlet, 在web服务器启动的时候,开启hsqldb数据哭服务,在web服务结束的时候关闭hsqldb服务。代码可以参考如下代码骨架
public class HsqldbListener implements ServletContextListener {    public void contextInitialized(ServletContextEvent sce) {         /**         Server server = new Server();         server.setDatabaseName(0, "testDB");         server.setDatabasePath(0, "testData" + "/testDB");         server.setSilent(true);         server.start();         **/         //在这个方法中启动服务    }       public void contextDestroyed(ServletContextEvent sce) {      /** 最原始的关闭方法      String dbName = Config.getString("metawork.hsql.dbName");      Connection conn = null;      try {            Class.forName("org.hsqldb.jdbcDriver");            conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:/" + dbName,                  "sa", "");            Statement stmt = conn.createStatement();            stmt.executeUpdate("SHUTDOWN;");      } catch (Exception e) {            //do nothing      }      **/      //关闭服务   //server.shutdown(); 如果存在服务引用对象可以直接这样    }} 
 
当然, 在单元测试的时候, 用什么样的方法来启动服务, 各位自有妙法,不在这里多说
页: [1]
查看完整版本: 跑跑hsqldb