目录 2
前言 2
致谢 2
关于本书 2
第一部分 基础知识 2
第1章 取舍之苦 2
1.1 论战风暴 2
1.2 EJB反模式的历史 3
1.2.1 1998年3月:EJB 1.0 4
1.2.2 1999年11月:EJB 1.1 4
1.2.3 2001年8月:EJB 2.0 5
1.3 案例研究:PetStore基准测评 6
1.4 反模式:金榔头 8
1.4.1 不明智的选择 8
1.4.2 解决方案:仔细评估 10
1.5 小结:前瞻 12
1.6 本章中的反模式 13
第2章 代价之苦 14
2.1 层出不穷的争论 14
2.1.1 EJB的价值 15
2.1.2 适用EJB的应用 15
2.1.3 使用试金石 16
2.1.4 通过测试 17
2.1.5 衡量复杂性 17
2.1.6 估计你的能力 18
2.2 反模式:大锤打苍蝇 19
2.2.1 增加复杂性 21
2.2.2 解决方案:简化 22
2.2.3 考虑管理多个文件的代价 24
2.2.4 更细的分析 26
2.3 实体bean应另当别论 28
2.4.1 本地接口 30
2.4 实体bean:两大进步 30
2.4.2 容器托管关系 31
2.5 实体bean的深入探讨 31
2.6 小结 34
2.7 本章中的反模式 34
第3章 接口之苦 36
3.1 构建一个好接口 36
3.1.1 远程调用性能的下降 37
3.1.2 传引用与传值 37
3.2 设计应用层 39
3.2.1 再看实体bean 40
3.2.2 质疑EJB本地接口 40
3.3 反模式:本地和远程接口并存 41
3.3.1 混合的接口会扰乱异常管理 42
3.3.4 小反模式:透明分布 43
3.3.3 小反模式:到处分布 43
3.3.2 混合的接口会影响性能 43
3.3.5 解决方案:取得平衡 44
3.3.6 了解如何分布 45
3.4 反模式:闯入厨房的顾客 45
3.4.1 把用餐者推至门外 46
3.4.2 解决方案:由服务员疏导顾客 48
3.4.3 使用数据传输对象 49
3.5 反模式:定制DTO 50
3.6 小结 53
3.7 本章中的反模式 54
第二部分 会话和消息 58
第4章 会话之苦 58
4.1 线程和同步 59
4.1.1 反模式:纠缠不清的线程 59
4.1.2 解决方案:标准化 60
4.1.3 处理挂起的线程 61
4.1.4 探寻解决方案 62
4.2 处理异常 64
4.2.1 小反模式:异常实现中存在逻辑 64
4.2.2 解决方案:将逻辑重构移出异常 65
4.2.3 反模式:吞掉异常 65
4.2.4 解决方案:一种简单的异常处理策略 66
4.2.5 反模式:过分受宠的系统异常 67
4.2.6 解决方案:抛出正确的异常类型 68
4.3 重复大数据集 69
4.3.1 反模式:过分耗用数据库连接 71
4.3.2 解决方案:精确地管理连接 71
4.3.3 反模式:过于热心的迭代器 72
4.3.4 解决方案:测试,测试,再测试 74
4.3.5 缓存结果 74
4.3.6 导出结果 75
4.3.8 迭代处理重排数据 76
4.3.7 确定结果的大小 76
4.4 高效地互操作 77
4.4.1 使用IIOP 78
4.4.2 反模式:过窄的servlet桥 78
4.4.3 解决方案:通用servlet桥 79
4.5 小结 85
4.6 本章中的反模式 85
第5章 会话状态之苦 89
5.1 谈谈会话状态 90
5.2 核心反模式:会话包袱 91
5.2.1 状态之累 91
5.2.2 减负 92
5.2.3 解决方案1:转向无状态 93
5.2.4 解决方案2:在适当的时候充分利用会话状态 93
5.3 用有状态会话bean管理会话 94
5.3.1 使用有状态会话bean购物 95
5.3.2 掀起盖头来 96
5.4 用servlet管理会话 98
5.4.1 利用HttpSession力求简单 98
5.4.2 使用servlet购物 99
5.4.3 扩展servlet会话 100
5.5 反模式:会话状态金榔头 101
5.5.1 在客户上存储会话 102
5.5.2 使用servlet在服务器上存储会话 102
5.5.3 使用有状态EJB在服务器上存储会话 103
5.5.4 在数据库中存储会话 104
5.5.5 再谈购物车 105
5.5.6 总体解决方案:选择适当的工具 106
5.6 小反模式:将有状态会话bean用作共享数据缓存 107
5.7 反模式:会话大杂烩 107
5.8 小反模式:会话抖动 109
5.10 小结:驯兽 110
5.9 小反模式:腐烂的会话垃圾 110
5.11 本章中的反模式 111
第6章 消息之苦 114
6.1 JMS简介 114
6.2 一个早期反模式:胖消息 115
6.2.1 没有万能钥匙 117
6.2.2 解决方案1:让消息节食 117
6.2.3 解决方案2:使用引用 118
6.3 小反模式:瘦消息 119
6.4 一个订单处理系统雏形 119
6.4.1 定义系统 120
6.4.2 设计消息 120
6.4.3 选择消息模型 121
6.4.4 应对修改 122
6.4.5 构建OrderRequest生产者 123
6.5 反模式:XML作为银弹 124
6.6 反模式:消息拥堵 126
6.6.1 持久性的代价 126
6.6.2 持久订购的代价 127
6.6.3 解决方案:只保存重要的消息 127
6.7 小反模式:请求立即应答 128
6.8 使用消息驱动bean 129
6.8.1 建立MDB池 130
6.8.2 构建OrderRequest消费者 130
6.9 反模式:自成一体的消费者 132
6.9.1 听听测试的意见 133
6.9.2 解决方案:委托给模块化组件 133
6.10 反模式:烫手的山芋 135
6.11 反模式:慢吞吞的食客 137
6.12.1 解决方案:使用消息选择器 138
6.12 反模式:监听 138
6.12.2 声明消息选择器 139
6.12.3 扩展消息选择器 140
6.13 反模式:事后才考虑性能 140
6.14 小结:获得消息 142
6.15 本章中的反模式 142
第三部分 EJB持久存储 150
第7章 实体之苦 150
7.1 理解实体bean反模式 150
7.2 反模式:裸露的表面 151
7.2.1 网络往返通信会堵塞应用 151
7.2.2 失去事务完整性 152
7.2.3 解决方案:会话外观 154
7.2.4 使用外观保证事务完整性 156
7.2.5 使用本地接口 156
7.3 反模式:一口吞下个大面包 156
7.3.1 在BMP和CMP间做出选择 157
7.3.2 解决方案:尽可能选择CMP 158
7.4 反模式:应用连接 160
7.4.1 解决方案:把连接委托给数据库 160
7.4.2 应用连接的常见例子 160
7.5 反模式:应用过滤器 161
7.6 反模式:笨重的键 163
7.7 反模式:旋转门 165
7.7.1 解决方案1:重构以避免再入 166
7.7.2 解决方案2:禁用容器的再入检查 167
7.7.3 解决方案3:游说EJB规范开发小组 167
7.8 小结 167
7.9 本章中的反模式 168
第8章 选择之苦 171
8.1 理解实体bean的替代选择 171
8.2 使用EJB持久存储 173
8.2.1 实现CMP 174
8.2.2 增加DTO和外观 177
8.2.3 包括部署细节 180
8.2.4 用BMP实体bean试试看 182
8.3 用JDBC简化 183
8.3.1 实现一个简单的JDBC模型 184
8.3.2 实现JDBC外观 185
8.3.3 为JDBC部署一个会话外观 187
8.4 使用对象持久存储框架 189
8.4.1 衡量对象持久存储环境 189
8.4.2 理解JDO 190
8.4.3 用JDO实现一个简单的模型 191
8.4.4 实现JDO模型的外观 192
8.4.5 完成方案的部署 193
8.4.6 比较各种选择 195
8.5 反模式:持久存储问题 195
8.5.2 继承和多态 196
8.5.1 通用实体bean缺点 196
8.5.3 查询语言灵活性通常很重要 198
8.5.4 对于本地实体DTO需要非EJB方案 199
8.5.5 容器范围内的持久存储 200
8.6 解决方案:不要“继承”持久存储体系结构,而应适当选择 200
8.7 小结 201
8.8 本章中的反模式 201
第四部分 更宽泛的话题 204
第9章 调优之苦 204
9.1 对成功的度量 205
9.1.1 响应时间 205
9.1.2 吞吐量 206
9.2 反模式:过早的优化 207
9.2.1 盲目对EJB应用调优 207
9.2.2 解决方案1:计划,但(先)别采取行动 208
9.2.3 解决方案2:编写良构的模块化代码 209
9.3 反模式:事后才考虑性能 210
9.4 调优点滴 212
9.4.1 让EJB接受测试 212
9.4.2 通过测试 213
9.4.3 指定响应时间作为成功的度量 214
9.4.4 看到调优隧道尽头的一丝光亮 214
9.5 反模式:抖动调优 215
9.6 小反模式:手工性能测试 217
9.7 利用JUnitPerf完成自动化性能测试 218
9.7.1 JUnitPerf概览 218
9.7.2 测试响应时间 219
9.7.3 调整代码 220
9.7.4 指定可扩展性作为成功的一个度量 220
9.7.5 测试负载条件下的响应时间 221
9.7.6 使用连接池来提高吞吐量 222
9.8 性能建模 224
9.7.7 测试吞吐量 224
9.9 小反模式:怯场 226
9.10 小结:自信地调优 226
9.11 本章中的反模式 227
第10章 构建之苦 231
10.1 用带子绑个大包 232
10.1.1 理解一个示例EJB 232
10.1.2 组织目录结构 234
10.1.3 填写EJBJAR 235
10.1.4 加载类 235
10.2 反模式:系统加载的应用类 236
10.3 反模式:EJB代码重复 237
10.3.1 解决方案:自动生成EJB类 237
10.3.2 解决方案:自动生成清单 239
10.3.3 解决方案:自动生成EAR描述文件 240
10.4 反模式:构建权威 241
10.5 反模式:带着剪刀跑 242
10.6 反模式:集成地狱 244
10.7 小结 245
10.8 本章中的反模式 245
第11章 苦乐参半的未来 248
11.1 历史定位 248
11.2 下一步规划 250
11.2.1 预计未来 250
11.2.2 修整持久存储 251
11.2.3 修整部署策略 252
11.2.4 考虑经济因素 252
11.3 反模式和下一步的动作 253
附录 255
附录A Bitter传说 255
附录B Bitter基础 268
参考文献 286