自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 PoEAA笔记-9.1 事务脚本

本文来自PoEAA,预知详细内容请看原文。

2024-03-08 20:10:29 395

原创 PoEAA笔记-8.通盘考虑

本文源自《PoEAA》,如预知详细内容请阅读原书。

2024-03-07 18:29:20 823

原创 CAS&Atomic原子操作详解

我们在接触到事务的时候,了解到事务的一大特性是原子性,一个事务要么全部执行、要么全部不执行。并发里的原子性和事务里的原子性有一样的内涵和概念。假定有2个操作A和B都包含多个步骤,从线程A的角度看,线程B要么全部执行要么全部不执行,B看A也是如此,那么A和B对彼此来说都是原子的。实现原子操作可以使用锁,锁机制,满足基本需求是没有问题的,但有时候我们需要更有效,更加灵活的机制。

2024-02-29 07:06:08 822

原创 ThreadLocal详解以及其导致的内存泄漏

JVM 利用设置 ThreadLocalMap 的 Key 为弱引用,来避免内存泄露。JVM 利用调用 remove 、get、set 方法的时候,回收弱引用。当 ThreadLocal 存储很多 Key 为 null 的 Entry 的时候,而不再去调用 remove、 get 、set 方法,那么将导致内存泄漏。使用线程池+ThreadLocal时要小心, 因为这种情况下, 线程是一直在不断的重复运行的,从而也就造成了 value 可能造成累积的情况。

2024-02-28 16:50:29 869

原创 并发编程基础

为什么用户线程又被称为协程呢?我们知道,内核线程的切换换开销是来自于 保护和恢复现场的成本, 那如果改为采用用户线程, 这部分开销就能够省略掉 吗?答案还是“不能”。但是, 一旦把保护、恢复现场及调度的工作从操作系 统交到程序员手上, 则可以通过很多手段来缩减这些开销。

2024-02-25 18:08:18 808

原创 PoEAA笔记-7.分布策略

所有到Web服务器的调用都被Http协议传给底层的面向对象接口处理,这在一定程度上能取得两者的长处,但由于需要Web服务器和主机远程面向对象接口,从而增加了系统复杂度,因此,应该在同时需要使用Http协议和远程面向对象的API时,或者在安全的事务处理机制的远程面向对象API的设施能比使用本地对象更容易地处理这些问题时才能使用这种方法。使用远程外观能减少粗粒度接口引入的困难,这样那些真正需要远程服务的对象才使用粗粒度接口,这也使开发人员清楚所付出的代价,透明有它的好处,但不要期待一个潜在的远程调用透明。

2024-02-06 22:23:37 841

原创 G1与ZGC

G1收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的Region,比如一个Region花200ms能回收10M垃圾,另外一个Region花50ms能回收20M垃圾,在回收时间有限情况下,G1当然会优先选择后面这个Region回收。存活的对象越多,回收垃圾的效益比越低。G1垃圾收集器对于对象什么时候会转移到老年代根之前讲过的原则一样,唯一不同的是对大对象的处理,G1有专门的大对象存储区Humongous,当放到Eden区时超过50%,则放到Humongous区。

2024-01-25 19:08:43 1101

原创 垃圾收集算法

垃圾收集算法有如下几种:分代收集理论:年龄代和老年代选择各自的垃圾收集算法。复制算法:可达性分析算法找非垃圾对象,然后把非垃圾对象移动到另一端,这一端的垃圾对象清除,该方法浪费内存,用于年轻代。标记清除算法:非垃圾对象标记好,没有标记的全清除掉,存在效率问题(如果需要标记的对象太多,效率不高)、空间问题(标记清除后会产生大量不连续的碎片)标记整理算法:标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收。而是让所有存活的对象向一端移动,然后直接清理掉边界外的内存。

2024-01-23 17:49:05 1013

原创 JVM对象创建与内存回收机制

如果S区超过50%,进入老年代,例如Survivor区域里现在有一批对象年龄1+年龄2+年龄n的多个年龄对象总和超过了Survivor区域的50%,此时会把年龄n(含)以上的对象都放入老年代,这个规则其实是希望那些可能是长期存活的对象,尽早进入老年代,对象动态年龄判断机制一般是在minor gc之后触发。虚拟机遇到一个new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过,如果没有,那么必须先执行相应的类加载过程。

2024-01-21 19:00:01 1121

原创 PoEAA笔记-6会话状态

