• 01


    笔记

    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, 读一致性
    • 非阻塞读
    • 。。。
  • 相关阅读:
    Cookie
    laydate
    layer
    字符流
    java虚拟机学习(四)--垃圾收集算法
    java虚拟机学习(三)
    java虚拟机学习(二)
    java虚拟机学习(一)
    Mybatis学习(一)
    mysql数据库面试总结(一)
  • 原文地址:https://www.cnblogs.com/xzpp/p/3603154.html
Copyright © 2020-2023  润新知