2009-08-05 52 views

回答

17

我们采用基于我们的生产经验的一些做法:从连接池中提取它们

  • 验证连接。
  • 写您的服务代码,不要假定连接是有效的 - 如果不这样做可能会导致相当多的悲伤,特别是在生产环境中
  • 尽可能明确地接近和使用后丢弃的连接(using(conn){}块不错的选择)
  • 在服务,你应该使用最短的时间内联系 - 特别是如果你正在寻找创建一个可扩展的解决方案。
  • 考虑对请求的典型持续时间使用适当的请求时使用显式时序。你想要的最后一件事是有一种类型的请求挂起,可能会阻止你的整个系统。
  • 尽可能使用绑定变量,以避免硬解析在数据库(这可能是一个噩梦般的表现,如果你不同意这个做法开始了)。使用绑定变量还可以保护您免受基本的SQL注入攻击。
  • 请确保您有内置到系统中充足的诊断支持 - 考虑创建Oracle ADO周围的包装要求,这样就可以仪器,记录,并找到他们。
  • 考虑在可能的情况下使用存储过程或视图将数据模型的查询语义和知识推送到数据库中。这允许更简单的配置和查询调优。
  • 另外,可以考虑使用一个很好的ORM库(EF,休眠等)封装数据访问 - 特别是如果你执行读取和写入操作。
  • 对上述内容进行扩展 - 不要用几十个单独编写的SQL片段来代码。这很快就成为可维护性的噩梦。
  • 如果您承诺将Oracle作为数据库,不要害怕使用Oracle特有的功能。 ODP库提供对大多数功能的访问 - 例如返回表游标,批处理操作等。
  • Oracle将空字符串(“”)和NULL视为等价物 - .NET不会。使Oracle适合您的字符串处理。
  • 考虑使用,而不是VARCHAR2 NVARCHAR2如果你在你的数据库直接存储Unicode字符串的.NET。否则,转换所有unicode字符串以符合核心ASCII子集。不这样做可能会导致各种混乱和恶意数据损坏问题。
+0

+1这很有帮助。我会留下这个问题,以便其他人也可以为此做出贡献。 – Vivek 2009-08-05 15:12:46

+0

@LBushkin - 关闭连接不够吗?我为什么要处置? – 2012-06-21 07:52:23

+0

一般来说,如果一个类型实现了IDisposable,那么在完成时调用Dispose()是一个好主意 - 这是一件很友好的事情,所以如果底层代码执行任何优化(例如提前释放资源)它有机会这样做。在数据库连接的特定情况下,一些库在内部优化以响应连接处理 - 这对于应用程序和数据库都是好事,因为在大多数情况下连接实际上是集中的。仅仅关闭连接并不总是足以向底层提供者暗示你已完成。 – LBushkin 2012-06-22 00:39:25

3

Oracle的供应商在ASP.NET应用程序正常工作,但要注意的:

  • 匹配的Oracle客户端32位或64位的正确版本与您的应用程序池
  • 用于32位应用程序池的32位客户端,用于64位应用程序池的64位客户端。
  • 权限 - 授予应用程序池的用户权限Oracle客户端目录(C:\ ORACLE \产品\ 10.2.0 \ Client_1上)

这不会有任何与ASP。NET,但重要的是要注意,Oracle存储空字符串和null都为null,所以如果您需要知道某些内容为空且不为空,则需要添加一个额外的列以跟踪该内容...

4

一些更小技巧:使用Microsoft Oracle提供

+0

此外,Microsoft Oracle提供程序(与.NET框架一起提供)在解析大值到StoredProcedures时遇到问题。大型项目(大于32000字节,我相信)会导致错误类型的错误。当使用blob和long(这是存储长文本)时,这会导致很大的问题。然而,参数化查询能够接收大项目(目前我的一个项目正在使用黑客来解决此问题)。 – Gertjan 2009-08-05 16:49:21

+0

存储过程中字符串的最大长度为32k个字符(或字节)。所有较大的应该是LOB类型(BLOB,CLOB或NCLOB)。一个LOB可以大于2GB。 – Christian13467 2009-08-06 00:12:08