很多与客户端交互本身是有状态的,想象一个有成千上万用户的电子商务网站用到的购物车,用户交互包括浏览书籍和购买想买的书,购物车必须在用户的整个会话中保存,实质上这是一个有状态的业务事务,也就说明会话必须是有状态的,如果只是浏览一下不买书就是无状态的,一旦买了,就是有状态的。一个有趣的结果的对一致性的影响,当某个客户在编辑保险单时,当前的保单状态可能时不正确的,客户修改了一个值,并提交,这时系统返回无效值,这些值是会话状态的一部分,但他是无效的。购物车的内容就是会话状态,意味着其中的数据只与特定会话有关。

2024-01-20 21:34:22 1089

原创 JVM内存模型剖析

Math.class最终是加载到方法区,字节码执行引擎执行方法区的Math,当其他线程抢占了,恢复时恢复到程序计数器的位置,将操作数栈的数据取出,执行iadd,结果重新压回操作数栈,继续执行,将10压入操作数栈,将操作数栈数据取出,执行imul,得到30,压回操作数栈,是操作数存储值的地方,是做计算的临时的中转内存空间。本地方法栈:native本地方法,C++实现,如果需要调用到本地方法,分配内存空间,线程栈里也有本地方法栈,堆和方法区市所有线程共享的区域,栈、本地方法栈、程序计数器是每一个线程独有的。

2024-01-20 18:24:41 733

原创 类加载器与双亲委派机制

双亲委派机制是Java中的一种类加载机制。双亲委派机制是当加载一个类时,先由父类加载,父类加载不到时再由子类加载。这种机制的好处是避免了类的重复加载,提高了类加载的效率和安全性。同时,它也为Java提供了一种扩展机制,允许开发人员自定义类加载器,实现特定的加载策略。

2024-01-19 15:13:37 894

原创 PoEAA笔记- 并发-5.6 离线并发控制的模式-5.7 应用服务器并发

另一个对应用开发人员较为简单的方法是使用“隐含锁”,可以不用直接管理锁,这不但减少了工作量,也减少了由于疏忽而产生的错误——而这是很难发现的。这些对象的创建代价仍是比较高,并因而需要别处的处理,最常见的例子就是数据库连接,为了处理这个问题,你剋呀将这些对象放入一个显示的缓冲池当中,当需要时从缓冲池中取得一个连接,用完后放回来,这些操作都需要同步。如果使用每会话一线程,最重要的是创建和进入一个隔离区,在隔离区中应用开发人员可以忽略多线程问题,最常用的方法是让线程每次创建新的对象来处理请求。

2024-01-11 16:57:49 326

原创 PoEAA笔记- 并发-5.3 隔离不变性...

在这种情况下,只能把业务事务分成一系列的短事务,这意味着只能自己为跨系统事务的业务事务提供ACID支持——我们称之为李现并发问题,仅仅将一系列系统事务依次连接在一起是不是以支持一个业务事务的。如果在开始修改之后有一个产品出现在产品列表里,不会有什么重要的影响,但如果是已经汇总的费用清单,问题就会严重得多,不管使用哪种形式的并发控制,指出哪些需要控制,哪些不需要控制,实在是一件棘手的事。所以,一个避免并发冲突的方法是识别哪些是不变的数据,显然,使所有数据都不变是不可能的,因为许多系统本来就要对数据进行修改。

2024-01-11 16:22:02 885

原创 PoEAA笔记- 并发-5.1 并发问题-5.2 执行语境

企业开发者能够简单的避开并发处理的原因是有了事务管理程序,事务提供了一个框架,用以在企业应用中避免棘手的并发问题。只要所有数据都在事务中操作,真正严重的问题就不会发生。遗憾的是,这并不意味着可以完全忽略并发问题,最主要的原因是:系统的许多交互并不是在一个数据库事务中进行的,这就要求在跨事务的数据处理中管理好并发问题。有关的术语称为离线并发。

2023-12-19 20:34:24 350

原创 PoEAA笔记- Web表现层-4.2 输入控制器模式

在大部分的时间中,动作和显示的页面相对应,但偶尔也不是——例如,根据某个条件,同一个链接可能会链接到不同的页面上。任何输入控制器都有两个责任——处理HTTP的请求消息,根据请求的消息来决定下一步做什么——把它们分开是很有意义的。这个单一的处理程序解释URL来计算出它正在处理哪种类型的请求消息,然后创建一个分离的对象来处理它。通过这种方法,可以用一个单一的对象处理所有的HTTP页面,这样,当站点的行为结构有所改变的时候,就可以避免重新配置Web服务器了。输入控制器有两种模式,页面控制器和前端控制器。

