Oracle绑定变量在C#.NET中的应用及意义.docVIP

  • 0
  • 0
  • 约3.82千字
  • 约 3页
  • 2020-02-26 发布于陕西
  • 举报

Oracle绑定变量在C#.NET中的应用及意义.doc

CHISC.NET - 全国医疗信息化联盟 ,为全国医疗信息化人士提供最强大的资源共享平台 Oracle绑定变量在C#.NET中的应用及意义 什么是绑定变量 绑定变量(bind variable) : select * from emp where empno=:empno; 是用户放入查询中的占位符,它会告诉Oracle“我会随后为这个变量提供一个值,现在需要生成一个方案,但我实际执行语句的时候,会提供应该使用的实际值”。 实质就是用于替代sql语句中常量的替代变量。绑定变量能够使得每次提交的sql语句都完全一样。 为什么使用绑定变量 使用绑定变量可以减少硬语法分析,优化共享池的使用。在oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析,一种叫做软解析。 当一个sql语句提交后,oracle会首先检查一下共享缓冲池里有没有与之完全相同的语句,如果有的话只须执行软分析即可,否则就得进行硬分析。 一个硬解析需要经分析、解析、安全检查 、制定执行路径、优化访问计划等等许多的步骤。需消耗大量的cpu及资源。 举个例子,要查询编号为001的儿童,下面两种写法都可以实现: select * from t_child where childid=’001’ select * from t_child where childid =: childid;//使用绑定变量 但是实际应用中经常是查询编号为001的儿童一次以后,有可能再也不用;接着你有可能查询儿童’002’,然后查询’003’ 而第二个查询语句提供了绑定变量: childid,它的值在查询执行时提供,查询经过一次编译后,查询方案存储在共享池中,可以用来检索和重用;在性能和伸缩性方面,这两者的差异是巨大的,甚至是惊人的; 若不使用绑定变量,每个查询的条件不同导致共享池中SQL语句数量太多,重用性极低,加速了SQL语句的老化,导致共享池碎片过多。?共享池中不同的SQL语句数量巨大,根据LRU原则,一些语句逐渐老化,最终被清理出共享池;这样就导致shared_pool_size 里面命中率下降,共享池碎片增多,可用内存空间不足。而为了维护共享池内部结构,需要使用latch,一种内部生命周期很短的lock,这将使用大量的cpu 资源,使得性能急剧下降。 ?不使用绑定变量违背了oracle 的shared pool 的设计的原则,违背了这个设计用来共享的思想。 如何使用绑定变量 public DataSet GetDataTable(T_child entity) { ArrayList parmlist = new ArrayList(); ArrayList valuelist = new ArrayList(); String sql=select * from t_child where childid =: childid; parmlist.Add(childid); valuelist.Add(entity.Childid); DataSet ds = SqlHelper(sql,dbName,valuelist,parmlist,ref errorMsg); return ds; } 调用以下方法: public static DataSet SqlHelper(string query, string dataBaseName, ArrayList bllist, ArrayList pamlist, ref string returnMessage) { AdoHelper adoHelper = null; try{ adoHelper = DatabaseConnectEntity.CreateHelper(dataBaseName); IDataParameter[] parameters = new IDataParameter[bllist.Count]; if (adoHelper._dbFactory.DatabaseType == DatabaseType.DB_Oracle) { ArrayList paramlist = new ArrayList(); for (int i = 0; i bllist.Count; i++) { OracleParameter parm;

文档评论(0)

1亿VIP精品文档

相关文档