- 浏览: 208587 次
- 性别:
- 来自: 上海
最新评论
-
flykarry:
说半天让我感觉NIO除了复杂了就没别的优点了
java Bio与Nio通信方式小例子 -
fei33423:
//最初的java socket ...
java Bio与Nio通信方式小例子 -
jason-:
我看AOP的源码也是你这个思路,但是在网上一搜,尼玛大多数的都 ...
spring源码分析之——spring aop原理 -
ooo456mmm:
java Bio与Nio通信方式小例子 -
ooo456mmm:
嗯,这个主要是讲了一下具体用法。
java Bio与Nio通信方式小例子
文章列表
今日部署tomcat的时候提示thread local 可能引起内存泄漏,于是研究了一下在java中可能引起内存泄漏的
一些点,简单写一下
内存泄漏,在我看来大体有两个原因。一是本身就是跟操作系统紧密相关的资源型对象,在使用的时候要比较小心,不然容易引起泄漏。比如:
1. socket
2. 线程
再者就是生命周期比较长的java对象。比如static类型的对象,或者对象本身被长生命周期的对象所直接或间接引用导致
没法gc,比如:
1.static 容器。如果数据量过大需要适当的清理策略
2. threadlocal. 因为threadlocal的生命周期在某种程度上讲是跟线 ...
近几日晚上闲来无事,研究了一下Ehcache的分布式缓存的实现。发现我看到的这一个版本是通过RMI实现的,
同时RMI的实现方式也是直接集成在Ehcache的jar包里面的。此外Ehcache还提供了JMS,jgroup的实现方式。本文
只简单讨论一下rmi实现方式。
闲言少叙,先上图,大概描述一下几个主要的类的关系。(公司里面从来不用UML,所以本人第一次画这种UML,肯定画得不好,忘大家多对指教。接口都略去了,只保留了实现类,这样理解起来更容易一些。)
像很多框架一样,ehcache也有一个暴露给客户端的核心类:CacheManager. ...
大家都知道,在开发一个互联网应用的时候,为了达到一种服务端和客户端有状态的效果,需要有一个sessionid 来对客户端进行标志。很多时候,这是通过在客户端防止session cookie实现的。但是如果客户端禁用了cookie呢?这就需要通过urlrewrite或者其他方式来实现。于是我们可能就在应用里面不需要cookie了。既然不需要了当然是希望我们的应用不对cookie进行处理。很遗憾的是,tomcat默认的是处理cookie的。每次请求过来的时候,都会解析request head里面的cookie信息,试图从中发现sessionid的信息。于是我们就需要从应用 ...
最近有空看了一下tomcat 6源码里面对session管理的实现,现在写下来,以供后考,也希望能对对此感兴趣的朋友
有所提示。
闲话少说,先贴一下tomcat6的component层次图(此图来自tomcat doc)
Server 就是一个servlet container | Service 包含一个或多个connector的组 | Engin ...
最近在项目中遇到了定时对账的需求,本来是打算用Timer来着,后来因为考虑到需求可能会进一步细化,比如从最初的每日一对变为每小时一对等等,觉得还是使用相对成熟的框架quartz比较好。下面就自己的使用过程中的一些经 ...
今日做东东,遇到一个问题。就是一些bean是通过@Service的方式声明成为bean的。
结果在某些应用里面因为需要序列化的原因,不能直接注入bean,需要在bean加载完之后手动取出需要的bean并且应用。但是声明的bean并没有名字....
疑惑之下,看了一下Spring的源码,理解了一下spring bean的id,name的管理方式,理解如下:
id是唯一标志一个bean的。在一个bean生成的过程中,如果有id,那么自然最好。如果没有设置id,只设置了
name属性(name属性可以设置多个,比如: a,b,c),那么就把name属性中的第一个取出 ...
最近做项目遇到需要同时用到两个数据库里面的表的问题,于是了解了下dblink以及alias.
加入操作的主数据库实例是A,但是同时需要用到B里面的表T.于是建一个database link:
建好之后,如果客户端需要操作操作,只需要T@dblink name 就可以访问到B里面的T了。
但是每次访问都需要制定dblink显然是不理想的,于是用到了别名。
直接为一个远程表制定一个本地别名,比如:T2. 于是可以直接通过访问T2来访问到远程表的数据了。
最近在维护系统的时候遇到一个问题,就是经常那个报题目中出现的: maximum open cursors exceeded 错误。网上查了一下,原来是因为对statement没能正常关闭导致cursor数量一直递增引起的。于是修改了具体操作jdbc的方法,把所有在异常里面以及外面的关闭statement的语句都去掉,只在捕捉异常后finally里面关闭。结果搞定。 事实证明,jdbc确实比orm更容易引起问题。但是也能更多增强多jdbc以及数据库的理解。
之前已经分析过了tomcat监听并且接收socket的过程,这里不再赘述。接收到socket之后,通过http11processor从socket中提取出request,response.然后调用Adapter的service方法处理request,response. 对request,response的处理应用了chain of responsibility 设计模式。tomcat中的container共有四级:Engine,Host,Context,Wrapper. request和response需要在这四级里面层层处理,最后到达wrapper里面的servlet.那么这种传递是怎么实现的 ...
研究过tomcat源码的朋友们可能都发现了,tomcat中几个主要的component都实现了Lifecycle接口,并且在
start的时候通常都会publish一些事件。在这个过程中tomcat是通过Observer模式来实现相关功能的。下面以StandardHost为例来说明。
StandardHost是StandardContext(也就是部署在tomcat下面的一个个应用)的上级Container.Host是在Digester server.xml文件的时候生成的。但是,在digester的时候,并没有standardcontext的相关配置。那么,S ...
tomcat 从接受请求到处理的流程大概如下:
首先配置文件中的connector都对应一个Connector类,这个类根据配置信息确定对应的
ProtocalHandler(处理connector配置对应的协议).
public void start() throws LifecycleException {
if( !initialized )
initialize();
// Validate and update our current state
if (started ) {
if( ...
在Spring中AOP有几种配置方式,根据我对spring源码的浏览,发现几种实现方式原理如下:
1. ProxyFactoryBean
<bean name="myController" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="interceptorNames">
<list>
<value>pointcut.advisor2< ...
Spring 中有一个接口非常重要:BeanPostProcessor,这个接口是对bean进行预处理的。
当spring解析bean的时候,在初始化受管bean之前,会调用所有实现了BeanPostProcessor接口的beandefinition的postProcessBeforeXXX方法。
初始化之后,会调用postProcesAfterXXX方法。
下面再来看AOP,都知道aop是通过生成代理类的方式来实现的,那么代理类是在什么时候生成的拿?原来,在
解析aop namespace配置文件的时候,spring自动生成了一个beandefinition:org.spr ...
最近用spring的时候感觉不怎么了解内部原理,用起来有些不习惯,于是找空看了一下spring的源码,看了一下bean加载的流程以及调用流程,现总结如下:
加载
contextLoaderListener->ContextLoader.initWebApplicationContext,调用本对象的createWebApplicationContext->ConfigurableWebApplicationContext.refresh()->AbstractApplicationContext.refresh();
在上面的refresh里面有
C ...
1. 对于有上下级关系的数据的树形结构的读取
比如: table A: id,name,parentid
那么已知id=999的,需要找到
1) 所有下级节点(包含自己)
select level,id from A start with id=999 connect by prior id=parentid
2) 所有上级节点
select level,id from A start with id=999 connect by prior parentid=id
根据level还可以选取处于某一特定深度的节点
...