stored - procedimientos almacenados sql server desde java
¿Procedimientos almacenados o mapeadores O? (15)
¿Cual es mejor? ¿O usar y OR mapper con SP? Si ya tiene un sistema con SP, ¿vale la pena un corrector OR?
"Estoy tratando de clavar un clavo. ¿Debo usar el tacón de mi zapato o una botella de vidrio?"
Tanto los procedimientos almacenados como los ORM son difíciles y molestos de usar para un desarrollador (aunque no necesariamente para un administrador de bases de datos o un arquitecto, respectivamente), ya que incurren en un costo inicial y un costo de mantenimiento más elevado que no garantizan un pago.
Ambos rendirán bien si no se espera que los requisitos cambien mucho durante la vida útil del sistema, pero en primer lugar se interpondrán en su camino si está construyendo el sistema para descubrir los requisitos.
El SQL de código directo o cuasi ORM como LINQ y ActiveRecord es mejor para los proyectos de construcción para descubrir (que suceden en la empresa mucho más de lo que PR quiere que piense).
Los procedimientos almacenados son mejores en un entorno independiente del idioma, o donde se requiere un control minucioso de los permisos. También son mejores si su DBA tiene una mejor comprensión de los requisitos que sus programadores.
Los ORM completos son mejores si haces Big Design Up Front, utilizas mucho UML, deseas abstraer el back-end de la base de datos, y tu arquitecto tiene una mejor comprensión de los requisitos que tu DBA o tus programadores.
Y luego está la opción n. ° 4: usar todas. Por lo general, un sistema completo no es solo un programa, y si bien muchos programas pueden comunicarse con la misma base de datos, cada uno de ellos podría usar cualquier método que sea apropiado tanto para la tarea específica del programa como para su nivel de madurez. Es decir: comienza con SQL directo o LINQ, luego madura el programa refaccionando en ORM y Procedimientos almacenados donde ve que tienen sentido.
@ Kent Fredrick
Mi opinión personal de OR Mappers es que su existencia resalta un defecto de diseño en la popular estructura de bases de datos ".
Creo que estás hablando de la diferencia entre el modelo relacional y el modelo orientado a objetos. Esta es la razón por la que necesitamos los ORM, pero las implementaciones de estos modelos se hicieron a propósito, no es un flujo de diseño, sino que es exactamente cómo resultaron las cosas históricamente.
Bueno, los SP ya están ahí. No tiene sentido que puedan realmente. ¿Supongo que tiene sentido usar un mapeador con SP?
Definitivamente ORMs . Más flexible, más portátil (generalmente tienden a tener portabilidad incorporada). En caso de lentitud, es posible que desee utilizar el almacenamiento en caché o SQL a mano en los puntos calientes.
Los procedimientos almacenados generalmente tienen varios problemas con la mantenibilidad.
- separado de la aplicación (muchos cambios ahora deben hacerse en dos lugares)
- generalmente es más difícil cambiar
- más difícil de poner bajo control de versión
- más difícil para asegurarse de que estén actualizados (problemas de implementación)
- portabilidad (ya mencionado)
En mi trabajo, principalmente hacemos aplicaciones de línea de negocios: trabajo por contrato.
Para este tipo de negocio, soy un gran admirador de ORM. Hace aproximadamente cuatro años (cuando las herramientas ORM estaban menos maduras) estudiamos en CSLA y lanzamos nuestra propia herramienta simplificada de ORM que usamos en la mayoría de nuestras aplicaciones, incluidos algunos sistemas de clase empresarial que tienen más de 100 tablas.
Estimamos que este enfoque (que por supuesto incluye mucha generación de código) crea un ahorro de tiempo de hasta un 30% en nuestros proyectos. En serio, es ridículo.
Hay una pequeña compensación de rendimiento, pero es insustancial siempre que tenga una comprensión decente del desarrollo de software. Siempre hay excepciones que requieren flexibilidad.
Por ejemplo, las operaciones por lotes extremadamente intensivas en datos aún deberían manejarse en sprocs especializados si es posible. Probablemente no desee enviar 100.000 registros enormes a través del cable si pudiera hacerlo en un proceso directo en la base de datos.
Este es el tipo de problema que enfrentan los desarrolladores novatos, ya sea que estén usando ORM o no. Simplemente tienen que ver los resultados y, si son competentes, lo obtendrán.
Lo que hemos visto en nuestras aplicaciones web es que, por lo general, los cuellos de botella de rendimiento más difíciles de resolver ya no están relacionados con la base de datos, incluso con ORM. Más bien, están en el front-end (navegador) debido al ancho de banda, la sobrecarga de AJAX, etc. Incluso los servidores de bases de datos de rango medio son increíblemente poderosos en estos días.
Por supuesto, otras tiendas que trabajan en sistemas de gran demanda mucho más grandes pueden tener experiencias diferentes allí. :)
En realidad no son mutuamente excluyentes, aunque a su punto, por lo general, lo son.
La ventaja de utilizar la asignación relacional de objetos es que puede intercambiar orígenes de datos. No solo la estructura de la base de datos, sino que podría usar cualquier fuente de datos. Con los servicios web de advenimiento / arquitectura orientada a servicios / ESB, en una corporación más grande, sería prudente considerar tener una separación de inquietudes de mayor nivel que la que podría tener en los procedimientos almacenados. Sin embargo, en compañías más pequeñas y en aplicaciones que nunca utilizarán una fuente de datos diferente, entonces los SP pueden cumplir con los requisitos. Y un último punto, no es necesario usar un asignador O para obtener la abstracción. Mi antiguo equipo tuvo un gran éxito al simplemente usar un modelo de adaptador con Spring.NET para conectar la fuente de datos.
Esto se ha discutido extensamente en preguntas anteriores.
¿Cuáles son los pros y los contras de mantener SQL en los procesos almacenados versus el código?
Los procedimientos almacenados son mejores, en mi opinión, porque pueden tener una configuración de seguridad independiente de las tablas subyacentes.
Esto significa que puede permitir operaciones específicas sin permitir escrituras / lecturas en tablas específicas. También limita el daño que las personas pueden hacer si descubren un exploit de inyección de SQL.
Me gustan los ORM porque no tienes que reinventar la rueda. Dicho esto, depende completamente de las necesidades de su aplicación, el estilo de desarrollo y el del equipo.
Esta pregunta ya se ha cubierto. ¿Por qué NHibernate genera el SQL parametrizado tan rápido como un procedimiento almacenado?
No hay nada bueno que decir acerca de los procedimientos almacenados. Hubo una necesidad hace 10 años, pero cada beneficio de usar sprocs ya no es válido. Los dos argumentos más comunes son sobre seguridad y rendimiento. La basura de "enviar cosas por el cable" tampoco es válida. Ciertamente, puedo crear una consulta de forma dinámica para hacer todo en el servidor también. Una cosa que los proponentes de sproc no le dirán es que hace que las actualizaciones sean imposibles si está utilizando la resolución de conflictos de columnas en una publicación de fusión. Solo los DBA que piensan que son los dueños de la base de datos insisten en los sprocs porque hacen que su trabajo se vea más impresionante de lo que realmente es.
Personalmente, he descubierto que los SP tienden a ser más rápidos en cuanto a rendimiento, al menos para los elementos de datos grandes que ejecuto regularmente. Pero conozco a mucha gente que jura por las herramientas de quirófano y no haría NADA más.
Procedimientos almacenados incuestionablemente. O los Mappers son específicos del idioma y, a menudo, agregan ralentizaciones gráficas.
Los procedimientos almacenados significan que no está limitado por la interfaz de idioma y simplemente puede agregar nuevas interfaces a la base de datos en formas compatibles con versiones anteriores.
Mi opinión personal de OR Mappers es que su existencia resalta un defecto de diseño en la popular estructura de bases de datos. Los desarrolladores de bases de datos deben darse cuenta de las tareas que las personas están tratando de lograr con OR-Mappers complicados y crear utilidades del lado del servidor que ayudan a realizar esta tarea.
O los Mappers también son objetivos épicos del síndrome de "abstracción con fugas" ( Joel On Software: Leaky Abstractions )
Donde es bastante fácil encontrar cosas que simplemente no pueden manejar debido a que la capa de abstracción no es psíquica.
Si ya tiene una API de datos expuesta como sprocs, deberá justificar una revisión general de arquitectura para ir a ORM.
Para una compilación de campos verdes, evaluaría varias cosas:
- Si hay un DBA dedicado en el equipo, me inclinaría a los sprocs
- Si hay más de una aplicación tocando la misma base de datos, me inclinaría a comprar
- Si no hay posibilidad de migración de la base de datos alguna vez, me inclinaría a los sprocs
- Si estoy tratando de implementar MVCC en la base de datos, me inclinaría a los sprocs
- Si estoy implementando esto como un producto con db back-end potencialmente múltiples (MySql, MSSql, Oracle), me inclinaría a ORM
- Si tengo un plazo ajustado, me inclinaría por ORM, ya que es una manera más rápida de crear mi modelo de dominio y mantenerlo sincronizado con el modelo de datos (con las herramientas adecuadas).
- Si estoy exponiendo el mismo modelo de dominio de múltiples maneras (aplicación web, servicio web, cliente RIA), me inclinaré hacia ORM ya que entonces el modelo de datos se ocultará detrás de mi fachada ORM, haciendo que un modelo de dominio robusto sea más valioso para yo.
Creo que el rendimiento es algo así como un heraldo; Hibernate parece funcionar casi tan bien o mejor que el SQL codificado a mano (debido a sus niveles de almacenamiento en caché), y es fácil escribir una consulta incorrecta en su sproc de cualquier manera.
Los criterios más importantes son probablemente las habilidades del equipo y las necesidades de portabilidad de la base de datos a largo plazo.
Use procedimientos almacenados donde haya identificado un cuello de botella de rendimiento. si no ha identificado un cuello de botella, ¿qué está haciendo con la optimización prematura?
Use procedimientos almacenados donde le preocupe el acceso de seguridad a una tabla en particular.
Utilice procs almacenados cuando tenga un asistente de SQL que esté preparado para sentarse y escribir consultas complejas que unan muchas tablas en una base de datos heredada, para hacer las cosas que son difíciles en un asignador OR.
Utilice el asignador OR para el otro (al menos) 80% de su base de datos: donde las selecciones y actualizaciones son tan rutinarias como para hacer que el acceso a través de procedimientos almacenados solo sea un ejercicio inútil en la codificación manual, y donde las actualizaciones son tan infrecuentes que no hay costo de rendimiento Use un asignador O para automatizar las cosas fáciles.
La mayoría de los mapeadores OR pueden hablar con los procesos almacenados para el resto.
No debe usar procesos almacenados suponiendo que son más rápidos que una instrucción sql en una cadena, este no es necesariamente el caso en las últimas versiones del servidor MS SQL.
No necesita usar procs almacenados para frustrar los ataques de inyección SQL, hay otras maneras de asegurarse de que sus parámetros de consulta estén fuertemente tipados y no solo concatenados en cadenas.
No necesita utilizar un asignador O para obtener un modelo de dominio POCO, pero sí ayuda.
Yo diría que el uso de un asignador OR aumentará la legibilidad y el mantenimiento del código fuente de las aplicaciones, mientras que el uso de SP aumentará el rendimiento de la aplicación.