第1章 性能问题与以前不同了 1
1.1 现在的情况如何 3
1.1.1 网络 4
1.1.2 数据库驱动程序 4
1.1.3 环境 5
1.1.4 数据库应用程序 6
1.2 本书的目标 7
第2章 提高性能的设计策略 9
2.1 应用程序 10
2.1.1 数据库连接 10
2.1.2 事务管理 19
2.1.3 SQL语句 24
2.1.4 数据检索 26
2.1.5 扩展的安全性 31
2.2 静态SQL与动态SQL 36
2.3 网络 37
2.4 数据库驱动程序 38
2.5 理解数据库系统 39
2.6 使用对象/关系映射工具 40
2.7 小结 41
第3章 为什么数据库中间件很重要 43
3.1 数据库中间件是什么 44
3.2 数据库中间件影响应用程序性能的原理 44
3.3 数据库驱动程序 45
3.3.1 数据库驱动程序的功能 45
3.3.2 数据库驱动程序的架构 47
3.3.3 运行时性能调校选项 52
3.3.4 配置数据库驱动程序/数据提供程序 53
3.4 小结 62
第4章 为提高性能而调校环境 63
4.1 运行时环境(Java与.NET) 64
4.1.1 JVM 65
4.1.2 .NET CLR 69
4.2 操作系统 69
4.3 网络 72
4.3.1 数据库协议包 72
4.3.2 网络包 75
4.3.3 配置包的容量 77
4.3.4 分析网络路径 78
4.3.5 减少网络转发和争用 80
4.3.6 避免网络包分片 82
4.3.7 增加网络带宽 88
4.4 硬件 88
4.4.1 内存 89
4.4.2 磁盘 91
4.4.3 CPU(处理器) 93
4.4.4 网络适配器 96
4.4.5 虚拟化 98
4.5 小结 99
第5章 ODBC应用程序:编写良好的代码 101
5.1 管理连接 102
5.1.1 高效地建立连接 102
5.1.2 使用连接池 102
5.1.3 一次建立一个连接 103
5.1.4 为多条语句使用一个连接 103
5.1.5 高效地获取数据库信息和驱动程序信息 103
5.2 管理事务 104
5.2.1 管理事务提交 104
5.2.2 选择正确的事务模型 111
5.3 执行SQL语句 111
5.3.1 使用存储过程 111
5.3.2 使用语句与预先编译的语句 113
5.3.3 使用参数数组 113
5.3.4 使用游标库 115
5.4 检索数据 115
5.4.1 检索长数据 116
5.4.2 限制检索的数据量 117
5.4.3 使用绑定列 118
5.4.4 使用SQLExtendedFetch而不是SQLFetch 119
5.4.5 确定结果集中记录的数量 120
5.4.6 选择正确的数据类型 121
5.5 更新数据 121
5.6 使用目录函数 122
5.6.1 尽可能不使用目录函数 122
5.6.2 避免查找模式 123
5.6.3 使用假查询确定表的特征 123
5.7 小结 125
第6章 JDBC应用程序:编写良好的代码 127
6.1 管理连接 128
6.1.1 高效地建立连接 128
6.1.2 使用连接池 128
6.1.3 一次建立一个连接 129
6.1.4 为多条语句使用一个连接 129
6.1.5 高效地断开连接 129
6.1.6 高效地获取数据库信息和驱动程序信息 131
6.2 管理事务 131
6.2.1 管理事务提交 131
6.2.2 选择正确的事务模型 136
6.3 执行SQL语句 137
6.3.1 使用存储过程 137
6.3.2 使用语句与预先编译的语句 139
6.3.3 使用批处理与预先编译的语句 140
6.3.4 使用getXXX方法从结果集获取数据 141
6.3.5 检索自动生成的键 142
6.4 检索数据 143
6.4.1 检索长数据 143
6.4.2 限制检索的数据量 144
6.4.3 确定结果集中记录的数量 145
6.4.4 选择正确的数据类型 146
6.4.5 选择正确的游标 146
6.5 更新数据 149
6.5.1 使用定位更新、插入和删除(updateXXX方法) 149
6.5.2 使用getBestRowIdentifier()方法优化更新和删除 150
6.6 使用数据库元数据方法 151
6.6.1 尽可能不使用数据库元数据方法 151
6.6.2 避免查找模式 151
6.6.3 使用假查询确定表的特征 152
6.7 小结 154
第7章 .NET应用程序:编写良好的代码 155
7.1 管理连接 156
7.1.1 高效地建立连接 156
7.1.2 使用连接池 156
7.1.3 一次建立一个连接 157
7.1.4 高效地断开连接 157
7.1.5 高效地获取数据库信息和数据提供程序信息 159
7.2 管理事务 159
7.2.1 管理事务提交 159
7.2.2 选择正确的事务模型 164
7.3 执行SQL语句 165
7.3.1 执行检索小数据或不检索数据的SQL语句 165
7.3.2 使用Command.Prepare方法 167
7.3.3 使用参数数组/批处理与预先编译的语句 168
7.3.4 使用批量加载 169
7.3.5 使用纯托管提供程序 170
7.4 选择.NET对象与方法 171
7.4.1 避免使用CommandBuilder对象 171
7.4.2 在DataReader和DataSet对象之间做出选择 172
7.4.3 使用GetXXX方法从DataReader对象获取数据 172
7.5 检索数据 173
7.5.1 检索长数据 173
7.5.2 限制检索的数据量 174
7.5.3 选择正确的数据类型 175
7.6 更新数据 176
7.7 小结 177
第8章 连接池和语句池 179
8.1 JDBC连接池模型 179
8.1.1 配置连接池 180
8.1.2 指导原则 181
8.2 ODBC连接池模型 182
8.2.1 根据ODBC规范定义的连接池 182
8.2.2 配置连接池 183
8.2.3 指导原则 184
8.3 ADO.NET连接池模型 184
8.3.1 配置连接池 184
8.3.2 指导原则 185
8.4 为连接池使用重新认证 186
8.5 使用语句池 189
8.5.1 联合使用语句池和连接池 189
8.5.2 指导原则 191
8.6 小结:整体考虑 191
第9章 开发良好的基准 193
9.1 开发基准 194
9.1.1 定义基准目标 194
9.1.2 再现产品环境 195
9.1.3 隔离测试环境 199
9.1.4 再现工作负荷 199
9.1.5 测量正确的任务 200
9.1.6 在足够长的时间中进行测量 201
9.1.7 准备数据库 203
9.1.8 一次进行一个修改 204
9.1.9 访问其他因素 204
9.2 基准实例 205
9.3 小结 209
第10章 性能问题调试 211
10.1 从何处开始 212
10.2 数据库应用程序部署中的改变 214
10.3 数据库应用程序 214
10.4 数据库驱动程序 216
10.4.1 运行时性能调校选项 216
10.4.2 驱动程序架构 216
10.5 环境 217
10.5.1 运行时环境(Java和.NET) 218
10.5.2 操作系统 218
10.5.3 网络 218
10.5.4 硬件 219
10.6 案例研究 221
10.6.1 案例研究1 221
10.6.2 案例研究2 224
10.6.3 案例研究3 226
10.6.4 案例研究4 227
10.6.5 案例研究5 229
10.6.6 案例研究6 232
10.6.7 案例研究7 234
10.6.8 案例研究8 235
10.7 小结 237
第11章 面向服务架构(SOA)环境中的数据访问 239
11.1 面向服务的架构(SOA)是什么 240
11.2 SOA环境中数据访问的指导原则 241
11.2.1 除了SOA专家之外还需要数据专家 241
11.2.2 使数据访问和业务逻辑相分离 242
11.2.3 针对性能进行设计和调校 244
11.2.4 考虑数据集成 244
11.3 小结 246
附录 术语表 247