- 浏览: 243024 次
- 性别:
- 来自: 北京
最新评论
-
feifei435:
不错的文章,但是有一点忘了提,创建了新的sessionid后, ...
Tomcat的Session管理(一) - Session的生成 -
yangcheng33:
博主你为什么这么棒!!!
Tomcat的Session管理(一) - Session的生成 -
u010323779:
哈哈,非常不错,昨天看了一天源代码,不知从何入手,现在看来您的 ...
Tomcat的Session管理(二) - Session后台处理 -
hdwmp123:
...
Tomcat请求处理(一) -- 服务器端口监听 -
tinguo002:
...
Tomcat的Session管理(一) - Session的生成
文章列表
oscache对于jsp/servlet的缓存是使用Filter来实现的,对应的类是com.opensymphony.oscache.web.filter.CacheFilter,既然是Filter那么要看的自然主要有三个方法:init、doFilter和destroy,这里#destroy()并没有具体实现,只关注前两个即可,首先看一下#init()方法,
public void init(FilterConfig filterConfig) {
config = filterConfig;
log.info("OSCache: Initializing Cach ...
oscache的默认缓存实现是由4个类组成的,如下图所示:
首先来看一下是如何放入缓存的操作吧,也就是AbstractConcurrentReadCache类的#put()方法:
public Object put(Object key, Object value) {
return put(key, value, true);
}
// 这里的第三个参数代表是否持久化缓存
private Object put(Object key, Object value, boolean persist) {
if (value == null) {// 默认是不支持 ...
现在开始要介绍的从缓存中读取数据的过程,还是在GeneralCacheAdministrator#getFromCache(),这里有3个同名方法,还是找一个参数最多的:
/**
* Get an object from the cache
*
* @param key
* The key entered by the user.
* @param refreshP ...
其实之前我完全没有接触过oscache,今天突发奇想,准备看看缓存是怎么实现的,google了一下,决定看看oscache的源码,简单的写了个TestCase:
@Test
public void testPojoCache() throws Exception {
TestPojo pojo = new TestPojo("0001");
pojo.setField1(100);
pojo.setField2("100");
Properties prop = new Properties();
InputStr ...
现在请求到了Protocol(Http11NioProtocol)的#process()方法了,由于方法较长,很多代码没有列出:
public SocketState process(NioChannel socket) {
// 得到Processor
Http11NioProcessor processor = connections.remove(socket);
try {
if (processor == null) {
processor = recycledProcessors.poll();
}
if (processor ...
接着上面的流程,现在请求到了Poller的#register()方法
public void register(final NioChannel socket) {
socket.setPoller(this);
// KeyAttachment是对NioChannel信息的包装,同样是非GC
KeyAttachment key = keyCache.poll();
final KeyAttachment ka = key != null ? key : new KeyAttachment(socket);
ka.reset(this, socket, getS ...
这里主要讲一下Tomcat使用NIO启动和进行请求处理的大致流程,使用的源码版本是7.0.5,对于其他处理等流程就不写了,我在别的文章里已经大致写过了,不过是用的6.0版本:http://zddava.iteye.com/category/53603。
当Tomcat配置成使用NIO时,启动过程其实和过去差不多,也是Connector#startInternal -> Protocol(Http11NioProtocol)#start() -> Endpoint(NioEndPoint)#start()的过程,这里主要看一下NioEndPoint:
public void st ...
2009年也过去一段时间了,不过最近一直很忙,都没来得及更新blog。
09年换了一次工作,之后就感觉日子过的很快,还没来得及有什么感想,日子就已经匆匆的过去了。前段时间还在看Derby的源代码,看到SQL层真的是看不下去了,动不动一个类2w多行,里边定义了很多矩阵型的数据,完全不知道是做什么的。本来还想着能读到执行计划的部分,看来是不行了。
09年开始看一些软件架构的书,比如温昱的《软件架构设计》,大概读了一半就读不下去了,对我这种还在开发第一线的人来说这本书还是有点“高来高去”。后来弄了本《架构之美》,还没开始读,因为我发现我的兴趣突然转向另外一个方向了。感觉自己毕竟工作经验少,才3年不 ...
前段时间事情太多,一直没有继续看Derby的源代码。国庆过去了,闲暇的时间多了些了,终于可以接着把这个系列写完了。不过也过了很长时间了,自己前面看的东西都忘的差不多了...... 慢慢找回来吧!
前面的文章提到了Derby的JDBC层,不敢说仔细的读,也就是大概的过了一遍,下面的文章主要是讲的SQL层,前面的JDBC实现(二)这篇文章中提到了JDBC层的sql语句执行的代码,其中在执行SQL的过程中,涉及到了Activation的获取,见org.apache.derby.impl.jdbc.EmbedStatement#execute(String, boolean, boolean, int ...
- 2009-10-15 10:36
- 浏览 4121
- 评论(1)
在开始下面的分析前,先补一下课,插播下Derby的代码结构,
Derby主要是分四个部分来组织代码的:JDBC, SQL, Store and Services。
JDBC层处于最顶端,是与应用程序进行交互的部分。JDBC的下面是SQL层,SQL层主要是负责编译和执行这两种工作,生成SQL执行计划并返回执行结果。再向下的一层是Store层,主要负责访问数据和存储。最后是Service,顾名思义,就是一些服务的module了。这个的原文在http://db.apache.org/derby/papers/derby_arch.html,可以自己去了解下。
所以,我们这部分的解析主要是了解JD ...
- 2009-08-31 08:46
- 浏览 2837
- 评论(0)
前面已经知道了对于JDBC4.0,java.sql.Connection的网络服务器和嵌入式的实现类分别为NetConnection40和EmbedConnection40。
下面就以就以嵌入式方式为例来说明下ResultSet的获取过程。
一个一般的调用过程应该是如下这样的,
Connection conn = DriverManager.getConnection(url, "username", "password");
Statement stmt = conn.createStatement();
ResultSet rs = ...
- 2009-08-19 09:11
- 浏览 1966
- 评论(0)
谈起JDBC的实现,还是从获取Connection开始吧。
下面这句就是一般的获取Connection的代码了,
DriverManager.getConnection(url, "username", "password");
当每个Driver初始化的时候,都会在DriverManager中注册下自己,就是调用这个registerDriver(java.sql.Driver driver)静态方法,然后当想获得Connnection的时候DriverManager就可以通过注册的驱动来从特定的数据库获得了。如果有兴趣可以看一下JDK中Drive ...
- 2009-08-02 01:28
- 浏览 3446
- 评论(0)
看过#getImplementations()之后,来看一下#startServices()方法,这个方法就是启动服务了,前面看到的JDBC服务就是在这里启动的(addProperty("derby.service.jdbc", "org.apache.derby.jdbc.InternalDriver");)
public void startServices(Properties properties, boolean bootAll) {
if (properties == null)
return;
for (Enume ...
- 2009-07-28 22:41
- 浏览 2009
- 评论(0)
2. 嵌入式方式
在开始这部分前,有一些必须的Derby架构的东西需要好好的了解下,可以在Derby的官方网站看一下,地址是http://db.apache.org/derby/papers/derby_arch.html
首先,Derby是由monitor和一系列的module组成的,每个module都代表了一个独立的功能,并且基接口通常是在java.sql包中定义的接口,比如JDBC驱动,锁管理等等。而monitor可以把对module的请求映射到module的具体实现上。比如JDBC驱动,monitor会把来自JDK1.3的请求转给JDBC2.0的实现,而JDK1.4的则转给JDBC3 ...
- 2009-07-23 23:57
- 浏览 2787
- 评论(0)
一直以来都想研究下数据库的实现原理,Derby在我眼里绝对是一个完美的切入点。首先它是100%纯Java实现,对于我这种Java程序员来说简直完美的,不需要去懂C,C++...等等无疑减少了很大的难度;其次,它是开源的,当然这个就是废话,不然我去哪里弄它的源码去。废话少说,首先简单的介绍下Derby。
Derby的启动方式有两种,一种是网络服务器的方式,这种方式就和大家平时用的Oracle,SQL Server,DB2等等没什么区别,另外一种是嵌入式方式,是一种类似于Access的方式,在这种方式下,Derby与应用程序运行于同一个JVM下,随着应用程序的关闭而关闭(我很欣赏这个方式,呵呵)。 ...
- 2009-07-13 13:54
- 浏览 3976
- 评论(1)