Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

40

Click here to load reader

description

Página oficial del SolidQ Summit: http://summit.solidq.com/madrid/2013/ En esta sesión, daremos un repaso a diferentes patrones de acceso a datos desde aplicaciones, viendo sus pros y sus contras, pensando en aprovechar las nuevas características que vienen con nuestros motores SQL. Hablaremos de patrones MERGE+TVP, de Entity Framework, de LINQ2SQL,… trataremos los siguientes aspectos: 1) Applicaciones Java con JDBC; 2) ENtityFramework (EAGER loading, lazy loading); 3) EF traducciones a TSQL; 4)JPA/Hibernate traducciones a TSQL Ponentes: Enrique Catalá y Enrique Puig Nouselles

Transcript of Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Page 1: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Buenas prácticas de codificación para capas de acceso a datos de aplicaciones

REL300007

Enrique Catalá Bañuls Mentor – Relational engine

MAP 2012 – Microsoft Technical Ranger – Microsoft Certified Trainer

[email protected]

Enrique Puig Nouselles DPE – Relational engine MAP 2012 – Microsoft Technical Ranger – MCPIT SQL Server

[email protected]

Page 2: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Agenda

Patrones de acceso a datos

Entity framework Eager

Lazy

Stored procedure

Rendimiento

Nuevas arquitecturas DAL para SQL 2012 MERGE + TVP + SECUENCIAS

Otros lenguajes

Page 3: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Tipología de acceso Set-based solutions

Cursor-based solutions

Patrones de bajo nivel Dinámico

AD-HOC

Parametrizable

Estático

Stored procedures

Arquitecturas Modelo de conectividad

Conectada

Desconectada

Modelo de desarrollo

Manual

ORM

Patrones de acceso a base de datos

Bajo nivel

Page 4: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Motor relacional trabaja con conjuntos de información

Generan código espagueti

Solo funcionan en un único core Malísima gestión de recursos

Típico problema de: tengo 4 cores…si lanzo 4 cursores reviento el sistema

Generan tráfico de red excesivo

Consumo de CPU y E/S del orden de 100.000x ¿no te lo crees? espera a ver la demo

Patrones de acceso a datos

Bajo nivel: cursores

Page 5: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Facilidad de codificación aparente El developer de la app puede lanzar queries a su

antojo

Problemas de escalabilidad Escasa o nula reusabilidad de planes de ejecución Incremento de uso de CPU, Memoria y E/S

Problemas de seguridad Permisos SQL Injection habitual

Patrones de acceso a datos

Bajo nivel: ad-hoc

string str= "select name

from sys.tables

where name like ‘ " + variableWhere

-- qué ocurre si -- variableWhere = %';select 'hola mundo'

Page 6: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

sp_execute Ejecuta un T-SQL preparado usando un handle

No recomendado uso manual

Utilizado por algunas dll antiguas ADO

Demasiado viaje ida-vuelta

sp_executesql Parametrizar consultas ad-hoc fácilmente

Recomendado siempre que tengamos que lanzar ad-hoc

Patrones de acceso a datos

Bajo nivel: parametrizable

sp_execute handle OUTPUT [

,bound_param ] [ ,...n ] ]

sp_executesql

