- 浏览: 160145 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
yuanyu5237:
Michyo 写道你好,我是用了您的第二段模块代码,但是为什么 ...
32位linux内核2.6.38.2添加系统调用,并编写模块模拟ps命令显示进程信息 -
yuanyu5237:
haolifeng 写道如果不对客户端的连接文件描述符进行监听 ...
简单epoll多线程服务器 -
haolifeng:
如果不对客户端的连接文件描述符进行监听,你这个服务器是有问题的 ...
简单epoll多线程服务器 -
haolifeng:
我对你的代码有一个问题,当获得客户端的连接文件描述符后,为什么 ...
简单epoll多线程服务器 -
Michyo:
你好,我是用了您的第二段模块代码,但是为什么添加了模块后没有输 ...
32位linux内核2.6.38.2添加系统调用,并编写模块模拟ps命令显示进程信息
先来无事,发现之前下载的h2 database源码还在source insight里放着,就打开看看。
h2 database是一个开源的,用java写的,支持jdbc连接的内存数据库,提供浏览器模式的控制台。
其源码结构(我用的版本是1.3.154)如下(进入到src目录下,src/org/h2/)
Api
Bnf
Command
Compress
Constant
Constraint
Engine
Expression
Fulltext
Index
Jdbc
Jdbcx
Jmx
Message
Res
Result
Schema
Security
Server
Store
Table
Tools 工具类,其中有数据库的入口Server.main()
Upgrade
Util
Value
driver.java
从main函数开始说起
new Server().runTool(args);
调用runTool()方法,在该方法中,会首先设置一些默认启动参数,然后根据传入的args修改这些默认参数,最后按顺序启动webserver,browser,tcpserver和pgserver,典型代码:
if (startDefaultServers) { tcpStart = true; pgStart = true; webStart = true; browserStart = true; } /*-----------------------------------*/ try { if (webStart) { web = createWebServer(args); web.setShutdownHandler(this); SQLException result = null; try { web.start(); } catch (Exception e) { result = DbException.toSQLException(e); } out.println(web.getStatus()); // start browser in any case (even if the server is already running) // because some people don't look at the output, // but are wondering why nothing happens if (browserStart) { try { openBrowser(web.getURL()); } catch (Exception e) { out.println(e.getMessage()); } } if (result != null) { throw result; } } if (tcpStart) { tcp = createTcpServer(args); tcp.start(); out.println(tcp.getStatus()); tcp.setShutdownHandler(this); } if (pgStart) { pg = createPgServer(args); pg.start(); out.println(pg.getStatus()); } } catch (SQLException e) { stopAll(); throw e; }
下面分别来看看这3个server和1个browser:
1WebServer
public static Server createWebServer(String... args){ WebServer service = new WebServer(); Server server = new Server(service, args); service.setShutdownHandler(server); return server; }
2TcpServer
public static Server createTcpServer(String... args) { TcpServer service = new TcpServer(); Server server = new Server(service, args); service.setShutdownHandler(server); return server; }
3PgServer
public static Server createPgServer(String... args){ return new Server(new PgServer(), args); }
3个server都只是创建,要启动server,都需要调用start()方法,在start方法中,调用各自的service类,start各自的server,然后创建单独的线程执行运行该server,若为守护进程,还需要将其设置为守护进程:
public Server start() throws SQLException { try { started = true; service.start(); Thread t = new Thread(this); t.setDaemon(service.isDaemon()); String name = service.getName() + " (" + service.getURL() + ")"; t.setName(name); t.start(); for (int i = 1; i < 64; i += i) { wait(i); if (isRunning(false)) { return this; } } if (isRunning(true)) { return this; } throw DbException.get(ErrorCode.EXCEPTION_OPENING_PORT_2, name, "timeout"); } catch (DbException e) { throw DbException.toSQLException(e); } }
最后,是openBrowser(),根据指定的URL打开一个浏览器窗口或者标签页。
public static void openBrowser(String url) throws Exception { try { String osName = SysProperties.getStringSetting("os.name", "linux").toLowerCase(); Runtime rt = Runtime.getRuntime(); String browser = System.getProperty(SysProperties.H2_BROWSER); if (browser != null) { if (browser.startsWith("call:")) { browser = browser.substring("call:".length()); Utils.callStaticMethod(browser, url); } else if (browser.indexOf("%url") >= 0) { String[] args = StringUtils.arraySplit(browser, ',', false); for (int i = 0; i < args.length; i++) { args[i] = StringUtils.replaceAll(args[i], "%url", url); } rt.exec(args); } else if (osName.indexOf("windows") >= 0) { rt.exec(new String[] { "cmd.exe", "/C", browser, url }); } else { rt.exec(new String[] { browser, url }); } return; } try { Class<?> desktopClass = Class.forName("java.awt.Desktop"); // Desktop.isDesktopSupported() Boolean supported = (Boolean) desktopClass. getMethod("isDesktopSupported"). invoke(null, new Object[0]); URI uri = new URI(url); if (supported) { // Desktop.getDesktop(); Object desktop = desktopClass.getMethod("getDesktop"). invoke(null, new Object[0]); // desktop.browse(uri); desktopClass.getMethod("browse", URI.class). invoke(desktop, uri); return; } } catch (Exception e) { // ignore } if (osName.indexOf("windows") >= 0) { rt.exec(new String[] { "rundll32", "url.dll,FileProtocolHandler", url }); } else if (osName.indexOf("mac") >= 0 || osName.indexOf("darwin") >= 0) { // Mac OS: to open a page with Safari, use "open -a Safari" Runtime.getRuntime().exec(new String[] { "open", url }); } else { String[] browsers = { "firefox", "mozilla-firefox", "mozilla", "konqueror", "netscape", "opera" }; boolean ok = false; for (String b : browsers) { try { rt.exec(new String[] { b, url }); ok = true; break; } catch (Exception e) { // ignore and try the next } } if (!ok) { // No success in detection. throw new Exception("Browser detection failed and system property " + SysProperties.H2_BROWSER + " not set"); } } } catch (Exception e) { throw new Exception("Failed to start a browser to open the URL " + url + ": " + e.getMessage()); } }
这段代码其实挺有意思的,就是打开了一个浏览器,参考了这段代码的实现,并阅读了util下的New, Util, StringUtil三个类得部分代码和constant下的SysProperties类,拼凑了下面的一段程序,可直接运行,就能打开浏览器。
package org.h2.test; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.net.URI; import java.util.ArrayList; public class OpenBrowserTest { public static void main(String[] args) throws Exception { openBrowser("http://www.baidu.com"); } public static void openBrowser(String url) throws Exception { try { String s = System.getProperty("os.name"); String osName = (s == null ? "linux" : s).toLowerCase(); Runtime rt = Runtime.getRuntime(); String browser = System.getProperty("h2.browser"); if (browser != null) { if (browser.startsWith("call:")) { browser = browser.substring("call:".length()); callStaticMethod(browser, url); } else if (browser.indexOf("%url") >= 0) { String[] args = arraySplit(browser, ',', false); for (int i = 0; i < args.length; i++) { args[i] = replaceAll(args[i], "%url", url); } rt.exec(args); } else if (osName.indexOf("windows") >= 0) { rt.exec(new String[] { "cmd.exe", "/C", browser, url }); } else { rt.exec(new String[] { browser, url }); } return; } try { Class<?> desktopClass = Class.forName("java.awt.Desktop"); // Desktop.isDesktopSupported() Boolean supported = (Boolean) desktopClass. getMethod("isDesktopSupported"). invoke(null, new Object[0]); URI uri = new URI(url); if (supported) { // Desktop.getDesktop(); Object desktop = desktopClass.getMethod("getDesktop"). invoke(null, new Object[0]); // desktop.browse(uri); desktopClass.getMethod("browse", URI.class). invoke(desktop, uri); return; } } catch (Exception e) { // ignore } if (osName.indexOf("windows") >= 0) { rt.exec(new String[] { "rundll32", "url.dll,FileProtocolHandler", url }); } else if (osName.indexOf("mac") >= 0 || osName.indexOf("darwin") >= 0) { // Mac OS: to open a page with Safari, use "open -a Safari" Runtime.getRuntime().exec(new String[] { "open", url }); } else { String[] browsers = { "firefox", "mozilla-firefox", "mozilla", "konqueror", "netscape", "opera" }; boolean ok = false; for (String b : browsers) { try { rt.exec(new String[] { b, url }); ok = true; break; } catch (Exception e) { // ignore and try the next } } if (!ok) { // No success in detection. throw new Exception("Browser detection failed and system property " + "h2.browser" + " not set"); } } } catch (Exception e) { throw new Exception("Failed to start a browser to open the URL " + url + ": " + e.getMessage()); } } public static Object callStaticMethod(String classAndMethod, Object... params) throws Exception { int lastDot = classAndMethod.lastIndexOf('.'); String className = classAndMethod.substring(0, lastDot); String methodName = classAndMethod.substring(lastDot + 1); return classMethodInternal(methodName, Class.forName(className), null, params); } private static Object classMethodInternal(String methodName, Class<?> clazz, Object instance, Object... params) throws Exception { Method best = null; int bestMatch = 0; boolean isStatic = instance == null; for (Method m : clazz.getMethods()) { if (Modifier.isStatic(m.getModifiers()) == isStatic && m.getName().equals(methodName)) { int p = match(m.getParameterTypes(), params); if (p > bestMatch) { bestMatch = p; best = m; } } } if (best == null) { throw new NoSuchMethodException(methodName); } return best.invoke(instance, params); } private static int match(Class<?>[] params, Object[] values) { int len = params.length; if (len == values.length) { int points = 1; for (int i = 0; i < len; i++) { Class<?> pc = getNonPrimitiveClass(params[i]); Class<?> vc = values[i].getClass(); if (pc == vc) { points++; } else if (!pc.isAssignableFrom(vc)) { return 0; } } return points; } return 0; } public static Class<?> getNonPrimitiveClass(Class<?> clazz) { if (!clazz.isPrimitive()) { return clazz; } else if (clazz == boolean.class) { return Boolean.class; } else if (clazz == byte.class) { return Byte.class; } else if (clazz == char.class) { return Character.class; } else if (clazz == double.class) { return Double.class; } else if (clazz == float.class) { return Float.class; } else if (clazz == int.class) { return Integer.class; } else if (clazz == long.class) { return Long.class; } else if (clazz == short.class) { return Short.class; } else if (clazz == void.class) { return Void.class; } return clazz; } public static String[] arraySplit(String s, char separatorChar, boolean trim) { if (s == null) { return null; } int length = s.length(); if (length == 0) { return new String[0]; } ArrayList<String> list = new ArrayList<String>(); StringBuilder buff = new StringBuilder(length); for (int i = 0; i < length; i++) { char c = s.charAt(i); if (c == separatorChar) { String e = buff.toString(); list.add(trim ? e.trim() : e); buff.setLength(0); } else if (c == '\\' && i < length - 1) { buff.append(s.charAt(++i)); } else { buff.append(c); } } String e = buff.toString(); list.add(trim ? e.trim() : e); String[] array = new String[list.size()]; list.toArray(array); return array; } public static String replaceAll(String s, String before, String after) { int next = s.indexOf(before); if (next < 0) { return s; } StringBuilder buff = new StringBuilder(s.length() - before.length() + after.length()); int index = 0; while (true) { buff.append(s.substring(index, next)).append(after); index = next + before.length(); next = s.indexOf(before, index); if (next < 0) { buff.append(s.substring(index)); break; } } return buff.toString(); } }
发表评论
-
再强大的数据库也抵不住自己手贱
2014-01-08 16:19 132上个月写了个问答网站,node.js + mongodb,建好 ... -
linux下使用oracle instantclient远程连接服务器
2012-07-05 10:22 2040我使用securecrt远程到服务器上,想从这台服务器访问另外 ... -
mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication
2012-06-14 09:45 1262我在使用easyPHP的时候,连mysql连不上,报错 ... -
一道淘宝的考察sql语句的面试题
2011-05-05 10:42 3648有一张表t_stu;其中三个字段:name,gender,gr ...
相关推荐
4、H2Database_SQL语法.doc 5、H2Database高级特性.doc 6、H2Database聚合函数.doc 7、H2Database连接配置.doc 8、H2Database数据类型.doc 9、H2Database中文教程.doc 10、H2内存数据库h2部署操作手册.docx 11、H2...
h2 database 是一个开源免费的Java SQL数据库 数据库分为嵌入式 Embedding 和Server模式 要使用embedding mode 需要做以下事情: 1 添加h2 jar到classpath中 2 使用jdbc驱动:org h2 Driver 3 jdbc数据库URL:jdbc:...
H2 database db zip h2database zip安装包,linux,windows都可
H2的主要特点是:
H2Database中文教程,数据库配置,spring hibernate配置详细介绍
这是一个介绍数据库H2Database的中文教程
H2Database内存数据库jar包及示例.
这是关于H2Database-SQL语法文档
H2 database 是一个非常著名的数据库,其性能相当优秀,支持嵌入,client-server模式,支持内存表,cached,text表, 本压缩包 包含 H2 database 源代码和文档 本版本 为最新版本 2010-12-12
1.系统在不断实时地访问数据库时,一秒钟对同一个表操作几千,几万次以上,导致数据表死锁或则处理太慢; 2.对数据实时计算,而且数据量很大时,比如电信系统的电信的二次批价和实时累账 3. 需实时统计数据,监控...
简单的H2数据库和Ibatis集成,使用Myeclipes,H2则选择内存模式和嵌入式模式启动
这是一个有关H2Database数据库高级特性文档
这是一个介绍H2Database数据类型的文档
h2 database数据库的使用,网上下的
H2数据库,非常好的内存数据库。 H2的优势: 1、h2采用纯Java编写,因此不受...H2比HSQLDB的最大的优势就是h2提供了一个十分方便的web控制台用于操作和管理数据库内容,这点比起HSQLDB的swing和awt控制台实在好用多了。
h2 database h2 db 数据库
H2数据库是一个开源的关系型数据库。H2是一个嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时支持网络版和嵌入式版本,有比较好的兼容性,支持相当标准的sql标准,支持集群。
ehcache和h2 database资料
这是一个关于数据库H2Database聚合函数的文档
H2数据库 源码 哈哈