2009-08-05 9 views

Respuesta

17

Algunas prácticas que empleamos en base a nuestra experiencia en la producción:

  • conexiones Validar al recuperar desde la agrupación de conexiones.
  • Escribe tu código de servicio no asumir que las conexiones son válidas - el no hacerlo puede causar un poco de dolor, especialmente en entornos de producción
  • Siempre que sea posible, de manera explícita estrecha y disponer las conexiones después de usarlos (using(conn){} bloques funcionan bien)
  • En un servicio, debe usar conexiones durante el menor tiempo posible, especialmente si está buscando crear una solución escalable.
  • Considere el uso de timouts explícitos en las solicitudes apropiadas para la duración típica de una solicitud. Lo último que desea es tener un tipo de solicitud que se bloquea para bloquear potencialmente todo su sistema.
  • Siempre que sea posible, utilice las variables de enlace para evitar los análisis en la base de datos (esto puede ser una pesadilla si no comienza con esta práctica). El uso de variables de vinculación también lo protege de ataques básicos de inyección SQL.
  • Asegúrese de tener un soporte de diagnóstico adecuado en su sistema; considere la posibilidad de crear un envoltorio alrededor de las llamadas de Oracle ADO para que pueda instrumentar, registrar y ubicar todas ellas.
  • Considere usar procedimientos almacenados o vistas cuando sea posible para llevar la semántica de consultas y el conocimiento del modelo de datos a la base de datos. Esto permite un perfil más fácil y ajuste de consultas.
  • Como alternativa, considere utilizar una buena biblioteca ORM (EF, Hibernate, etc.) para encapsular el acceso a los datos, especialmente si realiza operaciones de lectura y escritura.
  • Extendiendo todo lo anterior, no salpique su código con docenas de fragmentos de SQL escritos individualmente. Esto se convierte rápidamente en una pesadilla de mantenimiento.
  • Si está comprometido con Oracle como base de datos, no tema usar las características específicas de Oracle. La biblioteca ODP proporciona acceso a la mayoría de las funciones, como devolver cursores de tabla, operaciones por lotes, etc.
  • Oracle trata cadenas vacías ("") y NULL como equivalentes - .NET no lo hace. Normalice su tratamiento de cadena según corresponda para Oracle.
  • Considere usar NVARCHAR2 en lugar de VARCHAR2 si va a almacenar cadena .NET Unicode directamente en su base de datos. De lo contrario, convierta todas las cadenas de Unicode para que se ajusten al subconjunto Core ASCII. De lo contrario, puede causar todo tipo de problemas de corrupción de datos confusos y malvados.
+0

+1 esto muy útil. Dejaré la pregunta abierta para que otros también puedan contribuir a esto. – Vivek

+0

@LBushkin - ¿No está cerrando una conexión lo suficiente? ¿Por qué debería deshacerme? –

+0

En general, si un tipo implementa IDisposable, es una buena idea llamar a Dispose() sobre él cuando haya terminado; es lo más amigable que puede hacer, de modo que si el código subyacente realiza alguna optimización (por ejemplo, liberación anticipada de recursos) tiene la oportunidad de hacerlo. En el caso específico de las conexiones de bases de datos, algunas bibliotecas optimizan internamente en respuesta a la eliminación de conexiones, lo cual es bueno tanto para la aplicación como para la base de datos, ya que en la mayoría de los casos las conexiones se agrupan. Solo cerrar la conexión no siempre es suficiente para indicarle al proveedor subyacente que ya terminaste. – LBushkin

3

Los Proveedores de Oracle funcionan bien en una aplicación ASP.NET, pero tener en cuenta:

  • Adaptación de la versión correcta del cliente de Oracle de 32 bits o 64 bits con su grupo de aplicaciones
  • Cliente de 32 bits para un grupo de aplicaciones de 32 bits, cliente de 64 bits para un grupo de aplicaciones de 64 bits.
  • Permisos - conceder los derechos de los usuarios de la piscina aplicación en el directorio de cliente de Oracle (c: \ oracle \ product \ 10.2.0 \ client_1)

Esto no tiene nada que ver con ASP.NET, pero es importante tener en cuenta que Oracle almacena cadenas vacías y nulas ambas como nulas, por lo que si necesita saber que algo estaba vacío y no nulo, debe agregar una columna adicional para rastrear ...

4

algunos consejos más:

+0

También el proveedor de Microsoft Oracle (que se entrega junto con .NET Framework) tiene problemas para analizar valores grandes en StoredProcedures. Los artículos grandes (más grandes que 32000 bytes, creo) causan errores sobre los tipos que no coinciden. Esto puede causar grandes problemas cuando se trabaja con blobs y long (que es almacenar textos largos). Las consultas parametrizadas, sin embargo, pueden recibir elementos grandes (actualmente, uno de mis proyectos está utilizando un truco para solucionar este problema). – Gertjan

+0

La longitud máxima de una cadena en un procedimiento almacenado es de 32k caracteres (o bytes). Todos los más grandes deben ser de tipo LOB (BLOB, CLOB o NCLOB). Un LOB puede tener un tamaño> 2GB. – Christian13467

Cuestiones relacionadas