[ @stmt = ] statement [ { ,

[ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' } { ,

[ @param1 = ] 'value1' [ ,...n ] } ]

Page 7: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Compilación de una o más sentencias T-SQL

Acepta múltiples parámetros de entrada y de salida

Punto de entrada preferente a SQL Server Mejora el desacoplamiento

Mejora el uso de recursos

Facilita desarrollos eficientes con equipos de trabajo especializados

Minimiza problemas de seguridad

Reutilización de código

Patrones de acceso a datos

Bajo nivel: stored procedures

Page 8: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

DEMO DEMO Cursores vs query standard

Ad-hoc vs parametrización vs stored procedures

Page 9: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Patrones de acceso a datos

¿Por qué aparecen los ORMs?

Fundamentos

• Diferencia de roles

• Desarrollador vs. DBA

• Independencia de la

aplicación

• Uso de modelo de datos

• Abstracción de servidor de

base de datos

• SQL Server

• MySQL

• Oracle

• …

Más motivos

• Rechazo a T-SQL

• Manejo de cadenas para

acceso a datos

• Errores en tiempo de

ejecución vs. Compilación

• Uso de lenguajes más

familiares

• Es más “cool” usar EF o

JPA.

Page 10: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Pros Autonomía completa del desarrollador

Liberias automáticas de generación de código contra BBDD

Linq2Sql, EF,…

Tiempo de desarrollo reducido

Te sientes mas “cool” cuando hablas con tus compañeros

Contras Poca escalabilidad

Un DBD conoce mejor el motor que un desarrollador general

Dependencia total de aplicación cliente y del código fuente

¿Qué pasa si es desarrollador externo y nos deja?

Dejas de pensar en que la tecnología usada es “cool” cuando lo pones en producción

Patrones de acceso a datos

ORMs: Pros vs contras

Page 11: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Agenda

Patrones de acceso a datos

Entity framework Eager

Lazy

Stored procedure

Rendimiento

Nuevas arquitecturas DAL para SQL 2012 MERGE + TVP + SECUENCIAS

Otros lenguajes

Page 12: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Entity framework

¿Cómo piensa un desarrollador?

Page 13: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Entity Framework

¿Cómo piensa un DBA?

Page 14: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

EF: Entity Data Model

Entity Framework

Modelo de Datos

Modelo

Conceptual

• Entidades

• Relaciones

Modelo lógico

• Tablas

• Claves

Modelo físico

• Particiones

• Índices

Page 15: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Entity Framework

Entity Data Model

Mapping

Tabla

Tabla

Tabla

Tabla

Tabla

Page 16: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Nos olvidamos de la base de datos Solo importa el modelo conceptual

Trabajamos con un modelo de objetos Operaciones CUD

Consultas

Modelo de objetos

Eager Loading

Lazy Loading

Entity SQL

LinQ

Native SQL

Procedimientos almacenados

Entity Framework

Entity Data Model

Page 17: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Reducir líneas de código en capas de acceso a datos

Abstracción de motor de BD

Curva de aprendizaje pequeña C# o VB

LinQ

Modelo de objetos

Errores en tiempo de ejecución

Aplicación moderna

“Un gran poder conlleva una gran responsabilidad” Tío Ben (Spiderman)

Entity Framework

Ventajas para el desarrollador

Page 18: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

DEMO DEMO Consultas con EF

Page 19: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Métodos Eager loading

Lazy Loading

Modelo objetos

LinQ

EntitySQL

NativeSQL

Procedimientos

¿Comparamos rendimientos?

Entity framework

¿Cómo programo consultas en Entity Framework?

Page 20: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

DEMO DEMO Comparación de rendimiento de consultas en EF

Page 21: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Comparativa

Rendimiento por técnica

0

1000

2000

3000

4000

5000

6000

7000

1 2 3 4 5 6 7 8 9 10

Time (ms)

Lazy Loading

Eager Loading

LinQ

NativeSQL

SP

Page 22: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Comparativa

Native SQL + LinQ + SP

0

5

10

15

20

25

30

35

40

45

50

1 2 3 4 5 6 7 8 9 10

Time (ms) LinQ

NativeSQL

SP

Page 23: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Agenda

Patrones de acceso a datos

Entity framework Eager

Lazy

Stored procedure

Rendimiento

Nuevas arquitecturas DAL para SQL 2012 MERGE + TVP + SECUENCIAS

Otros lenguajes

Page 24: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

“Mi aplicación quiere propagar ‘n’ modificaciones a BBDD”

Aplicación posee estructura en memoria con información a procesar

DataTable por ejemplo si usamos .NET

Usuario modifica los datos Mediante un grid, por ejemplo se modifican ciertos datos

Usuario quiere guardar los datos Tiempo despues, queremos que todos los cambios se propaguen

Queremos minimizar bloqueos y maximizar el rendimiento

Arquitectura eficiente con SQL Server 2012

Problema a resolver

Page 25: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Cada operación se trata de forma independiente Elevado nº de idas y venidas al servidor es elevado

SQL Server no tiene información sobre todo lo que modificar Estrategia de bloqueos imposible de optimizar

3 planes de ejecución INSERT, UPDATE y DELETE

En el mejor de los casos…si se opta por AD-HOC…

Gestión ineficiente por parte de DAL

Arquitectura eficiente con SQL Server 2012

Propuesta de solución habitual

Page 26: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Una única operación

Una única ida-venida al servidor

SQL Server tiene información sobre todo lo que modificar

Estrategia de bloqueos optimizada

Gestión eficiente por parte de DAL

DAL no se preocupa de qué ha ocurrido con el conjunto de datos

Arquitectura eficiente con SQL Server 2012

Propuesta de solución eficiente

Page 27: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Fácil implementación Fácil mantenimiento Rápida de codificar Basada en características que aprovechan el motor TVP (parámetros de tipo tabla) Cláusula MERGE Secuencias

Tiene una pega…ningún ORM actual soporta TVP ¿Puedes sacrificar un poco de desarrollo a cambio de

gran escalabilidad?

Arquitectura eficiente con SQL Server 2012

Problema maestro-detalle

Page 28: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

DEMO DEMO Arquitectura eficiente con SQL Server 2012

Page 29: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Agenda

Patrones de acceso a datos

Entity framework Eager

Lazy

Stored procedure

Rendimiento

Nuevas arquitecturas DAL para SQL 2012 MERGE + TVP + SECUENCIAS

Otros lenguajes

Page 30: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

JAVA: Driver JDBC y JPA

Page 31: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

JAVA

Consideraciones JDBC

Selection Method

• Direct o Cursor

• Cadena de conexión

• SelectMethod

• Por definición se usa Direct

Ascii vs. Unicode

• sendStringParametersAsUnicode

• True o False

• Cadena de conexión

• Envió de cadenas como Unicode

siempre

• Impacto en rendimiento

• Suprime la indexación

• Conversiones implícitas

Page 32: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

JAVA

SelectMethod=Direct

Aplicación

Memoria Datos

Page 33: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

JAVA

SelectMethod=Cursor

Aplicación

Memoria Datos

Page 34: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

DEMO DEMO JDBC: SelectMethod y sendStringParameterAsUnicode

Page 35: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

JAVA

JDBC: Selection method pros y contras.

Direct

• Pros

• Información disponible

inmediatamente

• Mayor rapidez de iteración

• Más rápido

• Contras

• Mayor consumo de

memoria

• Aprovisionamiento de

memoria para el peor de

los casos

• Mayor carga en red

Cursor

• Pros

• Requiere poca memoria

• Más rapidez mostrando

datos en app

• Pide menor nº de filas

• Excepto Order By

• Contras

• Más lento

• Dispara actividad y CPU

en servidor

• Muchos roundtrips en

red

Page 36: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Java persistence API

ORM basado en Toplink e Hibernate

La versión Entity Framework de Java

Presenta los mismos problemas que EF

Soporta operaciones CUD

Métodos de consulta Modelo de objetos Java

JPSQL

NativeSQL

JAVA

JPA

Page 37: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

DEMO DEMO Rendimiento de consultas JPA contra SQL Server

Page 38: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Agenda

Patrones de acceso a datos

Entity framework Eager

Lazy

Stored procedure

Rendimiento

Nuevas arquitecturas DAL para SQL 2012 MERGE + TVP + SECUENCIAS

Otros lenguajes

Page 39: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Patrones de bajo nivel Stored procedure

Arquitecturas desconectadas

ORMs SI, pero aplicando buenas prácticas.

Combinados con procedimientos almacenados rinden bien

JDBC Tener en cuenta el selectMode y el envio de parametros Unicode

para no tener problemas de rendimiento.

Al final lo más óptimo siempre es programar lo más cerca del dato posible.

Conclusiones

Page 40: Buenas prácticas de codificación para capas de acceso a datos de aplicaciones | SolidQ Summit 2012

Si quieres disfrutar de las mejores sesiones de

nuestros mentores de España y Latino América,

ésta es tu oportunidad.

http://summit.solidq.com/madrid/

Síguenos: