笔记

1. 开发数据库应用,不能把数据库当黑盒。需要了解数据库的一下内容

  • 数据库的体系结构
  • 并发控制
  • 开发的时候就要调优你的代码
  • 数据库有哪些特性,不要在你的代码里重复实现
  • 深入的学习SQL

 

2. 我的方法

以数据库为中心的方法.如果能在数据库中实现,就不去自己实现. 原因是Oracle在各种平台上都可用,自己实现的话,移植性可能会不好.

 

一些最佳实践

  • 尽量使用一条SQL完成工作
  • 如果一条SQL没法完成工作,那么就是用PL/SQL
  • 尽量保持代码简单,要知道代码越多越容易出错
  • 如果PL/SQL不能完成工作,就试试JAVA存储过程
  • 如果Java不行,那么就试试C例程
  • 再不行,就要考虑这个工作的可行性了。

 

 

3. 一个bitmap index引起阻塞的问题

自治事务

自治事务就是在一个已有的会话中开始一个独立的子事务,父事务被阻塞。通常用在测试中。

举一个位图索引导致的阻塞问题

先看位图索引的结构

比如拿 gender作例子,values=M or F, 建立bitmap index

假设表里有5条记录,那么位图中的bit数就是5

John, M,25, L1

Diana, F, 20, L2

Mary, F, 21, L1

Peter, M, 26, L4

Kathy, F, 33,L3

 

那么M的位图就是10010, F的位图就是01101. 如果bitmap index在列上, 那么L1=10100, L2=01000

 

那么如果在下面会话中打开一个自治事务,就会发生死锁。

ops$tkyte%ORA11GR2>>> create table t

2 ( processed_flag varchar2(1)

3 );

Table created.

ops$tkyte%ORA11GR2> create bitmap index

2 t_idx on t(processed_flag);

Index created.

ops$tkyte%ORA11GR2> insert into t values ( 'N' );

1 row created.

ops$tkyte%ORA11GR2> declare

2 pragma autonomous_transaction;

3 begin

4 insert into t values ( 'N' );

5 commit;

6 end;

7 /

declare

*

ERROR at line 1:

ORA-00060: deadlock detected while waiting for resource

ORA-06512: at line 4

如果打开一个新的会话,同样插入值=N的行,那么这个会话会被阻塞,因为会话1已经锁定了Value=N的位图索引。

解决办法就是删除这个bitmap index.

 

4. 开发数据库应用的正确方法

  • 了解数据库的体系结构, shared server or dedicate server
  • 使用绑定变量, JDBC PreparedStatement
  • hard code 参数会导致SQL 解析,重新编译查询计划
  • 理解并发控制,SELECT for update, upd_date列,防止丢失更新
  • 多版本控制,undo, 读一致性
  • 非阻塞读
  • 。。。