`
zzhonghe
  • 浏览: 248200 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

开发Oracle数据库应用的正确和不正确的方法

    博客分类:
  • DB
 
阅读更多
看书的目的在于深入理解Oracle到底能做什么,尽量多的学习Oracle的功能,避免重复发明轮子。提高工作效率的一个原则就是做正确的事情,如果花费几个月的心血才研究实现出来的东西,却能够通过简单的配置Oracle就能实现,那么未免效率太过低下了。



1. 基于数据库应用开发的基本原则在于, 如果功能能够在数据库中实现,那么就优先在数据库中实现。尽量用一条SQL语句来完成工作,如果实在是不能用一条SQL实现,那么考虑用PLSQL来实现。 SQL所引起的性能问题,能够非常方便地诊断并且修改过来,而如果是把数据库当成黑盒而引发的性能问题,则非常难以修正。


2. 位图索引应该只用在只读的数据表中,并且是low cardinality的列,如果同时存在并发地写,那么位图索引将不可避免地同时锁定很多行记录,接近于表锁。


3. 如果有些表的数据会经常性地按照日期添加和删除,像队列一样,那么最好是使用Oracle的Advanced Queue,这是优化好的队列表,对于此种应用,比普通表要性能好。


4. 如果不使用绑定变量,会耗费资源进行硬解析。但这个仍然不是主要问题所在,硬解析会大量使用一种轻量级的锁latch,而latch是访问并发内存共享数据的控制设备, 所以在不使用绑定变量的情况下,latch被占用,导致很多其他程序等待latch,从而使整个系统变慢,让系统本应该拥有的性能下降一个数量级。


绑定变量还有一个作用就是预防SQL注入攻击,通过在可输入的字符串,日期等,加入SQL语句,用以查看表,查看用户信息表,最后获得密码。 只要有1个这样的可输入SQL的非绑定变量,那么所有的信息安全都将白费。

cursor_sharing=force 通过配置这个变量,可以默认实现所有的变量自动绑定。 所有的where条件中的value都采用绑定变量的方式重写。 副作用在于可能把一些能够影响到优化器的value,也用作了绑定变量,让优化器做出错误的决定。 比如1000行的表,value<900, 返回900行数据,那么这个时候采用全表扫描会更好,但是优化器绑定变量后,可能会采用索引查询,效率变得比较差。


5. Oracle的锁为行锁,甚至可以说是列锁, 只锁定一行的几列。select for update on column1。 实现的方式为,在数据块上标记被锁定的行列。当有并发访问该数据块的时候,就能够侦测到该数据是否被锁定。


6. Oracle的读操作,不会被写操作阻塞。当需要读取一起数据的时候,如果发现某个数据的版本(时间戳),和开始读的时候的时间戳不一致,那么这个读操作将会从undo的日志中找到该数据原来的版本,然后返回。其并不会等待写操作完成。

Oracle的并发模型为 读一致read-consist,多版本multi-version。

举例:

一个session打开基于某个表的游标
另一个session删除该表的数据
此时第一个session仍然能够返回该表的数据

非阻塞读的副作用在于,需要手工控制丢失更新的情况。多并发同时修改同一行,最先提交的线程修改可能会被之后的线程覆盖。这里需要进行手工控制。采用悲观锁select for update,或者采用乐观锁比较hash值来避免。


7. 关于11g的闪回的特性,能够快速地将数据库恢复到某一点。理论依据是,flashback采用磁盘进行备份数据和日志,而不是磁带。这样就能够很好的访问备份的内容。DBA能够利用这些备份内容手工恢复数据库,而Oracle则能够利用这些备份,更加便捷地自动恢复数据。 之前没有这个功能是因为大量的备份内容存储在廉价的磁带上,因磁带是顺序读写而无法实现。现在磁盘非常廉价,所以才能够实现这个功能。


8. Oracle的B-tree索引不会为null值添加索引,column=null是不对的,应该采用coloum is null


9. Oracle中不推荐在存储过程中DDL创建临时表,使用完成后就Drop。 而是预先创建好Global Temperary Table,每个session在里面存的数据只有这个session才能访问,session完成后,表中数据也随之消失。


10. Oracle的默认隔离级别是Read Comitted, 支持非重复读和幻读的特性。 在一个事务中能够读到事务开始后,已经被其他事务更新提交的行的数据, 以及能够读到表中其他事务新插入的行。

Serializable于Read Commited的区别在于,遇到多个事务对同一数据进行写操作,前者会抛出异常, 而后者会进行等待。仅此而已, 而不是一直以来所认为的是所有操作串行完成。


11. 内联视图和标量子查询 是oracle非常有用的特性, 前者是在结果集进行查询, 后者是每个column运行一个查询。  特别是标量子查询,可读性非常好,同时可以减少join的层次.


12. 通过配置文件,可以确保访问数据库的用户在DB中只有一个session,而不是采用一些"有创意的代码"来实现。


13. 追求数据库的独立性可能不是一个正确的决定,特别是对应于复杂的应用系统。Hibernate,EJB等用作表现层的应用尚可,如果需要进行复杂的业务运算,那么效率和性能则不敢恭维。


14. Exadata, 基于Oracle的存储区网络设备。通过移动数据文件,可以让响应时间成数量级的缩短。
分享到:
评论

相关推荐

    oracle数据库应用与开发.docx

    ### Oracle数据库应用与开发 #### 专题一:Oracle入门 **教学目标** - **1.1** 了解Oracle 10g的安装与卸载流程。 - **1.2** 掌握如何通过Net Configuration Assistant配置客户端服务名。 - **1.3** 学会使用...

    用OO4O和VC 开发ORACLE数据库应用程序的方法研究.pdf

    使用0040和VC++开发Oracle数据库应用程序的过程通常包括以下步骤: 1. 创建数据库连接:使用Oracle C++类库中的类建立与Oracle服务器的连接。 2. 执行SQL语句:通过类库的方法执行查询、插入、更新或删除操作。 3. ...

    用VC++开发Oracle数据库应用程序详解

    【VC++开发Oracle数据库应用程序详解】 在开发Oracle数据库应用程序时,Visual C++(简称VC)是一种常见的客户端开发工具,尤其适合构建与Oracle数据库交互的应用。本文主要探讨两种使用VC++开发Oracle应用程序的...

    sap 与 oracle数据库的连接

    在本文中,我们将详细介绍SAP开发中模块连接Oracle数据库的具体方法步骤。 首先,需要建立目录,使用mkdir命令创建/oracle/client/11x_64目录,并将其所有权更改为eq1adm用户,使用chown命令实现。然后,进入/...

    不必安装oracle客户端,QT成功连接oracle数据库

    总结来说,"不必安装oracle客户端,QT成功连接oracle数据库"这一技术方案,通过QT的QSqlDatabase类和Oracle的ODBC驱动,为开发者提供了一种轻量级的连接Oracle数据库的方法,减少了开发环境的维护成本,提高了工作...

    Eclipse是如何连接Oracle数据库的

    在IT领域,特别是软件开发与数据库管理中,...以上步骤涵盖了在Eclipse中使用Java编程语言连接Oracle数据库的全过程,从配置JDBC驱动到执行SQL语句,再到资源的妥善处理,每一步都是构建稳定、高效数据库应用的关键。

    oracle数据库系统性能和应用性能优化

    Oracle数据库系统性能和应用性能优化是数据库管理员和开发人员关注的重要领域,它涉及到多个层面的调整和优化,以确保系统的高效运行。Oracle数据库是全球广泛使用的数据库管理系统,其性能直接影响到业务应用程序的...

    用VC开发基于ORACLE数据库应用程序.pdf

    总之,通过VC++开发Oracle数据库应用程序,开发者可以根据项目需求灵活选择PRO * C或ODBC作为访问数据库的方式,实现高效、稳定的数据库应用。无论是利用PRO * C的预编译特性实现更紧密的数据库集成,还是利用ODBC的...

    oracle数据库基础知识

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,它在企业级数据存储和管理中扮演着核心角色。Oracle数据库基础知识是每个IT从业者或自学者必备的知识领域。以下将深入讲解Oracle数据库的一些关键概念和操作...

    java连接oracle数据库jar包

    Java连接Oracle数据库主要依赖于JDBC(Java Database Connectivity)...正确引入Oracle JDBC驱动JAR包,并理解其使用方法,是开发Java数据库应用的基础。在实际开发中,还需要注意错误处理、性能优化和安全性等问题。

    运用嵌入式SQL语言实现ORACLE数据库应用的方法探索.pdf

    这是开发ORACLE数据库应用前必须要完成的配置工作。 在嵌入式SQL语言宿主程序的分析中,提到的基本命名规则是,根据宿主语言的不同,需要遵循相应的文件扩展名,如C/C++语言的扩展名为.pc,而Pascal语言的扩展名为....

    oracle数据库开发面试必备

    ### Oracle数据库开发面试必备知识点详解 #### 一、Oracle SQL查询优化 ...以上内容涵盖了Oracle数据库开发过程中的一些常见知识点,希望能帮助你在面试中更加自信,并在实际工作中应用这些知识来优化数据库性能。

    图片批量导入oracle数据库

    Java是一种多平台的编程语言,广泛用于开发数据库应用程序,包括文件上传功能。在描述中提到,无论使用MySQL还是Oracle,只需更换相应的数据库驱动即可,这是因为Java提供了JDBC(Java Database Connectivity)API,...

    Oracle数据库访问类

    Oracle数据库访问类是.NET开发中用于与Oracle数据库交互的重要组件,它允许开发者通过代码执行SQL语句、管理数据以及执行各种数据库操作。在.NET平台上,我们可以利用多种方式来实现Oracle数据库的访问,如使用ADO...

    powerbuilder11.5连接Oracle数据库的通用方法。

    ### PowerBuilder 11.5 连接 Oracle 数据库与 SQL Server 2000 的通用方法 在软件开发过程中,数据库的连接是至关重要的一步。PowerBuilder 是一款功能强大的快速应用开发工具,广泛应用于企业级应用开发。本文将...

    Oracle数据库查询优化的方法

    在处理信息系统中的数据库应用开发工作时,软件性能通常受限于大量的数据查询、统计和分析操作。为保障系统的响应速度,如何优化这些海量数据的处理成为了系统设计中需要解决的关键问题。Oracle数据库作为企业级信息...

    .net不需要客户端无客户端 连接Oracle数据库附代码

    标题中的".net不需要客户端无客户端 连接Oracle数据库附代码"指的是在.NET环境中,使用特定的方法或库可以实现与Oracle数据库的连接,而无需在客户端安装Oracle的客户端软件。这通常意味着开发人员可以依赖于Oracle...

    NetBeans可视化Web开发之数据库应用开发

    8. **调试与测试**:掌握在NetBeans中进行单元测试和集成测试的技巧,确保数据库应用的正确性和稳定性。 9. **性能优化**:讨论如何优化数据库查询,减少不必要的数据库访问,提高Web应用的性能。 通过学习上述...

    Oracle数据库JDBC中间驱动间

    一旦驱动被加载,开发人员可以通过调用`Class.forName("oracle.jdbc.driver.OracleDriver")`来注册驱动,然后使用`DriverManager.getConnection()`方法建立到Oracle数据库的连接。 Oracle JDBC驱动提供了多种功能,...

    用ASPNet连接Oracle数据库的方法

    在ASP.NET中连接和操作Oracle数据库,不仅需要掌握基本的连接和查询技术,还要熟悉如何在复杂的Web应用程序中优雅地处理用户交互。通过理解上述概念和技术,开发者可以更高效地构建与Oracle数据库紧密集成的Web应用...

Global site tag (gtag.js) - Google Analytics