H2数据库预研
2014-04-26 16:56
183 查看
google了一些文章以及看了h2官方文档的一点Q&A。请自己确保在生产环境中 h2数据库 的可靠性。当然我不并想使用它来代替 oracle。现阶段是希望将oracle某些数据加载到内存中,当应用在运行时可以直接从内存读取一些 相对静态的数据,比如省市区、编码映射转换表。会需要相对复杂的 select 查询,若使用cache key-value hashmap自己实现会得不偿失,自己也没有这个精力。。
这位同学写的文章通俗易懂,推荐下:
http://blog.csdn.net/yixiaoping/article/details/9801397
问题:
1. 对应我的应用而言,只需要在应用启动时,insert 数据到h2内存中。并发环境下只会做数据读取。可否每个线程共享一个 connection ? 就没必要搞个h2数据库连接池了。
2. 有没通用简单的方法:将oracle数据导入到h2数据库中?
这里有介绍:http://wenhao880204.iteye.com/blog/1767125 。需要自己写insert脚本。
看jboss提供的jpetstore项目例子,也是如此炮制的。
So...写了个从oracle自动加载data的简单java程序:
to be continued...
这位同学写的文章通俗易懂,推荐下:
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...
相关文章推荐
- COM+预研总结(2)
- 在公司做技术预研工作?
- android程序锁预研
- ios与android设备即时语音互通的录音格式预研说明
- MySQL高可用读写分离方案预研
- JDBC技术预研选型依据【转】
- iOS热修复(热更新)技术预研
- 基于Dragon Board410c 的智能机器人预研-语音识别及定位
- Android O 前期预研之三:Android Vehicle HAL
- 关于设计器的预研报告
- COM+预研总结(4)
- 嵌入式web服务器预研报告(转)
- IOS 之Google Analytics SDK预研---API
- Web开发框架的选择和技术预研、评测的重要性。
- iOS 蓝牙方案预研
- HDR功能预研
- [转] 前后端分离开发模式的 mock 平台预研
- h2数据库迁移到mysql
- 流计算产品预研