跑跑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]