`
zddava
  • 浏览: 243024 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
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 ...
在开始下面的分析前,先补一下课,插播下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 ...
前面已经知道了对于JDBC4.0,java.sql.Connection的网络服务器和嵌入式的实现类分别为NetConnection40和EmbedConnection40。 下面就以就以嵌入式方式为例来说明下ResultSet的获取过程。 一个一般的调用过程应该是如下这样的, Connection conn = DriverManager.getConnection(url, "username", "password"); Statement stmt = conn.createStatement(); ResultSet rs = ...
谈起JDBC的实现,还是从获取Connection开始吧。 下面这句就是一般的获取Connection的代码了, DriverManager.getConnection(url, "username", "password"); 当每个Driver初始化的时候,都会在DriverManager中注册下自己,就是调用这个registerDriver(java.sql.Driver driver)静态方法,然后当想获得Connnection的时候DriverManager就可以通过注册的驱动来从特定的数据库获得了。如果有兴趣可以看一下JDK中Drive ...
看过#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 ...
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 ...
一直以来都想研究下数据库的实现原理,Derby在我眼里绝对是一个完美的切入点。首先它是100%纯Java实现,对于我这种Java程序员来说简直完美的,不需要去懂C,C++...等等无疑减少了很大的难度;其次,它是开源的,当然这个就是废话,不然我去哪里弄它的源码去。废话少说,首先简单的介绍下Derby。 Derby的启动方式有两种,一种是网络服务器的方式,这种方式就和大家平时用的Oracle,SQL Server,DB2等等没什么区别,另外一种是嵌入式方式,是一种类似于Access的方式,在这种方式下,Derby与应用程序运行于同一个JVM下,随着应用程序的关闭而关闭(我很欣赏这个方式,呵呵)。 ...
Global site tag (gtag.js) - Google Analytics