H2数据库预研

google了一些文章以及看了h2官方文档的一点Q&A。请自己确保在生产环境中 h2数据库 的可靠性。当然我不并想使用它来代替 oracle。现阶段是希望将oracle某些数据加载到内存中,当应用在运行时可以直接从内存读取一些 相对静态的数据,比如省市区、编码映射转换表。会需要相对复杂的 select 查询,若使用cache key-value hashmap自己实现会得不偿失,自己也没有这个精力。。

这位同学写的文章通俗易懂,推荐下:

http://blog.csdn.net/yixiaoping/article/details/9801397

内存模式(数据只保存在内存中)
getConnection("jdbc:h2:tcp://localhost/mem:test2", "sa", "");

问题:

1. 对应我的应用而言,只需要在应用启动时,insert 数据到h2内存中。并发环境下只会做数据读取。可否每个线程共享一个 connection ? 就没必要搞个h2数据库连接池了。

2. 有没通用简单的方法:将oracle数据导入到h2数据库中?

这里有介绍:http://wenhao880204.iteye.com/blog/1767125 。需要自己写insert脚本。

看jboss提供的jpetstore项目例子,也是如此炮制的。


So...写了个从oracle自动加载data的简单java程序:

public static void main(String[] args) throws Exception {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection connection = null;
		connection = DriverManager.getConnection(
				"jdbc:oracle:thin:@ip:1800:test","prd","huek");
		String sql = "select * from code_map@dblink";
		PreparedStatement ps = connection.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		ResultSetMetaData rsMeta = rs.getMetaData();
		int colLen = rsMeta.getColumnCount();
		//System.err.println(colLen);
		StringBuffer tableCols = new StringBuffer();
		for (int i = 1; i < colLen+1; i++) {
			/*System.out.println(rsMeta.getColumnName(i) + "\t" + rsMeta.getColumnTypeName(i)
					+ "\t" + rsMeta.getPrecision(i) + "\t" + rsMeta.getScale(i));*/
			tableCols.append(rsMeta.getColumnName(i) + " " + rsMeta.getColumnTypeName(i) + "(" + rsMeta.getPrecision(i) + "), ");
		}
		tableCols.delete(tableCols.length()-2, tableCols.length()-1);
		String createSql = "CREATE TABLE CODE_MAP(" + tableCols + ")";
		StringBuffer insertSql = new StringBuffer();
		while (rs.next()) {
			insertSql.append("INSERT INTO CODE_MAP VALUES(");
			for (int i = 1; i < colLen+1; i++) {
				insertSql.append(getResultObject(rs, i) + ", ");
			}
			insertSql.delete(insertSql.length()-2, insertSql.length()-1);//remove last ', '
			insertSql.append(");");
			//break;
		}
		System.out.println(insertSql);
		loadDataToH2db(createSql, insertSql.toString());
	}
	
	//暂时只支持 int,string 类型。以后考虑decimal类型等等
	public static Object getResultObject(ResultSet rs, int colIdx) throws SQLException {
		if (rs.getMetaData().getColumnTypeName(colIdx).contains("NUMBER")) {
			return rs.getInt(rs.getMetaData().getColumnName(colIdx));
		} else if (rs.getMetaData().getColumnTypeName(colIdx).contains("CHAR")){
			return "'"+rs.getString(rs.getMetaData().getColumnName(colIdx))+"'";
		}
		return null;
	}
	
	public static void loadDataToH2db(String createSql, String insertSql) throws ClassNotFoundException, SQLException {
		Class.forName("org.h2.Driver");
		 Connection conn = DriverManager.
			       getConnection("jdbc:h2:tcp://localhost/mem:test2", "sa", "");
		 // add application code here
		 Statement stmt = conn.createStatement();
		 stmt.executeUpdate(createSql);
		 stmt.executeUpdate(insertSql);
		   //stmt.executeUpdate("INSERT INTO CODE_MAP(ID, TYPE_CODE) VALUES(1, 'Hello_Mem')");
		   ResultSet rs = stmt.executeQuery("SELECT * FROM CODE_MAP");
		    while(rs.next()) {
		     System.out.println(rs.getInt("ID")+","+rs.getString("TYPE_CODE"));
		    }
		   conn.close();
	}


to be continued...




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值