El documento habla sobre el uso de Spring Data y MongoDB en un proyecto real de control de tráfico marítimo. El proyecto enfrentaba desafíos de escalabilidad debido a la gran cantidad de datos generados por cada barco monitoreado. Se eligió MongoDB por su capacidad para escalar horizontalmente y su soporte para formatos de documentos como JSON. Spring Data facilita el desarrollo de aplicaciones que se integran con MongoDB mediante una interfaz de programación familiar.
The Spring Expression Language (SpEL for short) is a powerful expression language that supports querying and manipulating an object graph at runtime. The language syntax is similar to Unified EL but offers additional features, most notably method invocation and basic string templating functionality.
The theory of SOLID principles was
introduced by Robert C. Martin in his 2000
paper “Design Principles and Design
Patterns”.
SOLID => Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion.
The Spring Expression Language (SpEL for short) is a powerful expression language that supports querying and manipulating an object graph at runtime. The language syntax is similar to Unified EL but offers additional features, most notably method invocation and basic string templating functionality.
The theory of SOLID principles was
introduced by Robert C. Martin in his 2000
paper “Design Principles and Design
Patterns”.
SOLID => Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion.
Cloud adoption fails - 5 ways deployments go wrong and 5 solutionsYevgeniy Brikman
"All happy cloud deployments are alike; each unhappy cloud deployment is unhappy in its own way." — Leo Tolstoy, Site Reliability Engineer
At Gruntwork, I've had the chance to see the cloud adoption journeys of hundreds of companies, from tiny startups to Fortune 50 giants. I've seen those journeys go well. I've seen those journeys go poorly. In this talk, I discuss a few of the ways cloud adoption can go horribly wrong (massive cost overruns, endless death marches, security disasters), and more importantly, how you can get it right.
To help you get it right, we looked at the cloud journeys that were successful and extracted from them the patterns they had in common. We distilled all this experience down into something called the Gruntwork Production Framework, which defines five concrete steps you can follow to adopt the cloud at your own company—and hopefully, to end up with your very own happy cloud deployment.
A presentation delivered to the Melbourne AWS Meetup on the May 24, 2018 . Discusses the implementation of the new AWS Containers sub-generator, which allows JHipster applications to be deployed on Amazon ECS, leveraging Fargate.
Modern Java web applications with Spring Boot and ThymeleafLAY Leangsros
If you’re using Java in an enterprise environment, you’ve most likely been using Spring Framework with JSP which does the job pretty well.But I will provide the sampling of how Spring Boot helps you accelerate and facilitate application development better. I will show a templating technology, Thymleaf which can be used much more modern features;
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinFabio Collini
It’s never easy to write async code but luckily there are many libraries to manage asynchronicity without adding too much complexity. In the last years RxJava and the other ReactiveX libraries have been very popular but lately there is a new way to manage async code in Kotlin: the coroutines. In this talk we’ll pros and cons of there two approaches and how to leverage them to simplify asynchronous code on Android.
Do they solve the same problem? Can we use them together? Which one can be used to write functional code? How can we use them effectively in Android development?
Spoiler alert: They are both great!
In this talk we’ll see how to solve common problems using RxJava or Coroutines, starting from basic concepts (for example the Retrofit support and how to cancel a task) to some more advanced (like threading, error management and how to combine multiple tasks).
All example of the talk are available on this repository:
https://github.com/fabioCollini/RxJavaVsCoroutines
Integrando los servicios REST a nuestras aplicaciones APEXA+ Steel, SRL
En esta presentación mostraremos el contenido de la sesión APEX Office Hours donde aprendimos como crear y consumir servicios RESTful con Oracle APEX.
Esta presentación nos permite brindar una introducción al funcionamiento y beneficios de este tipo de servicios y la forma en que nos permite acceder información multiplataforma de una forma sencilla y con poco código.
CSI – IT2020, IIT Mumbai, October 6th 2017
Computer Society of India, Mumbai Chapter
The presentation focuses on Microservices architecture and the comparison between MicroService with Standard Monolithic Apps and SOA based Apps. It also gives a quick outline of Domain Driven Design, Event Sourcing and CQRS, Functional Reactive Programming and comparison of SAGA pattern with 2 Phase Commit.
http://www.csimumbai.org/it2020-17/index.html
Spring Data is a high level SpringSource project whose purpose is to unify and ease the access to different kinds of persistence stores, both relational database systems and NoSQL data stores.
Learning solid principles using c#
S Single Responsibility Principle
O Open Closed Principle
L Liskovs Substitution Principle
I Interface Segregation Principle
D Dependency Inversion principle
Cloud adoption fails - 5 ways deployments go wrong and 5 solutionsYevgeniy Brikman
"All happy cloud deployments are alike; each unhappy cloud deployment is unhappy in its own way." — Leo Tolstoy, Site Reliability Engineer
At Gruntwork, I've had the chance to see the cloud adoption journeys of hundreds of companies, from tiny startups to Fortune 50 giants. I've seen those journeys go well. I've seen those journeys go poorly. In this talk, I discuss a few of the ways cloud adoption can go horribly wrong (massive cost overruns, endless death marches, security disasters), and more importantly, how you can get it right.
To help you get it right, we looked at the cloud journeys that were successful and extracted from them the patterns they had in common. We distilled all this experience down into something called the Gruntwork Production Framework, which defines five concrete steps you can follow to adopt the cloud at your own company—and hopefully, to end up with your very own happy cloud deployment.
A presentation delivered to the Melbourne AWS Meetup on the May 24, 2018 . Discusses the implementation of the new AWS Containers sub-generator, which allows JHipster applications to be deployed on Amazon ECS, leveraging Fargate.
Modern Java web applications with Spring Boot and ThymeleafLAY Leangsros
If you’re using Java in an enterprise environment, you’ve most likely been using Spring Framework with JSP which does the job pretty well.But I will provide the sampling of how Spring Boot helps you accelerate and facilitate application development better. I will show a templating technology, Thymleaf which can be used much more modern features;
Async code on kotlin: rx java or/and coroutines - Kotlin Night TurinFabio Collini
It’s never easy to write async code but luckily there are many libraries to manage asynchronicity without adding too much complexity. In the last years RxJava and the other ReactiveX libraries have been very popular but lately there is a new way to manage async code in Kotlin: the coroutines. In this talk we’ll pros and cons of there two approaches and how to leverage them to simplify asynchronous code on Android.
Do they solve the same problem? Can we use them together? Which one can be used to write functional code? How can we use them effectively in Android development?
Spoiler alert: They are both great!
In this talk we’ll see how to solve common problems using RxJava or Coroutines, starting from basic concepts (for example the Retrofit support and how to cancel a task) to some more advanced (like threading, error management and how to combine multiple tasks).
All example of the talk are available on this repository:
https://github.com/fabioCollini/RxJavaVsCoroutines
Integrando los servicios REST a nuestras aplicaciones APEXA+ Steel, SRL
En esta presentación mostraremos el contenido de la sesión APEX Office Hours donde aprendimos como crear y consumir servicios RESTful con Oracle APEX.
Esta presentación nos permite brindar una introducción al funcionamiento y beneficios de este tipo de servicios y la forma en que nos permite acceder información multiplataforma de una forma sencilla y con poco código.
CSI – IT2020, IIT Mumbai, October 6th 2017
Computer Society of India, Mumbai Chapter
The presentation focuses on Microservices architecture and the comparison between MicroService with Standard Monolithic Apps and SOA based Apps. It also gives a quick outline of Domain Driven Design, Event Sourcing and CQRS, Functional Reactive Programming and comparison of SAGA pattern with 2 Phase Commit.
http://www.csimumbai.org/it2020-17/index.html
Spring Data is a high level SpringSource project whose purpose is to unify and ease the access to different kinds of persistence stores, both relational database systems and NoSQL data stores.
Learning solid principles using c#
S Single Responsibility Principle
O Open Closed Principle
L Liskovs Substitution Principle
I Interface Segregation Principle
D Dependency Inversion principle
Codemotion 2013 - Quiero tiempo real y lo quiero para ayerIván López Martín
Slides de mi charla de Codemotion "http://codemotion.es/talk/19-october/88". El código fuente de las demos está disponible es https://github.com/lmivan/codemotion-2013.
El vídeo de repetción de la charla en @madridgug está disponible en: http://www.youtube.com/watch?v=dkDub1QLqmM
En un mundo hiper-conectado el concepto Tiempo Real es cada vez más utilizado y las arquitecturas "message driven" son la manera de conseguirlo porque permiten crear aplicaciones modulares y escalables.
En esta charla veremos un tipo de arquitectura totalmente distinta a la estandar de Grails para aplicaciones web que nos permitirá servir contenido en tiempo real a muchos clientes de manera rápida y sencilla teniendo distintos módulos independientes que interactuarán entre sí.
Codemotion Madrid 2014 - Spring ha muerto... ¡larga vida a spring boot!Iván López Martín
Slides de mi charla de Codemotion 2014: "Spring ha muerto... ¡Larga vida a Spring Boot!"
El codigo está disponible en: https://github.com/lmivan/codemotion-madrid-2014-examples
--------------
Actualmente se necesita un tiempo nada despreciable para configurar la arquitectura de tu aplicación y empezar a desarrollar. Y si hablamos de Spring esto pueden ser horas o incluso días...
¿Qué tal si tardases menos de 5 minutos?
Spring Boot permite de manera fácil y rápida la creación de aplicaciones basadas en Spring Framework eliminando toda la configuración XML. No se trata de generación de código sino que proporciona configuraciones por defecto a la vez que permite de manera muy sencilla sobreescribir estas configuraciones según nuestras necesidades. Con él podemos crear aplicaciones "production-ready" proporcionando adicionalmente y de manera automática métricas, health-checks y configuración externalizada.
En la charla verás, entre otros, ejemplos introductorios, la creación de un pequeño API Rest, el uso de Websockets... y ¡muchos más!
Todos los ejemplos que verás estarán escritos en Groovy, pero eso no te impedirá sacar todo el provecho a la charla aunque tu lenguaje favorito sea Java o Scala.
SlideShare now has a player specifically designed for infographics. Upload your infographics now and see them take off! Need advice on creating infographics? This presentation includes tips for producing stand-out infographics. Read more about the new SlideShare infographics player here: http://wp.me/p24NNG-2ay
This infographic was designed by Column Five: http://columnfivemedia.com/
No need to wonder how the best on SlideShare do it. The Masters of SlideShare provides storytelling, design, customization and promotion tips from 13 experts of the form. Learn what it takes to master this type of content marketing yourself.
10 Ways to Win at SlideShare SEO & Presentation OptimizationOneupweb
Thank you, SlideShare, for teaching us that PowerPoint presentations don't have to be a total bore. But in order to tap SlideShare's 60 million global users, you must optimize. Here are 10 quick tips to make your next presentation highly engaging, shareable and well worth the effort.
For more content marketing tips: http://www.oneupweb.com/blog/
Are you new to SlideShare? Are you looking to fine tune your channel plan? Are you using SlideShare but are looking for ways to enhance what you're doing? How can you use SlideShare for content marketing tactics such as lead generation, calls-to-action to other pieces of your content, or thought leadership? Read more from the CMI team in their latest SlideShare presentation on SlideShare.
Leverage CompletableFutures to handle async queries. DevNexus 2022David Gómez García
Slides used at DevNexus 22 talk.
Completable futures were introduced in Java 8, and they are a powerful mechanism to add concurrency (not parallelism) to your application logic, and it may be handy when dealing with multiple queries to different systems.
If you are a developer, you may make your code more performant by using CompletableFutures where it makes sense.
If you are a library developer, it may be a good thing to offer an API that returns CompletableFutures so that your users will be able to benefit from it.
Building Modular monliths that could scale to microservices (only if they nee...David Gómez García
It’s easy these days to fall into the trap of starting to design your whole application with a microservices architecture…. Because, you know, that’s what everyone is doing, right?
But no, no. I’m not going to deny that Microservices have their advantages, specifically in a distributed and scalable world like the one we need to deal with. The problem may be in the approach we are taking. Are we considering the microservices architecture as a goal, or as a means to a purpose?
In this talk we will think in a different approach: we will go back to the basics, and see how following DDD, CQRS and Event-Sourcing practices will drive our application design and evolution in such a way that we will start with a monolith but we will have the ability to scale into a microservices architecture more or less easily when (and more importantly: if) we need to.
Building modular monoliths that could scale to microservices (only if they ne...David Gómez García
It’s easy these days to fall into the trap of starting to design your whole application with a microservices architecture…. Because, you know, that’s what everyone is doing. Aren't they?
But, are we considering the microservices architecture as a goal or as a means to a purpose?
In this talk, we will go back to the basics and see how DDD, CQRS and EventSourcing practices drive our application design and evolution so that we will start with a monolith. Still, we will have the ability to scale into microservices more or less easily when (and more importantly: if) we need to.
Leveraging Completable Futures to handle your query results AsynchrhonouslyDavid Gómez García
The challenges of developing applications recently have increased. With the popularity of cloud environments, the scalability required by new architectures and the need to support more load efficiently, there has been an increase in attention that we need to pay to concurrency and efficiency.
One strategy to achieve that efficiency consists of distributing the modules of your application in several different smaller components running concurrently. But one of the problems that arise from such distribution of running modules comes when you need to send a request (and wait for the response) to several different modules. How do you design that request(s)-response(s) to be as efficient as possible?
CompletableFutures was introduced with Java 8 but has evolved over the years with every new version of Java released. In this talk, we will take a look at it, to:
understand how to use CompletableFutures,
how they can help us to split our workload into different request and coordinate them asynchronously and concurrently
How you can chain behavior to the responses.
How you can use CompletableFuture in your design to create APIs that enable your users to get the most of your Component/library/module.
Builiding Modular monoliths that can scale to microservices. JBCNConf 2021David Gómez García
It’s easy these days to fall into the trap of starting to design your whole application with a microservices architecture…. Because, you know, that’s what everyone is doing. Aren't they?
But, are we considering the microservices architecture as a goal or as a means to a purpose?
In this talk, we will go back to the basics and see how DDD, CQRS and EventSourcing practices drive our application design and evolution so that we will start with a monolith. Still, we will have the ability to scale into microservices more or less easily when (and more importantly: if) we need to.
These are the slides I used in my talk at JBCNConf 2021.
Cdm mil-18 - hypermedia ap is for headless platforms and data integrationDavid Gómez García
Slides from my talk at Codemotion Milan 2018. Speaking about how Headess and Hypermedia REST APIs can leverage the way . we integrate different platforms and share date between them
Java9 Beyond Modularity - Java 9 más allá de la modularidadDavid Gómez García
These are the slides I used for my "Java 9 beyond modularity" at several different local meetups and conferences in Spain during 2017
Java 9 is about to reach its public release scheduled for September 2017. If we ask what are the new features that this new version will include, probably the first that comes to our head is modularity.
But java 9 brings with a lot of features beyound Jigsaw, JPMS or modularity. In this talk we will talk about at least 9 other new features that include this new version of Java that are interesting and maybe will end up being more used than the modularity itself for those who embrace the new version.
Those are changes that come to complement and improve even more the set of new tools (like Streams, Optionals, etc...) that Java 8 brought to us.
We'll take a look at small changes in language syntax (such as new ways of using try-with-resources), changes in Collections APIs and Streams, new tools like VarHandles, new APIs such as the Flow API, and As we allow the inclusion of reactive programming with Java.
Do you want to see in Java 9 beyond modularity? Do you want to have a more complete view of what you can provide? Let's take a look toghether!
The slides from the talk I gave at Oracle III #JuevesTecnológicos in Madrid.
A review of how the ParallelStreams Work in Java 8 and some considerations we must know in order to get the better performance from the concurrent data processing in #Java8
Estas son las slides que utilicé en la charla de la reunión de Septiembre de 2014 del GDG de Madrid.
Desde hace tiempo, los desarrolladores venimos utilizando scripts para automatizar y facilitarnos la construcción automática de nuestros proyectos.
En los intentos de estandarización de esos Scripts, la primera herramienta fue Ant, muy flexible, pero muy tediosa por lo verboso y por que siempre había que empezar desde cero.
La llegada de Maven supuso una cierta convención en las tareas y fases de construcción de un proyecto. Pero también incluía una tremenda facilidad para la gestión de librerías y dependencias. A cambio, impone una cierta rigidez en la estructura del script.
Gradle ha venido a buscar lo mejor de los dos mundos: la fexibilidad de Ant, la convención de Maven, la gestión de librerías de Ivy o Mvn.... y todo ello con un lenguaje de scripting más parecido al código que al XML en el que se basan las dos precedesoras.
Desde hace meses, Google ya ha apostado por Gradle como sistema de construcción de proyectos para Android en su Android Studio.
En esta charla, haremos una introducción a Gradle como herramienta de construcción de proyectos.
Java 8 Stream API. A different way to process collections.David Gómez García
A look on one of the features of Java 8 hidden behind the lambdas. A different way to iterate Collections. You'll never see the Collecions the same way.
These are the slides I used on my talk at the "Tech Thursday" by Oracle in June in Madrid.
With code examples from the real world that could give you a stroke.
The slides I used on my talk at t3chFest Madrid 2014.
A talk about Code Quality, Clean Code, and good and bad practices when writing code. A fun walk through the experiences from the real world with some advices and introducing some principles that will help you to write better code.
How to track an Event, trademark, company or subject to know not only how much people is talking about it, but also analizying sentimentally what is being said to know whether people is talking positive or negative.
An example mixing public APIs from Twitter, Google Maps and APICulture.
This is the slides set I used for my talk at Mediterranea APIDays held in Madrid in
The process of creating HDTR images from the photographic shot to the processing via a Photoshop JS script explained.
This is the slide I used for my talk at the monthly MadridJS meeting held on May, 23rd 2013.
Catalogo general Ariston Amado Salvador distribuidor oficial ValenciaAMADO SALVADOR
Distribuidor Oficial Ariston en Valencia: Amado Salvador distribuidor autorizado de Ariston, una marca líder en soluciones de calefacción y agua caliente sanitaria. Amado Salvador pone a tu disposición el catálogo completo de Ariston, encontrarás una amplia gama de productos diseñados para satisfacer las necesidades de hogares y empresas.
Calderas de condensación: Ofrecemos calderas de alta eficiencia energética que aprovechan al máximo el calor residual. Estas calderas Ariston son ideales para reducir el consumo de gas y minimizar las emisiones de CO2.
Bombas de calor: Las bombas de calor Ariston son una opción sostenible para la producción de agua caliente. Utilizan energía renovable del aire o el suelo para calentar el agua, lo que las convierte en una alternativa ecológica.
Termos eléctricos: Los termos eléctricos, como el modelo VELIS TECH DRY (sustito de los modelos Duo de Fleck), ofrecen diseño moderno y conectividad WIFI. Son ideales para hogares donde se necesita agua caliente de forma rápida y eficiente.
Aerotermia: Si buscas una solución aún más sostenible, considera la aerotermia. Esta tecnología extrae energía del aire exterior para calentar tu hogar y agua. Además, puede ser elegible para subvenciones locales.
Amado Salvador es el distribuidor oficial de Ariston en Valencia. Explora el catálogo y descubre cómo mejorar la comodidad y la eficiencia en tu hogar o negocio.
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor OficialAMADO SALVADOR
Explora el catálogo completo de cajas fuertes BTV, disponible a través de Amado Salvador, distribuidor oficial de BTV. Este catálogo presenta una amplia variedad de cajas fuertes, cada una diseñada con la más alta calidad para ofrecer la máxima seguridad y satisfacer las diversas necesidades de protección de nuestros clientes.
En Amado Salvador, como distribuidor oficial de BTV, ofrecemos productos que destacan por su innovación, durabilidad y robustez. Las cajas fuertes BTV son reconocidas por su eficiencia en la protección contra robos, incendios y otros riesgos, lo que las convierte en una opción ideal tanto para uso doméstico como comercial.
Amado Salvador, distribuidor oficial BTV, asegura que cada producto cumpla con los más estrictos estándares de calidad y seguridad. Al adquirir una caja fuerte a través de Amado Salvador, distribuidor oficial BTV, los clientes pueden tener la tranquilidad de que están obteniendo una solución confiable y duradera para la protección de sus pertenencias.
Este catálogo incluye detalles técnicos, características y opciones de personalización de cada modelo de caja fuerte BTV. Desde cajas fuertes empotrables hasta modelos de alta seguridad, Amado Salvador, como distribuidor oficial de BTV, tiene la solución perfecta para cualquier necesidad de seguridad. No pierdas la oportunidad de conocer todos los beneficios y características de las cajas fuertes BTV y protege lo que más valoras con la calidad y seguridad que solo BTV y Amado Salvador, distribuidor oficial BTV, pueden ofrecerte.
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador ValenciaAMADO SALVADOR
Descubre el catálogo general de la gama de productos de refrigeración del fabricante de electrodomésticos Miele, presentado por Amado Salvador distribuidor oficial Miele en Valencia. Como distribuidor oficial de electrodomésticos Miele, Amado Salvador ofrece una amplia selección de refrigeradores, congeladores y soluciones de refrigeración de alta calidad, resistencia y diseño superior de esta marca.
La gama de productos de Miele se caracteriza por su innovación tecnológica y eficiencia energética, garantizando que cada electrodoméstico no solo cumpla con las expectativas, sino que las supere. Los refrigeradores Miele están diseñados para ofrecer un rendimiento óptimo y una conservación perfecta de los alimentos, con características avanzadas como la tecnología de enfriamiento Dynamic Cooling, sistemas de almacenamiento flexible y acabados premium.
En este catálogo, encontrarás detalles sobre los distintos modelos de refrigeradores y congeladores Miele, incluyendo sus especificaciones técnicas, características destacadas y beneficios para el usuario. Amado Salvador, como distribuidor oficial de electrodomésticos Miele, garantiza que todos los productos cumplen con los más altos estándares de calidad y durabilidad.
Explora el catálogo completo y encuentra el refrigerador Miele perfecto para tu hogar con Amado Salvador, el distribuidor oficial de electrodomésticos Miele.
En este documento analizamos ciertos conceptos relacionados con la ficha 1 y 2. Y concluimos, dando el porque es importante desarrollar nuestras habilidades de pensamiento.
Sara Sofia Bedoya Montezuma.
9-1.
11. El problema: La escalabilidad
Por cada barco:
Recepción y procesamiento de señales (nº)
Transacciones,
Cálculo de alarmas
Gestión de Históricos
sábado 18 de febrero de 12
12. El problema: La escalabilidad
Señales
(1 AIS x 3 min + 1 radar x 3 seg) x 100 barcos
Alarmas
Persistencia de Líneas de Varada
(10.000+ ptos x 100+ líneas)
40 Alarmas
Zonas, Elementos Navegación
Persistencia: Total: 87 tablas + históricos(x2)
sábado 18 de febrero de 12
14. ¿Por qué NoSQL?
Teorema CAP (Eric Brewer)
Source: Nathan Hurst’s Blog
sábado 18 de febrero de 12
15. ¿Por qué NoSQL?
Teorema CAP (Eric Brewer)
Consistency
C
Source: Nathan Hurst’s Blog
sábado 18 de febrero de 12
16. ¿Por qué NoSQL?
Teorema CAP (Eric Brewer)
Consistency Availability
C A
Source: Nathan Hurst’s Blog
sábado 18 de febrero de 12
17. ¿Por qué NoSQL?
Teorema CAP (Eric Brewer)
Consistency Availability
C A
P
Partition Tolerance
Source: Nathan Hurst’s Blog
sábado 18 de febrero de 12
18. ¿Por qué NoSQL?
Teorema CAP (Eric Brewer)
Consistency Availability
C A
P
Partition Tolerance
Source: Nathan Hurst’s Blog
sábado 18 de febrero de 12
19. ¿Por qué NoSQL?
Teorema CAP (Eric Brewer)
Consistency Availability
C A
Sólo
2
P
Partition Tolerance
Source: Nathan Hurst’s Blog
sábado 18 de febrero de 12
20. ¿Por qué NoSQL?
Teorema CAP (Eric Brewer)
Consistency Availability
A
Oracle, MySQL,
C
Sólo
2
P
Partition Tolerance
Source: Nathan Hurst’s Blog
sábado 18 de febrero de 12
21. ¿Por qué NoSQL?
Teorema CAP (Eric Brewer)
Consistency Availability
A
Oracle, MySQL,
C
Sólo
M Hyp is, M
on er em
2
go Ta c
Re
DB ble ac
d
, D , H heD
at Ba B
aS se
to
re
,
P
Partition Tolerance
Source: Nathan Hurst’s Blog
sábado 18 de febrero de 12
22. ¿Por qué NoSQL?
RDBMS
Orientadas a documento
Teorema CAP (Eric Brewer) orientadas a columna
Key-Value
Consistency Availability
A
Oracle, MySQL,
C
Sólo
M Hyp is, M
,
on er em
uc ra, ort
2
aK
go Ta c
Co nd m
Re
Ri
DB ble ac
B, a de
d
B,
D ass ol
, D , H heD
hD
ple C o,V
at Ba B
am
aS se
to
yn
re
D
,
P
Partition Tolerance Sim
Source: Nathan Hurst’s Blog
sábado 18 de febrero de 12
23. Pero... ¿NoSQL?
(cc) Photo by mwin - http://www.flickr.com/photos/wingler/3429634150
sábado 18 de febrero de 12
24. Pero... ¿NoSQL?
(cc) Photo by mwin - http://www.flickr.com/photos/wingler/3429634150
sábado 18 de febrero de 12
25. Pero... ¿NoSQL?
NoSQL !== no SQL
Not only SQL
(cc) Photo by mwin - http://www.flickr.com/photos/wingler/3429634150
sábado 18 de febrero de 12
26. NoSQL: ACID vs BASE
Atomicity, Basically
Available,
Consistency,
Soft state,
Isolation,
Eventual
Durability consistency
(cc) Photo by zhouxuan12345678 - http://www.flickr.com/photos/53921113@N02/5645102295/
sábado 18 de febrero de 12
27. Tipos.
orientadas a Columna orientadas a Documento
Key-value orientadas a Grafos
sábado 18 de febrero de 12
28. ¿Por qué MongoDB?
Orientada a documento
Almacenados en Colecciones
(bajo una clave)
Los documentos pueden ser heterogéneos
Formatos textuales: JSON & BSON
(cc) Photo by Ampersand Duck - http://www.flickr.com/photos/ampersandduck/4941185476
sábado 18 de febrero de 12
29. MongoDB
Escrita en C++
Orientada a documento
Formato JSON (o BSON)
Un poco SQL (queries, índices, Referencias
externas)
Particionado horizontal (sharding)
Consultas Javascript
(cc) Photo by Ampersand Duck - http://www.flickr.com/photos/ampersandduck/4941185476
sábado 18 de febrero de 12
31. Orientadas a Documento
Documentos formateados en JSON
{ "_id" : "224000999",
"_class" : "com.vts.model.Vessel",
"flag" : "ALBANIA",
"name" : "Sample NOT_AVAILABLE Vessel 224000999",
"callsign" : "SV224000999",
"toBow" : 25,
"toStern" : 5,
"toPort" : 5,
"toStarboard" : 5,
"comments" : "Sample vessel created automatically for test purposes"
}
sábado 18 de febrero de 12
32. El API
Consola y API JavaScript:
sábado 18 de febrero de 12
33. El API
Consola y API JavaScript:
beleriand:bin dgomez$ ./mongo
MongoDB shell version: 1.8.1
connecting to: test
>
sábado 18 de febrero de 12
34. El API
Consola y API JavaScript:
beleriand:bin dgomez$ ./mongo
MongoDB shell version: 1.8.1
connecting to: test
> use vts
switched to db vts
>
sábado 18 de febrero de 12
35. El API
Consola y API JavaScript:
beleriand:bin dgomez$ ./mongo
MongoDB shell version: 1.8.1
connecting to: test
> use vts
switched to db vts
> show collections
>
Event
WeatherData
system.indexes
vessel
>
sábado 18 de febrero de 12
36. El API
Consola y API JavaScript:
beleriand:bin dgomez$ ./mongo
MongoDB shell version: 1.8.1
connecting to: test
> use vts
switched to db vts
> show collections
>
Event
WeatherData
system.indexes
vessel
> db.Event.find()
>
{ "_id" : ObjectId("4e0b5b211446446f6be3bb1a"), "_class" :
"com.vts.model.events.SystemEvent", "timestamp" :
ISODate("2011-06-29T17:04:33.039Z") }
{ "_id" : ObjectId("4e0b5b3d144676f49946443f"), "_class" :
"com.vts.model.events.SystemEvent", "timestamp" :
ISODate("2011-06-29T17:05:01.394Z") }
>
sábado 18 de febrero de 12
37. El API
Consola y API JavaScript:
sábado 18 de febrero de 12
38. El API
Consola y API JavaScript:
> show collections
Event
WeatherData
system.indexes
vessel
>
sábado 18 de febrero de 12
39. El API
Consola y API JavaScript:
> show collections
Event
WeatherData
system.indexes
vessel
> db.alarms.save({"type" : "speed", "severity" : "warn", "vesselSSID" :
>
"224000999"})
>
sábado 18 de febrero de 12
40. El API
Consola y API JavaScript:
> show collections
Event
WeatherData
system.indexes
vessel
> db.alarms.save({"type" : "speed", "severity" : "warn", "vesselSSID" :
>
"224000999"})
> show collections
>
Event
WeatherData
alarms
system.indexes
vessel
>
sábado 18 de febrero de 12
41. El API
Consola y API JavaScript:
> show collections
Event
WeatherData
system.indexes
vessel
> db.alarms.save({"type" : "speed", "severity" : "warn", "vesselSSID" :
>
"224000999"})
> show collections
>
Event
WeatherData
alarms
system.indexes
vessel
> db.alarms.find()
>
{ "_id" : ObjectId("4f3acca3ed4cc8078fd1a4be"), "type" : "speed", "severity" :
"warn", "vesselSSID" : "224000999" }
>
sábado 18 de febrero de 12
42. Documentos
Identificados por un “_id” (generado o asignado)
Textual (JSON)
Binario (BSON)*
Documentos grandes divididos en
chunks
sábado 18 de febrero de 12
43. Programación de clientes
Multitud de lenguajes (drivers)
Transformación a JSON realizada por el driver
sábado 18 de febrero de 12
44. Programación de clientes
Multitud de lenguajes (drivers)
Transformación a JSON realizada por el driver
{ "_id" : "224000999",
"flag" : "ALBANIA",
"name" : "Sample NOT_AVAILABLE Vessel 224000999",
"callsign" : "SV224000999",
"toBow" : 25,
"toStern" : 5,
"toPort" : 5,
"toStarboard" : 5,
"comments" : "Sample vessel created automatically for test purposes" }
sample.py
sábado 18 de febrero de 12
45. Programación de clientes
Multitud de lenguajes (drivers)
Transformación a JSON realizada por el driver
{ "_id" : "224000999",
{ "_id" => "224000999",
"flag""flag" => "ALBANIA",
: "ALBANIA",
"name""name" => "Sample NOT_AVAILABLE 224000999",
: "Sample NOT_AVAILABLE Vessel Vessel 224000999",
"callsign" : "SV224000999",
"callsign" => "SV224000999",
"toBow" : 25, => 25,
"toBow"
"toStern" : 5, => 5,
"toStern"
"toPort" : 5, => 5,
"toPort"
"toStarboard" : 5, => 5,
"toStarboard"
"comments" : "Sample"Sample createdcreated automatically for test purposes" }
"comments" => vessel vessel automatically for test purposes" }
sample.py Ruby
sábado 18 de febrero de 12
46. Programación de clientes
Multitud de lenguajes (drivers)
Transformación a JSON realizada por el driver
{ "_id" : "224000999",
{ "_id" => "224000999", "224000999",
array( "_id" =>
"flag""flag" "flag" => "ALBANIA",
: "ALBANIA",
=> "ALBANIA",
"name""name" "name" => "Sample NOT_AVAILABLE Vessel 224000999",
: "Sample"Sample NOT_AVAILABLE 224000999",
=> NOT_AVAILABLE Vessel Vessel 224000999",
"callsign" : "callsign" => "SV224000999",
"callsign" => "SV224000999",
"SV224000999",
"toBow" : 25, => 25, => 25,
"toBow""toBow"
"toStern" : 5, => 5, => 5,
"toStern"
"toStern"
"toPort" : 5, => 5, => 5,
"toPort"
"toPort"
"toStarboard" : 5, => 5, => 5,
"toStarboard"
"toStarboard"
"comments" : "comments" => "Sample vessel created automatically for test purposes"}
"comments" => "Sample createdcreated automatically for test purposes" }
"Sample vessel vessel automatically for test purposes" }
sample.py sample.php
Ruby
sábado 18 de febrero de 12
47. Programación de clientes
Multitud de lenguajes (drivers)
Transformación a JSON realizada por el driver
BasicDBObject doc = new BasicDBObject();
{ "_id" : "224000999",
{ "_id" => "224000999", "224000999",
array( "_id" => doc.put("flag", vessel.getFlag());
"flag""flag" "flag" => "ALBANIA",
: "ALBANIA",
=> "ALBANIA",doc.put("name", vessel.getName());
"name""name" "name" => "Sample NOT_AVAILABLE Vessel 224000999",
: "Sample"Sample NOT_AVAILABLE 224000999",
=> NOT_AVAILABLE Vessel Vessel 224000999",
doc.put("callsign", vessel.getCalSign());
"callsign" : "callsign" => "SV224000999",
"callsign" => "SV224000999",
"SV224000999",
doc.put("toBow", vessel.getBow());
"toBow" : 25, => 25, => 25,
"toBow""toBow"
"toStern" : 5, => 5, => 5,
"toStern"
"toStern" doc.put("toPort", vessel.getStern());
"toPort" : 5, => 5, => 5,
"toPort"
"toPort" doc.put("toStern", vessel.getPort());
"toStarboard" : 5, => 5, doc.put("toStartboard", vessel.getStarboard());
"toStarboard"
"toStarboard" => 5,
"comments" : "comments" => doc.put("comments", vessel.getComments()); purposes"}
"comments" => "Sample createdcreated automatically for test purposes" }
"Sample vessel vessel vessel created automatically for test
"Sample automatically for test purposes" }
sample.py sample.php
Ruby
sample.java
sábado 18 de febrero de 12
49. 1. Obtener el Driver
Importar el driver
sábado 18 de febrero de 12
50. 1. Obtener el Driver
Importar el driver
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</
artifactId>
<version>2.7.0-rc1</version>
</dependency>
sábado 18 de febrero de 12
51. 2. Conexión
Obtener la referencia a la BD y la conexión
sábado 18 de febrero de 12
52. 2. Conexión
Obtener la referencia a la BD y la conexión
Mongo m = new Mongo( "127.0.0.1" , 27017 );
DB db = m.getDB( "playground" );
sábado 18 de febrero de 12
53. 3. Inserciones
Crear e insertar un objeto
sábado 18 de febrero de 12
54. 3. Inserciones
Crear e insertar un objeto
BasicDBObject doc = new BasicDBObject();
doc.put("flag", vessel.getFlag());
doc.put("name", vessel.getName());
doc.put("callsign", vessel.getCalSign());
doc.put("toBow", vessel.getBow());
doc.put("toPort", vessel.getStern());
doc.put("toStern", vessel.getPort());
doc.put("toStartboard", vessel.getStarboard());
doc.put("comments", vessel.getComments());
DBCollection coll = db.getCollection("vessel");
coll.insert(doc);
sábado 18 de febrero de 12
55. 4. Consultas (I)
Obtener todos los documentos de una colección
sábado 18 de febrero de 12
56. 4. Consultas (I)
Obtener todos los documentos de una colección
DBCollection vessels = db.getCollection("vessel");
DBCursor cursor = vessels.find();
List<Vessel> vessels = new ArrayList<>();
while (cursor.hasNext()) {
DBObject jsonVessel = cursor.next();
Vessel vessel = new Vessel();
vessel.setMmsi(jsonVessel.get(“mmsi”));
vessel.setLength(jsonVessel.get(“length”));
// ...
vessels.add(vessel);
}
sábado 18 de febrero de 12
57. 4. Consultas (I)
Obtener todos los documentos de una colección
DBCollection vessels = db.getCollection("vessel");
DBCursor cursor = vessels.find();
List<Vessel> vessels = new ArrayList<>();
while (cursor.hasNext()) { class DBCollection {
public abstract
DBObject jsonVessel = cursor.next();
public final DBCursor find(){
Vessel vessel = new Vessel();
public final DBCursor find( DBObject ref )
vessel.setMmsi(jsonVessel.get(“mmsi”));
public final DBCursor find( DBObject ref , DBObject keys )
vessel.setLength(jsonVessel.get(“length”));
// ...
public final DBObject findOne( Object obj )
vessels.add(vessel); DBObject findOne( Object obj, DBObject fields )
public final
}
public DBObject findAndModify( DBObject query , DBObject update )
}
sábado 18 de febrero de 12
59. 4. Consultas (II)
Consultas “SQL-like”
En RDBMS:
SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;
Las consultas se hacen también en JSON
sábado 18 de febrero de 12
60. 4. Consultas (II)
Consultas “SQL-like”
En RDBMS:
SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;
Las consultas se hacen también en JSON
{ “flag” : “ALBANIA” }
sábado 18 de febrero de 12
61. 4. Consultas (II)
Consultas “SQL-like”
En RDBMS:
SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;
Las consultas se hacen también en JSON
{ “flag” : “ALBANIA” }
beleriand:bin dgomez$ ./mongo
MongoDB shell version: 1.8.1
connecting to: test
> use vts
switched to db vts
> db.vessel.find( { "flag" : "ALBANIA" });
{ "_id" : "224312999", "_class" : "com.vts.model.Vessel", "flag" : "ALBANIA",
"name" : "Sample TOWING Vessel 224312999", "callsign" : "SV224312999", “length”:
30, “beam” : “10”, "toBow" : 25, "toStern" : 5, "toPort" : 5, "toStarboard" : 5,
"comments" : "Sample vessel created automatically for test purposes" }
>
sábado 18 de febrero de 12
62. 4. Consultas (II)
Consultas “SQL-like”
En RDBMS:
SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;
Las consultas se hacen también en JSON
{ “flag” : “ALBANIA” }
beleriand:bin dgomez$ ./mongo
MongoDB shell version: 1.8.1
connecting to: test
> use vts
switched to db vts DBObject query = new BasicDBObject();
query.put("flag", "ALBANIA");
> db.vessel.find( { "flag" : "ALBANIA" });
{ "_id" : "224312999", "_class" : "com.vts.model.Vessel", "flag" : "ALBANIA",
DBCursor albanianShips = vessels.find(query);
"name" : "Sample TOWING Vessel 224312999", "callsign" : "SV224312999", “length”:
30, “beam” : “10”, "toBow" : 25, "toStern" : 5, "toPort" : 5, {
while (albanianShips.hasNext()) "toStarboard" : 5,
// ...
"comments" : "Sample vessel created automatically for test purposes" }
> }
sábado 18 de febrero de 12
64. Operadores de consulta
Otros operadores
$all
$and
$exists
$gt
$in
$lt
$mod
$ne
$nin
$nor
$or
$size
$type
sábado 18 de febrero de 12
65. Consultas complejas
Concatenación de consultas
RDBMS:
sábado 18 de febrero de 12
66. Consultas complejas
Concatenación de consultas
SELECT * FROM VESSELS WHERE length < 90 AND length > 30
RDBMS: AND (flag = “ALBANIA” or flag = ”SAN MARINO”);
sábado 18 de febrero de 12
67. Consultas complejas
Concatenación de consultas
SELECT * FROM VESSELS WHERE length < 90 AND length > 30
RDBMS: AND (flag = “ALBANIA” or flag = ”SAN MARINO”);
{
“length” : { $lt : 90, $gt : 30},
Mongo: $or : [
{ “flag” : “ALBANIA”},
{ “flag” : “SAN MARINO”} ]
}
sábado 18 de febrero de 12
68. Consultas complejas
Concatenación de consultas
SELECT * FROM VESSELS WHERE length < 90 AND length > 30
RDBMS: AND (flag = “ALBANIA” or flag = ”SAN MARINO”);
{
“length” : { $lt : 90, $gt : 30},
Mongo: $or : [
{ “flag” : “ALBANIA”},
{ “flag” : “SAN MARINO”} ]
}
DBObject query = new BasicDBObject();
DBObject condition = new BasicDBObject("$lt",90);
condition.put("$gt",30);
query.put("length", condition);
DBObject [] flags = {
Mongo new BasicDBObject("flag", "ALBANIA"),
new BasicDBObject("flag", "SAN MARINO")
};
Driver: query.put("$or", flags);
talks.find(query);
sábado 18 de febrero de 12
73. Spring Data
Objetivo:
Proporcionar un mecanismo homogéneo y
completo para el acceso a BD NoSQL
Multiples proyectos:
Soportados:
MongoDB, Redis, Neo4j, Hadoop, GemFire,
RiaK
En proceso:
CouchDB, Hbase, Cassandra
sábado 18 de febrero de 12
74. Spring Data y MongoDB
XML namespace para configurar driver Mongo
MongoTemplate
Conversión de excepciones automática
Conversión Configurable
JMX monitoring
sábado 18 de febrero de 12
76. Importando Spring Data
<repository>
<id>spring-release</id>
<name>Spring Maven Release Repository</name>
<url>http://repo.springsource.org/libs-release</url>
</repository>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.0.1.RELEASE</version>
</dependency>
sábado 18 de febrero de 12
81. MongoTemplate
<bean
id="mongoTemplate"
class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-‐arg
name="mongoDbFactory"
ref="mongoDbFactory"
/>
</bean>
Identifica la colección
Convierte query a JSON
Convierte respuesta (“_class”)
Gestiona las conexiones y cursores
Convierte las excepciones
sábado 18 de febrero de 12
83. MongoTemplate - Consultas
public class MongoTemplate implements MongoOperations, ApplicationContextAware {
public <T> T findOne(Query query, Class<T> entityClass)
public <T> List<T> find(Query query, Class<T> entityClass)
public <T> T findById(Object id, Class<T> entityClass)
public <T> List<T> findAll(Class<T> entityClass)
}
sábado 18 de febrero de 12
84. MongoTemplate - Consultas
public class MongoTemplate implements MongoOperations, ApplicationContextAware {
public <T> T findOne(Query query, Class<T> entityClass)
public <T> List<T> find(Query query, Class<T> entityClass)
public <T> T findById(Object id, Class<T> entityClass)
public <T> List<T> findAll(Class<T> entityClass)
}
public <T> T findOne(Query query, Class<T> entityClass, String collectionName)
....
sábado 18 de febrero de 12
85. Consultas
Consultas “SQL-like”
RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;
sábado 18 de febrero de 12
86. Consultas
Consultas “SQL-like”
RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;
Las consultas se hacen también en JSON
Mongo: { “flag” : “ALBANIA” }
sábado 18 de febrero de 12
87. Consultas
Consultas “SQL-like”
RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;
Las consultas se hacen también en JSON
Mongo: { “flag” : “ALBANIA” }
DBCollection vessels = db.getCollection("vessel");
DBObject query = new BasicDBObject();
query.put("flag", "ALBANIA");
Mongo DBCursor albanianShips = vessels.find(query);
while (albanianShips.hasNext()) {
Driver: DBObject result = albanianShips.next();
// Create Vessel object from DBObject
}
sábado 18 de febrero de 12
88. Consultas
Consultas “SQL-like”
RDBMS: SELECT * FROM VESSEL WHERE FLAG = “ALBANIA”;
Las consultas se hacen también en JSON
Mongo: { “flag” : “ALBANIA” }
Query query = new Query(Criteria.where("flag").is("ALBANIA");
List<Vessel> vessels = mongoTemplate.find(query, Vessel.class);
Utilizado para
Identificación de la colección
Serialización JSON
sábado 18 de febrero de 12
92. Consultas complejas
Concatenación de consultas
SELECT * FROM VESSELS WHERE length < 90 AND length > 30
ORDER BY lastUpdate;
sábado 18 de febrero de 12
93. Consultas complejas
Concatenación de consultas
SELECT * FROM VESSELS WHERE length < 90 AND length > 30
ORDER BY lastUpdate;
{
“length” : { $lt : 90, $gt : 30}
}
sábado 18 de febrero de 12
94. Consultas complejas
Concatenación de consultas
SELECT * FROM VESSELS WHERE length < 90 AND length > 30
ORDER BY lastUpdate;
{
“length” : { $lt : 90, $gt : 30}
}
DBObject query = new BasicDBObject();
DBObject condition = new BasicDBObject("$lt",90);
condition.put("$gt",30);
query.put("length", condition);
DBObject [] flags = {
new BasicDBObject("flag", "ALBANIA"),
new BasicDBObject("flag", "SAN MARINO")
};
query.put("$or", flags);
vessels.find(query);
sábado 18 de febrero de 12
95. Consultas complejas
Concatenación de consultas
SELECT * FROM VESSELS WHERE length < 90 AND length > 30
ORDER BY lastUpdate;
{
“length” : { $lt : 90, $gt : 30}
}
sábado 18 de febrero de 12
96. Consultas complejas
Concatenación de consultas
SELECT * FROM VESSELS WHERE length < 90 AND length > 30
ORDER BY lastUpdate;
{
“length” : { $lt : 90, $gt : 30}
}
Criteria criteria = Criteria.where("length");
criteria.gte(from);
criteria.lte(to);
Query query = new Query(criteria);
query.sort().on("lastUpdate", Order.ASCENDING);
List<Vessel> vessels = mongoTemplate.find(query, Vessel.class);
sábado 18 de febrero de 12
98. MongoTemplate - inserciones
public class MongoTemplate implements MongoOperations, ApplicationContextAware {
public void save(Object objectToSave)
public void save(Object objectToSave, String collectionName)
}
sábado 18 de febrero de 12
100. AbstractRepository
public abstract class AbstractMongoRepository<T> {
@Inject
protected MongoTemplate mongoTemplate;
/** Clase que utiliza Mongo para identificar el nombre de la coleccion */
private Class<T> persistentClass;
protected AbstractService(Class<T> persistentClass) {
this.persistentClass = persistentClass;
}
public String determineCollection() {
return persistentClass.getSimpleName();
}
}
sábado 18 de febrero de 12
102. AbstractRepository
public abstract class AbstractMongoRepository<T> {
public void save(T e) {
mongoTemplate.save(e, determineCollection());
}
public void save(Collection<T> entities) {
for (T e : entities) {
save(e);
}
}
public void removeById(String id) {
Object e = findById(id);
if (e != null) {
mongoTemplate.remove(e, determineCollection());
}
}
public T findById(String id) {
T t = mongoTemplate.findById(id, persistentClass);
if (t == null) {
throw new ObjectNotFoundException(persistentClass, id);
}
return t;
}
}
sábado 18 de febrero de 12
104. VesselRepository
public class VesselRepository extends AbstractMongoRepository<Vessel> {
public VesselRepository() {
super(Vessel.class);
}
}
sábado 18 de febrero de 12
106. El caso de BitSet
Cuidado con los campos transient
sábado 18 de febrero de 12
107. El caso de BitSet
Cuidado con los campos transient
public class BitSet implements Cloneable, java.io.Serializable {
/** The internal field corresponding to the serialField "bits". */
*/
private long[] words;
/** The number of words in the logical size of this Bitset */
private transient int wordsInUse = 0;
private void expandTo(int wordIndex) {
int wordsRequired = wordIndex+1;
if (wordsInUse < wordsRequired) {
ensureCapacity(wordsRequired);
wordsInUse = wordsRequired;
}
}
}
sábado 18 de febrero de 12
109. Conversión Manual
public
class
BitSetReadConverter
implements
Converter<DBObject,
BitSet>
{
@Override
public
BitSet
convert(DBObject
source)
{
BasicDBList
words
=
(BasicDBList)source.get("words");
BitSet
bitset
=
new
BitSet();
int
index
=
0;
for
(Object
word
:
words)
{
long
value
=
(Long)word;
while
(value
!=
0L)
{
if
((value
&
1L)
!=
0)
{
bitset.set(index);
}
++index;
value
=
value
>>>
1;
}
}
return
bitset;
}
}
sábado 18 de febrero de 12
110. Conversión Manual
Porque a veces lo automático no funciona
sábado 18 de febrero de 12
111. Conversión Manual
Porque a veces lo automático no funciona
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="mongoTemplate"
class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mongoConverter" ref="mappingConverter" />
</bean>
<mongo:db-factory dbname="vts"/>
<mongo:mapping-converter>
<mongo:custom-converters>
<mongo:converter>
<bean class="com.vts.db.BitSetReadConverter"/>
</mongo:converter>
</mongo:custom-converters>
</mongo:mapping-converter>
</beans>
sábado 18 de febrero de 12
116. Queries con multiples valores
Query query = new Query(
Criteria
.where("length").gte(20).lte(60));
sábado 18 de febrero de 12
117. Queries con multiples valores
Query query = new Query(
Criteria
.where("length").gte(20).lte(60));
DEBUG MongoTemplate - find using query: { "toBow" : { "$gte" : 20 , "$lte" : 60} }
sábado 18 de febrero de 12
118. Conclusiones
Reducción del número de tablas (87x2 vs 5)
Optimización en el rendimiento de escrituras
Simplificación de los DAOs con Spring-Data
Otras ventajas:
Documentos en formato de Respuesta REST
interfaz Javascript en la consola
sábado 18 de febrero de 12
119. Q&A
David Gómez
@dgomezg
sábado 18 de febrero de 12