2023-12-18 18:30:35 383

原创 PoEAA笔记- Web表现层-4.1 视图模式

两步视图的优点是它可以决定把什么样的HTML网页用在一个地方,这使得全局改变HTML网页变得很容易,因为但如果要改变每个屏幕的内容,只需对一个目标对象进行修改,当然,如果逻辑表现层是 一样的,它仅仅能带给你这些好处,因此当不同位置的屏幕使用相同的基本设计时,它可以很好地工作,当站点设计的过分精细时,通常不容易提取出很好的逻辑屏幕结构。),如果领域数据时XML格式存在的,或者很容易转换成这种格式,那么转换视图时非常有效的,一个输入控制器挑选合适的XSLT样式表单,然后把它应用在由模型收集的XML上。

2023-12-18 17:58:57 411

原创 PoEAA笔记- 4.Web表现层

并不是所有的系统都需要应用控制器,如果你的系统在屏幕的次序和屏幕之间的导航上有丰富逻辑关系,那么这些应用控制器非常有用,如果你的网页与领域上的行为没有一个简单的映射,则这个应用控制器也很有用,但是如果有人可以很好地以任何次序观看任何屏幕,你也许就不需要任何控制器了,可以进行这样的测试:如果机器处在屏幕流的控制下,那么就需要用用控制器,如果这台机器是在用户的控制之下,就不需要应用控制器。如果不同的表现层共用相同的基本流和导航,通常没什么问题,不过最好给每个不同的表现层一个不同的流。

2023-12-11 21:10:43 338

原创 PoEAA笔记-映射到关系数据库-3.7 数据库连接

尽管更多的现代环境已经没有这个问题,但如果使用位置索引来从列中得到信息,那么选择select *也是不明智的,因为一个列的从新排序同样会导致代码失效。这样做的问题是:连接的关闭只有当垃圾回收器实际收内存的时候才发生,可能离这个连接失去它最后一次引用的时间已经很久了。最常见的建议就是用一个到连接池或者连接管理器的调用,显示得到一个连接,并且通过它来执行数据库命令,一旦执行完了,立刻把它关闭。还有,如果正在进行一次事务,通常需要保证:在这次特定的事务中,每一个命令都是从同一个连接发出的。

2023-12-09 21:44:37 357

原创 PoEAA笔记-映射到关系数据库-3.6 使用元数据

一直用这种方法可以建立一个资源库,它能在很大程度上隐藏数据库,任何到数据库的查询可以做成资源库基础上的查询对象,并且开发者不用分辨对象是从内存还是数据库找回。一直使用这种方法就可以建立一个资源库,它能很大程度上从视图隐藏数据库,任何到数据库的查询都可以做成资源库基础上的查询对象,并且开发者不用分辨对象是从内存还是从数据库中找回。从这些信息可以英译读写代码,自动生产特别的连接操作,完成所有SQL,加强关系的多样性,甚至可以做许多奇特的事情,比如在引用完整性存在的情况下计算写顺序等。

2023-12-08 21:42:38 432

原创 PoEAA笔记-映射到关系数据库-3.5 建立映射

相反,应该为每一次迭代建造数据库,时间上不要超过6个月并且适当的更短一些,这样就能更快和更持续的得到关于数据库交互实际上如何工作的反馈,针对特定任务,都应该首先考虑领域模型,但是这样做的时候,需要在数据库中集成领域模型的每一部分。(在这种情况下,头痛的数量域区别的数量成反比)另一种可能是使用不同的存储机制,有时是数据库,有时是消息,也可能希望把类似的数据同时从XML消息,CICS事务和关系表中抽取出来。元数据映射基于把映射浓缩到源数据文件的方法,元数据文件详细描述数据库中的列如何映射到对象的域。

2023-12-08 21:31:04 1213

原创 PoEAA笔记-映射到关系数据库-3.4.2 继承

类表继承是类和表之间最简单的关系,但是它需要多个连接(join)操作来载入一个对象,这样通常损失了性能。具体表继承避免了连接操作,允许从一个表中取得一个对象,但是改变起来比较困难,对超类的任何改变都不得不改变所有的表(还有映射代码)。在某些数据库中,单表继承最大的弊端是浪费了空间,因为每一行都必须为每种可能的子类保留一些列,这就导致很多空列。单表继承的另一个问题在于它的大小将成为访问的瓶颈。对于任何继承结构,一般都有三种选择,可以为一个类层次中的所有类建立一个表,即单表继承(见图3-8)。

