1. 开发方法应以数据库为中心,如果能在数据库中完成,就应该让数据库来做。
2. 开发数据库软件,应该遵循的原则:
1) 如果可能,尽量用一条SQL语句完成工作。
2) 如果无法用一条SQL语句完成,就通过PL/SQL实现
3) 如果在PL/SQL中也无法做到,可以试试使用Java存储过程来实现。(如今需要这样做的可能性极小)
4) 如果Java还办不到,那就在C外部过程中实现。如果速度要求很高,或者要使用采用C编写的一个第三方API,就通常使用这种方法。
5) 如果C外部例程还无法实现,就该好好想想有没有必要做这个工作了。
3. 数据库项目失败的最常见的一个原因是对数据库的实际认识不足,缺乏对所用基本工具的了解。
例如:采用位图索引,一个键指向多行,可能数以百计甚至更多。如果更新一个位图索引键,那么这个键指向的数百条记录会与你实际更新的那一行一同被有效地锁定。
以下例子使用两个会话来展示阻塞:
第一个会话执行如下命令:
create table t (p varchar2(1));
create bitmap index t_idx on t(p);
insert into t values('n');
现在如果在另一个SQL*Plus会话中执行以下命令:
insert into t values('n');
该语句将会被挂起,直到在第一个会话中发出COMMIT为之。
注:位图索引只使用于低基数值,但是对频繁更新的列不适用。
4. 尽量使用绑定变量
1) oracle将已解析、编译的SQL连同其他内容存储在共享池中,如果使用绑定变量,无论是谁,只要提交引用同一对象的同一个查询,都会使用共享池中已编译的查询计划(软解析),软解析耗费的资源相当少,而且占用闩的时间也更短(相比于硬解析),也不再那么频繁的需要闩。
2) 库缓存使用闩定机制,硬解析一个查询时,数据库会更长时间地占用一种低级化串行设备--闩。闩能保护oracle共享内存中的数据结构不会同时被两个进程修改(否则,oracle最后会得到遭到破坏的数据结构),而且如果有人正在修改数据结构,则不允许另外的人再来读取。对这些数据结构加闩的时间越长、越频繁,排队等待闩的进程就越多,等待队列也越长。
5. 并发控制
1) oracle锁定策略
1. 只在修改时才对数据加行级锁。正常情况下不会升级到块级锁或表级锁(不过两段提交期间的一段很短时间内除外)。
2. 如果只是读数据,oracle绝对不会对数据锁定。
3. 读不会被写阻塞。
4. 写入器想写某行数据,但另一个写入器已经锁定了这行数据,此时写入器会被阻塞。但是读取器绝对不会阻塞写入器。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17014649/viewspace-604184/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17014649/viewspace-604184/