- 浏览: 793895 次
- 性别:
- 来自: 成都
最新评论
-
天塔上的猫:
技术孵化,任重道远啊!不过大哥能力牛逼啊,相信会有实现的一天的 ...
技术孵化的探索之路 -
SIHAIloveYAN:
谢谢分享,刚刚考上研究生,对我有很大的帮助,希望5年后再回到这 ...
我的2015 -
MUMU影子:
...
技术孵化的探索之路 -
tonyyan:
谢谢分享!
Java源码阅读的真实体会 -
cauchenlu:
http://ez.web126.cn/这个不错,完全颠覆目前 ...
一种快速开发的Java Web架构设计和实现(续)
昨天在论坛看到一篇讨论嵌入式数据库HSQLDB(http://www.iteye.com/topic/79802)的帖子,想到自己曾经读过部分它的源码,有一种对某些技术豁然开朗的感觉。所以,也希望和朋友们一起分享,大家有什么好的感受,不如也分享一下吧。下面是我对那个帖子的冗余回复,我觉得有必要专门发一篇帖子重复一下:
说点题外话,建议大家读读HSQLDB的源码,特别是jdbc driver(org/hsqldb/jdbc包)那部分,写得清晰易懂。读了它的部分源码,我自认为对下面一些问题理解深入了:
1、JDBC规范和JDBC实现的关系:怎么自己去设计一个规范,一种架构?我是否自己可以为某种数据设计jdbc driver,如何设计?想想php里面各数据库的函数库各自为政对程序移植性的影响,就知道jdbc规范有多么重要了。
2、JDBC协议:JDBC是基于socket之上的,数据包格式(org.hsqldb.Result)(mysql数据包格式公开了)?那么JMS数据包呢?其实,这也可以延伸到分布式协议的设计原理,如RMI、SOAP。其实,这些数据包格式和JSON、YAML这些message格式没有本质的区别,只不过应用范围不一样。任何分布式协议,肯定有一种message格式。
3、JDBC over HTTP:这样我们对RMI over IIOP, soap over HTTP, http tunnel原理有更深入的理解。
4、什么是long connection(jdbc的socket),什么是short connection(http),具体怎么实现?
3和4这些在HSQLDB的org.hsqldb.HTTPClientConnection类里有实现。
5、Java客户端和服务器端的通讯实现:jdbc driver就可以认为是一个java客户端类库。那么JMS client呢?还有,像mysql有各种语言的driver,原理是什么。
6、sql这种command、描述型语言究竟在数据库里面是个什么地位:sql是怎么传入jdbc driver,最终和database交互的?我们是否可以设计出另外一种command,形成一种行业标准,它在服务器和客户端怎么实现的。
以上我的表达可能有些晦涩,我只想表达一点:大家有兴趣就多读读经典的源码,扩展一下自己的设计思路。可能很多人象我一样,总有忙不完的项目,那么抽几个小时就够了,不必深入。
有很多技术我们理解总是很模糊,当你深入到内部,忽然发现原来就这么回事。我们总觉得IoC很神秘,其实最简单的IoC容器,也许一个HashMap就够了。
我曾经啃过那本《TCP/IP技术内幕》,也用sniffer探测过TCP、FTP等数据包,开发过BT服务器,但具体到语言实现的层面,还是看这些源码才恍然大悟的。
1、数据库的connection保持也就是TCP的连接保持,也就是TCP里面的Keepalive选项:在Socket编程里面的Keepalive。在Java的Socket类中就专门说到SO_KEEPALIVE:http://download.java.net/jdk7/docs/api/java/net/SocketOptions.html,
顺便说一下,在TCP通信期间,是靠sequence number来维持的,它们由initial sequence number (ISN)递增,它是keepAlive的前提。
2、在hsqldb里面,是默认用Java socket的,自己本身并没有去实现long connection,也就是说这个连接默认是2小时,反正我也没有找到这个选项设置的地方。在其HTTPClientConnection里面,倒是每次execute sql后就close了,遵从http协议的short connection实现。附带说一下,在hsqldb里面,是通过sessionID来标识客户端的((这个sessionID可以保证认证后的安全sql),就如同http里面的cookie中的JSESSIONID。
3、我以前做过即时通讯的开发,在OpenFire里面,keepAlive是自己实现的,也就是server端有个demo线程,默认每60s给所有客户端发送一个检测包,如org.jivesoftware.openfire.net包下的SocketConnection的checkHealth() 注释:
/**
* Returns true if the socket was closed due to a bad health. The socket is considered to
* be in a bad state if a thread has been writing for a while and the write operation has
* not finished in a long time or when the client has not sent a heartbeat for a long time.
* In any of both cases the socket will be closed.
*
* @return true if the socket was closed due to a bad health.s
*/
顺便说一下,现在的ajax的push技术(comet)(譬如web版的gtalk、msn),也主要利用http的keepalive选项,还有个专门的协议扩展:http://www.xmpp.org/extensions/xep-0124.html
如果你有兴趣,可以看看《TCP/IP Illustrated, Volume 1: The Protocols》的Chapter 23. TCP Keepalive Timer,文中说到Keepalive是TCP里面的一个可选项,一般由application层实现,并且给出了理由。
写源代码比看源代码容易,有时候
--接上一句,典型的程序员。
读一辈子代码也不一定能看出个微积分,还是看高数吧
不知道那位虾客能抽出一段代码来摆个擂台?
jdbc只是告诉厂商去实现那些api,如Statement就够了,这个学的东西还是有限,因为sun并没有告诉我们怎么去实现一个driver,也就是jdbc api接口的实现。
不过,我觉得对照servlet规范,看一些最简单的servlet容器实现,如
[url]http://www.onjava.com/pub/a/onjava/2003/05/14/java_webserver.html [/url]
[url]http://tomcat.apache.org/tomcat-5.5-doc/architecture/index.html [/url]
可能收获更大。
看jdbc驱动,先去看这本书吧,mysql的实现,特别是关于MySQL Client/Server Protocol那章:http://forge.mysql.com/wiki/MySQL_Internals
这本书看来难度相当大。对照serlvet规范,读简单的servlet容器的实现是很好的建议,谢谢。
jdbc只是告诉厂商去实现那些api,如Statement就够了,这个学的东西还是有限,因为sun并没有告诉我们怎么去实现一个driver,也就是jdbc api接口的实现。
不过,我觉得对照servlet规范,看一些最简单的servlet容器实现,如
[url]http://www.onjava.com/pub/a/onjava/2003/05/14/java_webserver.html [/url]
[url]http://tomcat.apache.org/tomcat-5.5-doc/architecture/index.html [/url]
可能收获更大。
看jdbc驱动,先去看这本书吧,mysql的实现,特别是关于MySQL Client/Server Protocol那章:http://forge.mysql.com/wiki/MySQL_Internals
说点题外话,建议大家读读HSQLDB的源码,特别是jdbc driver(org/hsqldb/jdbc包)那部分,写得清晰易懂。读了它的部分源码,我自认为对下面一些问题理解深入了:
1、JDBC规范和JDBC实现的关系:怎么自己去设计一个规范,一种架构?我是否自己可以为某种数据设计jdbc driver,如何设计?想想php里面各数据库的函数库各自为政对程序移植性的影响,就知道jdbc规范有多么重要了。
2、JDBC协议:JDBC是基于socket之上的,数据包格式(org.hsqldb.Result)(mysql数据包格式公开了)?那么JMS数据包呢?其实,这也可以延伸到分布式协议的设计原理,如RMI、SOAP。其实,这些数据包格式和JSON、YAML这些message格式没有本质的区别,只不过应用范围不一样。任何分布式协议,肯定有一种message格式。
3、JDBC over HTTP:这样我们对RMI over IIOP, soap over HTTP, http tunnel原理有更深入的理解。
4、什么是long connection(jdbc的socket),什么是short connection(http),具体怎么实现?
3和4这些在HSQLDB的org.hsqldb.HTTPClientConnection类里有实现。
5、Java客户端和服务器端的通讯实现:jdbc driver就可以认为是一个java客户端类库。那么JMS client呢?还有,像mysql有各种语言的driver,原理是什么。
6、sql这种command、描述型语言究竟在数据库里面是个什么地位:sql是怎么传入jdbc driver,最终和database交互的?我们是否可以设计出另外一种command,形成一种行业标准,它在服务器和客户端怎么实现的。
以上我的表达可能有些晦涩,我只想表达一点:大家有兴趣就多读读经典的源码,扩展一下自己的设计思路。可能很多人象我一样,总有忙不完的项目,那么抽几个小时就够了,不必深入。
有很多技术我们理解总是很模糊,当你深入到内部,忽然发现原来就这么回事。我们总觉得IoC很神秘,其实最简单的IoC容器,也许一个HashMap就够了。
评论
15 楼
zwchen
2011-08-20
realdah 写道
楼主除了java用过别的编程语言吗?是否熟悉TCP/IP等协议?
挺奇怪为啥有如此大的感想..
挺奇怪为啥有如此大的感想..
我曾经啃过那本《TCP/IP技术内幕》,也用sniffer探测过TCP、FTP等数据包,开发过BT服务器,但具体到语言实现的层面,还是看这些源码才恍然大悟的。
14 楼
realdah
2007-11-02
楼主除了java用过别的编程语言吗?是否熟悉TCP/IP等协议?
挺奇怪为啥有如此大的感想..
挺奇怪为啥有如此大的感想..
13 楼
zwchen
2007-11-02
javachs 写道
我看了你关于hsqldb的帖子,讲到hsqldb源码里有关于数据库long connection和short connection的实现,我看了下不太明白,数据库的long connection如何保持连接一直不太明白,能讲一下关于数据库长连接吗?
1、数据库的connection保持也就是TCP的连接保持,也就是TCP里面的Keepalive选项:在Socket编程里面的Keepalive。在Java的Socket类中就专门说到SO_KEEPALIVE:http://download.java.net/jdk7/docs/api/java/net/SocketOptions.html,
顺便说一下,在TCP通信期间,是靠sequence number来维持的,它们由initial sequence number (ISN)递增,它是keepAlive的前提。
2、在hsqldb里面,是默认用Java socket的,自己本身并没有去实现long connection,也就是说这个连接默认是2小时,反正我也没有找到这个选项设置的地方。在其HTTPClientConnection里面,倒是每次execute sql后就close了,遵从http协议的short connection实现。附带说一下,在hsqldb里面,是通过sessionID来标识客户端的((这个sessionID可以保证认证后的安全sql),就如同http里面的cookie中的JSESSIONID。
3、我以前做过即时通讯的开发,在OpenFire里面,keepAlive是自己实现的,也就是server端有个demo线程,默认每60s给所有客户端发送一个检测包,如org.jivesoftware.openfire.net包下的SocketConnection的checkHealth() 注释:
/**
* Returns true if the socket was closed due to a bad health. The socket is considered to
* be in a bad state if a thread has been writing for a while and the write operation has
* not finished in a long time or when the client has not sent a heartbeat for a long time.
* In any of both cases the socket will be closed.
*
* @return true if the socket was closed due to a bad health.s
*/
顺便说一下,现在的ajax的push技术(comet)(譬如web版的gtalk、msn),也主要利用http的keepalive选项,还有个专门的协议扩展:http://www.xmpp.org/extensions/xep-0124.html
如果你有兴趣,可以看看《TCP/IP Illustrated, Volume 1: The Protocols》的Chapter 23. TCP Keepalive Timer,文中说到Keepalive是TCP里面的一个可选项,一般由application层实现,并且给出了理由。
12 楼
lihy70
2007-07-02
leebai 写道
楼主揭示出了学习编程的正正之道!
往上看,多是浮躁的、流行一时的东西;往下看,基本上都是沉淀的精华。
作为真正的开发者,研究和学习各种服务器和JDK的原代码,比学习各种框架、ORMaping、J2EE乱七八糟的API要有意义得多。
往上看,多是浮躁的、流行一时的东西;往下看,基本上都是沉淀的精华。
作为真正的开发者,研究和学习各种服务器和JDK的原代码,比学习各种框架、ORMaping、J2EE乱七八糟的API要有意义得多。
icefire 写道
有时候觉得,迷惑的时候,读源码比看API来得快!
写源代码比看源代码容易,有时候
--接上一句,典型的程序员。
读一辈子代码也不一定能看出个微积分,还是看高数吧
不知道那位虾客能抽出一段代码来摆个擂台?
11 楼
hideto
2007-07-02
icefire 写道
有时候觉得,迷惑的时候,读源码比看API来得快!
hand!
10 楼
lando
2007-07-02
感同身受!
9 楼
lordhong
2007-05-17
潜力精华贴...拜读...收藏...
8 楼
icefire
2007-05-17
有时候觉得,迷惑的时候,读源码比看API来得快!
7 楼
leebai
2007-05-17
楼主揭示出了学习编程的正正之道!
往上看,多是浮躁的、流行一时的东西;往下看,基本上都是沉淀的精华。
作为真正的开发者,研究和学习各种服务器和JDK的原代码,比学习各种框架、ORMaping、J2EE乱七八糟的API要有意义得多。
往上看,多是浮躁的、流行一时的东西;往下看,基本上都是沉淀的精华。
作为真正的开发者,研究和学习各种服务器和JDK的原代码,比学习各种框架、ORMaping、J2EE乱七八糟的API要有意义得多。
6 楼
shaucle
2007-05-17
写得很不错
很多源码看了后阔然开朗.
而且很有意思,只是有的要多看几遍.
推荐一些较好的源码(有的正在看)
Seam
Web Work
Hibernate(8)
Pico Container
Lucene
TreeCache
Spring(12)
Hsqldb
db4o
jboss(N)
geronimo
activeMQ
Compass
Equinox
jboss-esb/mule
Asm
Jetty
Terracotta
Jencks
很多源码看了后阔然开朗.
而且很有意思,只是有的要多看几遍.
推荐一些较好的源码(有的正在看)
Seam
Web Work
Hibernate(8)
Pico Container
Lucene
TreeCache
Spring(12)
Hsqldb
db4o
jboss(N)
geronimo
activeMQ
Compass
Equinox
jboss-esb/mule
Asm
Jetty
Terracotta
Jencks
5 楼
yatwql
2007-05-17
粗略扫过一些hsqldb和h2database的代码,觉得h2database写得更干净一些
4 楼
dennis_zane
2007-05-17
zwchen 写道
dennis_zane 写道
我最近在读hibernate2.1的源码,spring的源码读了核心的IOC和AOP后就没去看了,听了你的介绍,也把HSQLDB列入计划:)
按照您的意见,最好是与jdbc规范一起解读?
按照您的意见,最好是与jdbc规范一起解读?
jdbc只是告诉厂商去实现那些api,如Statement就够了,这个学的东西还是有限,因为sun并没有告诉我们怎么去实现一个driver,也就是jdbc api接口的实现。
不过,我觉得对照servlet规范,看一些最简单的servlet容器实现,如
[url]http://www.onjava.com/pub/a/onjava/2003/05/14/java_webserver.html [/url]
[url]http://tomcat.apache.org/tomcat-5.5-doc/architecture/index.html [/url]
可能收获更大。
看jdbc驱动,先去看这本书吧,mysql的实现,特别是关于MySQL Client/Server Protocol那章:http://forge.mysql.com/wiki/MySQL_Internals
这本书看来难度相当大。对照serlvet规范,读简单的servlet容器的实现是很好的建议,谢谢。
3 楼
zwchen
2007-05-17
dennis_zane 写道
我最近在读hibernate2.1的源码,spring的源码读了核心的IOC和AOP后就没去看了,听了你的介绍,也把HSQLDB列入计划:)
按照您的意见,最好是与jdbc规范一起解读?
按照您的意见,最好是与jdbc规范一起解读?
jdbc只是告诉厂商去实现那些api,如Statement就够了,这个学的东西还是有限,因为sun并没有告诉我们怎么去实现一个driver,也就是jdbc api接口的实现。
不过,我觉得对照servlet规范,看一些最简单的servlet容器实现,如
[url]http://www.onjava.com/pub/a/onjava/2003/05/14/java_webserver.html [/url]
[url]http://tomcat.apache.org/tomcat-5.5-doc/architecture/index.html [/url]
可能收获更大。
看jdbc驱动,先去看这本书吧,mysql的实现,特别是关于MySQL Client/Server Protocol那章:http://forge.mysql.com/wiki/MySQL_Internals
2 楼
zwchen
2007-05-17
顺便说一下,现在我们项目组正在用Jive公司的Openfire+spark做即时通讯方案,其实,研究那种XMPP(Jabber)协议,和jdbc、JMS并没有什么本质的区别。想想曾经看过部分Tomcat的源码,觉得也差不多,只是它走标准的http,也就是发http数据包让服务器处理,而即时通讯客户端,如gtalk,是发XMPP数据包给服务器处理。你看即时通讯的应用和我们的web程序有多少相似之处:处理库存查询:http://www.activesoft.com.cn/pipeintrokc.asp 。网上那些msn、QQ机器人也就是这样的模式。
1 楼
dennis_zane
2007-05-17
我最近在读hibernate2.1的源码,spring的源码读了核心的IOC和AOP后就没去看了,听了你的介绍,也把HSQLDB列入计划:)
按照您的意见,最好是与jdbc规范一起解读?
按照您的意见,最好是与jdbc规范一起解读?
发表评论
-
一个优秀的Java企业应用框架的设计和实现
2013-10-25 17:43 52一个优秀的Java企业应用框架的设计和实现: http:/ ... -
一个Java框架引发的思考:语言、框架、范式转换和软件生产力
2011-09-10 13:26 3693前几天,iteye上的pojo同学,发来了他四年前写的一个框架 ... -
电子商务网站,前后台是否该分离?
2011-08-21 12:44 8034做电子商务网站,一般 ... -
Java源码阅读的真实体会
2011-08-20 19:51 25758刚才在论坛不经意间,看到有关源码阅读的帖子。回想自己前几年,阅 ... -
我理解的互联网应用和企业应用开发
2011-07-12 12:01 3168前段时间,我写过一篇该主题的博客,但写完了,我觉得还是没有谈到 ... -
一个在读学生的疑问及我的回复
2011-06-24 11:39 3075我经常收到类似的站内信,然后花上半个来小时回复(我摆文字真的非 ... -
一位技术人员成长历程
2010-05-26 15:52 126074、坚持了第一个月,再坚持半年,以后的学习速度越来越快,你离 ... -
Java虚拟机技术总结(07年写的,原JavaEye精华帖)
2010-04-17 11:15 8350原文:IBM WebSphere Application Se ... -
IBM WebSphere Application Server 诊断和调优(07年写的,原JavaEye精华帖)
2009-12-19 11:07 8259这是上篇文章的续篇, ... -
JBPM源码浅析
2007-09-13 15:04 16452离职啦,工作交接中, ... -
JBPM阶段性工作总结
2007-09-12 15:20 14426快要离职了,工作交接 ... -
AIX学习总结笔记一
2007-07-03 18:07 8482公司项目用到AIX和Websphe ... -
软件开发的一点感想
2007-06-29 10:53 6069这两天,遇到工作中的两个小问题,加深了我以前对软件开发的看法。 ... -
Java线程安全系列(1)--Servlet线程安全
2007-06-16 23:19 13255刚才search的时候,竟然 ... -
从分布式系统的角度看REST
2007-05-28 20:37 3580原帖:http://www.iteye.com/t ... -
也说说项目成败、企业信息化
2007-05-19 15:25 2596这篇文章是我对nbsp同学 ... -
Web Services开发体会和项目教训
2007-04-21 14:42 52841去年,在一个大型项目( ... -
Seasar Framework介绍(一)
2007-04-21 00:18 10895近段时间,给公司一项 ... -
Struts的html:options 标签内幕
2007-04-20 18:14 7928最近用一个在日本很流 ... -
HTTP客户端POST方式中文解决方案
2007-01-17 20:26 17527这段时间,在给一个地 ...
相关推荐
由于HSQLDB是开源的,开发者可以深入研究其源码,理解数据库的内部工作原理,如查询解析、执行计划生成、事务管理等,这对提升数据库相关的技术能力非常有帮助。 总之,HSQLDB作为一个轻量级、高性能的数据库,广泛...
HSQldb是一个轻量级的关系型数据库管理系统,特别适合用于系统演示、开发和测试环境。它的特点是快速、灵活且易于使用。HSQldb支持多种运行模式,满足不同场景的需求。 1. **数据库实例创建** 创建HSQldb数据库...
HSQldb的源码开放,开发者可以深入了解数据库的实现机制,这对于学习数据库设计和优化非常有帮助。同时,HSQldb支持多种管理工具,如SQuirreL SQL Client、DBVisualizer等,方便用户进行数据库管理和维护。 总之,...
**HSQldb 2.25 知识点详解** HSQldb,全称为HyperSQL Database,是一款开源、轻量级、嵌入式的关系型数据库管理系统。它支持标准的SQL语法,包括SQL-92和SQL:2003,且在Java环境中运行,无需依赖外部操作系统服务。...
**HSQldb 2.2.8 数据库详解** HSQldb(HyperSQL Database)是一款高效、轻量级且开源的Java数据库管理系统,它在IT领域中被广泛应用于开发、测试以及小型应用环境。HSQldb完全用Java编写,因此具有良好的跨平台性,...
### HSQLDB快速连接数据库 #### 一、HSQLDB简介与特点 HSQLDB(HyperSQL Database)是一款优秀的轻量级开源纯Java SQL数据库管理系统。它被设计为易于集成到现有的Java应用环境中,尤其适合那些对性能和资源消耗有...
1. **下载**: 首先,你需要从HSQLDB的官方网站或者通过Git仓库获取最新的源码或二进制发行版。下载完成后,解压缩文件到你选择的目录。 2. **运行**: HSQLDB提供了命令行界面和一个简单的图形用户界面。在命令行中...
hsqldb数据库下载,很好用,简易的内存数据库,特别适合初学者。
HSQldb,全称HyperSQL Database,是一款开源的、轻量级的关系型数据库管理系统,尤其适合于嵌入式应用和开发测试环境。HSQldb完全用Java编写,因此具有跨平台性,能在任何支持Java的环境中运行,包括Windows操作系统...
HSQLDB是用Java编写的,因此其源码可读性较高,对于学习数据库原理和实现有很高的价值。通过阅读源码,开发者可以深入理解SQL的执行流程、事务管理、索引构建等核心概念。 **工具支持** HSQLDB提供了一个命令行...
### HSQLDB中文帮助文档知识点总结 #### 一、HSQLDB概述 - **定义**:HSQLDB(HyperSQL Database)是一款轻量级、开源的纯Java SQL数据库管理系统。它能够作为嵌入式数据库使用,也可以作为一个独立的服务器运行。 ...
《HSQldb与Java数据库连接详解》 HSQldb(HyperSQL Database)是一款开源、轻量级、嵌入式的关系型数据库管理系统,广泛应用于Java应用程序中。它支持SQL标准,提供单用户和多用户模式,并且可以运行在内存中或磁盘...
hsqldb jdbc driver适合于hsqldb
**HSQldb 概述** HSQldb,全称 HyperSQL Database,是一个开源、轻量级、完全Java编写的数据库管理系统。它支持多种数据库模式,包括纯内存储存、文件系统存储以及网络服务器模式,使其在多种场景下都能发挥效用。...
《HSQLDB 1.8.0:轻量级数据库引擎的深度剖析》 HSQLDB,全称为HyperSQL Database,是一款开源、轻量级、高性能的关系型数据库管理系统,广泛应用于嵌入式系统和测试环境。HSQLDB 1.8.0是该数据库引擎的一个重要...
HSQldb是一个开源的、轻量级的、嵌入式的Java数据库引擎,常用于开发测试环境和小型应用程序。它的全称是HyperSQL Database,能够支持SQL标准,包括SQL:2011。HSQldb因其小巧、快速和易用的特点,在Java开发中尤其受...