2023-12-07 18:23:57 555

原创 PoEAA笔记-3.映射到关系数据库-3.4.1 关系的映射

解决这种表现问题的方法是:通过对象中的一个标识域来保持咩哥对象的关系特性,并且通过查找这些值来保持对象引用和关系键之间的相互映射,从硬盘中读取数据的时候,使用标识映射作为从关系键到对象的查找表,每次使用表中的外键,都用外键映射来得到合适的对象间引用,如果标识映射中没有该键值,就需要到数据库中读取它或使用延迟加载。在这个基础上,集合的处理需要更复杂的外键映射版本,如果对象包含一个集合,则必须构造一个新的查询来找到所有与源对象的ID相关的行(也可以用延迟加载来避免查询),创建每个返回的对象并加入到集合中。

2023-12-06 18:57:17 340

原创 测试类图-

【代码】测试类图-

2023-12-05 21:48:12 331

原创 PoEAA笔记 3-映射到关系数据库-3.3 读取数据

用基于行的类可以使查找变成静态操作,但这样就不能通过服务桩在测试的时候调换数据库,为了避免这个问题,最好创建独立的查找器对象,每一个查找器类都封装了很多SQL语句的方法,当执行查找操作的时候,返回一个适当的基于行的对象集合。使用查找器方法要注意的是:这些查找器方法工作在数据库状态下,而不是对象状态下,如果发出一个对数据库的查询,找到一个俱乐部内的所有人,那么任何你在内存中加入的对象都不在其中,解决的方法是一开始就进行查询。另一个避免多次进入数据库的方式是使用连接(Join),这样就可以一次查询多张表。

2023-12-05 20:01:16 313

原创 PoEAA笔记 3-映射到关系数据库-3.1 架构模式-3.2 行为问题

首先介绍的一组模式时架构模式,它要解决的问题时驱动领域逻辑访问数据库的方式,此时的选择对于设计影响深远,而且难以重构,因此这个问题需要注意。同样,如何设计领域逻辑也会对这个选择产生重大的影响。尽管SQL已经在商业软件中广泛应用,但它在使用中还是存在一些缺陷,许多应用程序开发者并不能充分理解SQL,因此,不能很好的构造有效的查询语句和命令。基于这些原因,把SQL访问从领域逻辑中分离出来,并把它放到独立的类中,实在是明智之举。

2023-12-04 19:59:40 478

原创 PoEAA-2.组织领域逻辑

领域逻辑的组织可以改分为三种主要的模式:事务脚本、领域模型以及表模块。

2023-12-03 18:46:10 344

原创 POEAA笔记-1.分层

当用分层的观点来考虑系统时,可以将各个子系统想象成按照“多层蛋糕”的形式来组织。每一层都依托在其下层之上。在这种组织方式下,上层使用了下层的各种服务,而下层对上层一无所知。另外,每一层对自己的上层隐藏其下层的细节。(当然,并非所有的分层架构都这么隔绝,但绝大多数时不透明的,或至少是几乎不透明的)分层的特点也是重点是下层对上层一无所知,每一层对自己的上层隐藏了其下层的细节。

2023-12-02 17:39:15 352

原创 POEAA笔记-0

每一个模式描述了在我们身边不断出现的问题以及该问题解决方案的核心。模式的关键点是它们源于实践,必须观察人们的工作过程,发现其中好的设计,并找出“这些解决方案的核心”

2023-12-01 18:20:16 945

原创 defy刷CM7手记

CM7,即CyanogenMod,为一个非官方的手机固件版本,可以用于Android系统的手机 开始之前:备份数据 开始之前,不要忘记了备份数据: 我们的手机通讯录可备份到SIM卡或者同步到Google帐户上去; 微信的通讯录也支持云备份的功能        我们还可通过SMS Backup & Restore, Call Backup & Restore ...

2011-10-31 00:32:58 136

原创 Hudson安装手记

安装Hudson很简单:1.从官网http://hudson-ci.org/下载最新版本的war包2.运行java -jar hudson.war,也可将该war包发布到tomcat,jboss等web容器中 启动后通过http://localhost:8080/访问Hudson...

2011-10-21 23:37:19 84

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除