Java中的动态代理
动态代理采用动态字节码生成加载技术,来实现运行时动态生成代理类。
- 不需要为每个主题生成形式一样的封装类。
- 使用动态代理的生成方法可以在运行时指定代理类的执行逻辑。
生成动态代理的方法很多:JDK自带的动态代理,CGLIB,Javassist,ASM库。
动态代理类的生成主要涉及对ClassLoader的使用。JDK的动态创建类可以作为native实现,创建最快。在代理类的函数调用中,CGLIB和Javassist快于JDK的实现。
Hibernate中的代理模式
当hibernate加载实体bean时,并不会一次性将数据库中的数据都装载。默认情况下,通过属性的延迟加载或者关联表的延迟加载,来延迟加载提高系统初始化的速度。
Cache
缓存暂存数据,提供访问使用,来提升系统性能。减少系统访问热点数据的开销。最简单的缓存可以通过HashMap来实现,EHCache缓存出自Hibernate,是Hibernate默认的数据缓存解决方案。
对象复用
对象池化核心思想是,如果一个类的实例频繁被请求,就将这个实例保存在池中,等待需要时从池中取出供使用。
数据库连接池组件有C3P0和Proxool。JDK中,new的操作效率是相当高的,不需要考虑new所带来系统开销。new操作调用的类构造函数可能是耗时,可以考虑对象池化。
负载均衡
大型应用的系统负载很严重,为了保证程序的服务质量,需要使用多台计算节点协作,均衡负载。
典型Tomcat集群有黏性Session模式和复制Session模式。
黏性模式下,所有session信息被平均分配到Tomcat节点上,一旦宕机,所维护的数据就丢失。复制模式下,所有的session信息在各个Tomcat节点上保持一致。当一个节点的session信息修改时,session会被广播到其他Tomcat节点上,以保证Session同步。Terracotta进行Tomcat的session共享时,采用的是部分复制,仅仅传输变化的部分。
时间换空间
交换两个变量的值
a=a+b;
b=a-b;
a=a-b;
空间换时间
通过缓存