SlideShare a Scribd company logo
1 of 39
Download to read offline
Dessì Massimiliano

SpringFramework Meeting 12 settembre 2009 Cagliari
Author
    Software Architect and Engineer
        ProNetics / Sourcesense

              Presidente
          JugSardegna Onlus

        Fondatore e coordinatore
  SpringFramework Italian User Group

             Committer
        OpenNMS - MagicBox

                 Autore
Spring 2.5 Aspect Oriented Programming
Abbiamo ancora bisogno di un RDBMS ?
Dipende
Neo4j    Sesame
                    FreeBase                      Hypertable
Graph databases
                  DirectedEdge          Cassandra     BigTable
 AllegroGraph
                                                      HBase
                    MongoDB         CouchDB
                       Document databases ThruDB
                  JackRabbit  Voldemort


 Scalaris Dynomite       TokioCabinet
 Distributed key-value stores                         Hadoop
                                         Skynet
 Ringo      MemcacheDB                            MapReduce
                                              Disco
BigTable, Google 2006
               http://labs.google.com/papers/bigtable.html


                 Le colonne non sono predefinite

Le righe possono esser aggiunte con qualsiasi numero di colonne

             Le colonne vuote non vengono salvate




 Adatto alle applicazioni dove gli attributi degli oggetti non sono
             conosciute o cambiano frequentemente
Graph database


     Le relazioni tra gli item sono la caratteristica principale

              Modello dei dati molto interconnesso



  Adatto se nelle applicazioni avete delle lunghe catene di join,
molte relazioni many to many e i dati sono già sotto una forma di
                        grafo (social net..).
 I graph database sono spesso associati al web semantico e ai
                          datastore RDF.
MapReduce, Google 2004
          http://labs.google.com/papers/mapreduce.html



Lavori batch di grandi moli di dati senza preoccuparsi della
                        infrastruttura.
         ●Automatic parallelization and distribution

                      ● Fault-tolerance

                      ● I/O scheduling

                  ● Status and monitoring




Adatto alle applicazioni dove si processando molti dati in
                     processi batch.
Distributed key-value store

I database distribuiti partizionano e replicano i dati in maniera
      trasparente i dati su molte macchine in un cluster.
   I dati possono non essere immediatamente consistenti.

                         La scelta è tra:
            ● Bassa latenza (velocità per req-res)

              ● Alto throughput (processi batch)




   Adatti ad applicazioni dove i dati sono indipendenti e la
disponibilità e performance dei dati sono più importanti delle
                     caratteristiche ACID.
Document database
                   Gli item sono dei Documenti
 Non sono permesse joins e transactions spalmate su più righe o
                              documenti.
Un documento è formato da valori o liste in formato JSON o XML e
         viene lavorato sulla struttura di un documento.
 Estrazione, indicizzazione aggregazione e filtraggio sono basati
              sugli attributi contenuti nel documento




 Adatto alle applicazioni dove i dati sono indipendenti tra loro e
                     non sono richieste join.
MongoDB
                http://www.mongodb.org
                    DocumentDB
                       Veloce
                    Schema Free
                  Query dinamiche
                   Query Profiling
     Dati sono salvati in formato binario BSON
 Dati organizzati in Documenti o Collezioni in JSON
Efficiente salvataggio di contenuti binari anche grandi
MongoDB

              Full index support
      Replication and fail-over support
   Auto-sharding for cloud-level scalability
Caratteristiche di un key-value e di un RDBMS
                Alta scalabilità
           Supporto commerciale




        p.s. Possiamo fare il dump :-)
Adatto

      Siti web
High volume, low data
   Alta scalabilita
Dati in formato JSON
      Caching
      Logging
  Analisi real-time
Non Adatto


Sistemi altamente transazionali
Traditional Business Intelligence
Problemi che richiedono il SQL
Documento != Stringa


In prima istanza si potrebbe pensare di avere un Document DB
       salvando stringhe dentro le righe di un RDBMS.
 Un Document DB nasce invece sul concetto di documento e
collezione, non di righe e colonne, infatti il modo di salvare e di
              recuperare le informazioni è diverso
Document struttura JSON
{ "_id" : "027b6e279578a64aa0684700" , "address-city" : "Ca" ,
"address-zipCode" : "09100" , "address-province" : "CA" ,
"address-region" : "Sardegna" , "address-country" : "Campidano" ,
"address-streetName" : "V.le Europe" , "address-streetNumber" : "4" ,
"telephone-contactMobile" : "3391234556" ,
"telephone-contactTelephoneHome" : "070123456" ,
"telephone-contactTelephoneWork" : "070987654" ,
"telephone-contactAcceptSms" : true ,
"userInfo-dateOfBirth" : "2009-09-08T15:30:30Z" ,
"userInfo-email" : "max@gmail.com" , "userInfo-name" : "Paperino" ,
"userInfo-surname" : "Paolino" , "userInfo-sensibleData" : "no sensible data" ,
"id" : "d37m3051128" , "description" : "descr" , "groupId" : "15" ,
"centerId" : "centerThree" , "_ns" : "centerUser"}
Schema Free

In un RDBMS la struttura dei dati è vincolata allo schema in cui
 definiamo tabelle con le colonne per meglio relazionare i dati.
In MongoDB lo “schema” viene definito dai dati quando vengono
                            salvati.
 Raggruppiamo le entità della nostra applicazione in collezioni
                      (Users, Centers...).
Document

   Le informazioni possono essere embedded o referenziate.
  Ovviamente la soluzione embedded è più veloce non avendo
  bisogno di caricare altri dati come farebbe una join con il SQL.
Automaticamente ogni Document ha un campo _id per identificarlo
                          univocamente.
Atomicità

Il motivo principale della mancanza delle transazioni è la lentezza
             e il costo dei lock in ambienti distribuiti.
   Non essendoci le transazioni che coinvolgono più dati, qui
 abbiamo atomicità a livello di singolo documento con i seguenti
                             comandi:
     $set    $inc $push $pushAll $pull $pullAll
Mongo Driver

Mongo può essere utilizzato con i linguaggi più diffusi:


Java (Groovy, Scala, JRuby), PHP, Ruby, C++, Python,
       Perl, C#, Erlang, Javascript server side.
      Ogni driver predispone i nostri oggetti ad
              essere utilizzati in Mongo.
Collection
  I nostri item (Document) sono salvati dentro delle Collection
  che possiamo vedere come i corrispettivi delle tabelle in un
                             RDBMS.
Una collection viene creata effettivamente quando un document
                  viene salvato al suo interno.

 public void createCollectionCenters(Mongo mongo) {
      NoCenter center = new NoCenter();
      DBCollection collectionCenters = mongo.getCollection("centers");
      collectionCenters.insert(new BasicDBObject(center.toMap()));
  }
Mongo Java Driver

Per essere salvati o letti i nostri oggetti devono essere “traslati”
in oggetti com.mongodb.DBObject, per fare questo ci sono due
                           alternative:
             Implementare l' interfaccia DBObject

              Utilizzare un BasicDBObjectBuilder
Mongo Java Driver
Se la nostra MyClass implementa l' interfaccia DBObject
         assegneremo i valori in questo modo.


      MyClass myObj= new MyClass();
      myObj.put("user", userId);
      myObj.put("message", msg);
      myObj.put("date", new Date());
      ...
      collection.insert(myObj);
Mongo Java Driver
     Utilizzando BasicDBObjectBuilder


collection.insert(
     BasicDBObjectBuilder.start()
     .add("user", myObj.getId())
     .add("user", myObj.getUser())
     .add("date", new Date())
     .....
     .get();
);
Mongo Java Driver
Una terza alternativa, più pratica consiste nel passare al Builder la
         mappa con i valori contenuti nel nostro oggetto.
   BasicDBObjectBuilder.start(myObj.toMap()).get();
  Dobbiamo semplicemente aggiungere agli oggetti della nostra
   applicazione una rappresentazione sotto forma di Map e un
      costruttore con un Map per ricostruirli da un DBObject

          public class MyClass{

               public MyClass(Map map){...}

               public Map toMap(){..}
          }
Concorrenza Web App

 Nel caso di WebApp dove si hanno pesanti carichi in scrittura, è
    oppurtuno per avere consistenza nella sessione di lavoro
   (HttpRequest), eseguire il lavoro come mostrato nel codice,
magari usando l' AOP con un before advice dove chiamare lo start
            e un after advice dove chiamare il done.


                 Mongo dataStore;
                 dataStore.requestStart();

                 //your code

                 dataStore.requestDone();
Interrogazioni

Le query di ricerca vengono fatte costruendo i parametri di ricerca
                      tramite un DBObject.
        Possiamo anche paginare il risultato della query.
        List<DBObject> objects =
           collection.find(
              BasicDBObjectBuilder.start().
                 add("userInfo-surname", surname).
                 add("centerId", centerId).get()
           ).
           skip(offset * page).limit(offset).toArray();
Interrogazioni
  Numero documenti in una collezione




collection.find(
   BasicDBObjectBuilder.start()
   .add("centerId",centerId).get()
).length();
Interrogazioni
Se vogliamo recuperare solo alcuni campi del documento (Select
  SQL), costruiamo un DBObject con quei campi e utilizziamo il
      find che accetta due DBObject (query, campi richiesti).
         Il DBCursor è il corrispondente del ResultSet jdbc.




DBCursor cursor = coll.find(
   BasicDBObjectBuilder.start().add("centerId", centerId).get(),
   BasicDBObjectBuilder.start().add("userInfo-email", "").get()
);
Interrogazioni

                        Con espressioni regolari



String pattern = new StringBuilder().append(character).append("*").toString();
List<DBObject> objects = coll.find(BasicDBObjectBuilder.start()
                  .add("userInfo-surname",
                        java.util.regex.Pattern.compile(pattern))
                  .get()).toArray();
Interrogazioni avanzate
    Nelle query abbiamo a disposizione anche :


<, <=, >, >=, $ne, $in, $nin, $mod, $all, $size, $exists



                 Valori dentro Array
         Valori dentro un oggetto embedded
        Full language expressions con $where

     limit(), skip(), snapshot(), count(), group()
Insert


public String insertCenterUser(CenterUser user) {
    Map fields = user.toMap();
    fields.put("id", IdGenerator.getUniqueId());//CustomId
    DBObject obj = coll.insert(BasicDBObjectBuilder.start(fields).get());
    return obj != null ? obj.get("id").toString() : Constants.ID_NEW;
}
Update
public int updateCenterUser(CenterUser user) {

      DBObject obj = coll.update(
                   BasicDBObjectBuilder.start().
                      add("id",user.getEntity().getId()).get(),
                   BasicDBObjectBuilder.start(user.toMap()).get(),
                   false,
                   false
               );
      return obj != null ? 1 : 0;
}
Upsert
                 Update if present insert is missing


public int updateCenterUser(CenterUser user) {

      DBObject obj = coll.update(
                   BasicDBObjectBuilder.start().
                      add("id",user.getEntity().getId()).get(),
                   BasicDBObjectBuilder.start(user.toMap()).get(),
                   true,
                   false
                );
      return obj != null ? 1 : 0;
}
Delete
                       Delete diretto



public void deleteCenterUser(String id, String centerId) {
    DBObject obj = coll.findOne(
         BasicDBObjectBuilder.start().
         add("id", id).
         add("centerId", centerId).get());
    coll.remove(obj);
}
Delete
                Delete utilizzando il DBcursor

public boolean deleteCenterUser(String id, String centerId) {
       DBCursor cursor = coll.find(
                          new BasicDBObject(),
                           BasicDBObjectBuilder.start()
                           .add("id", id)
                           .add("centerId", centerId).get()
                          );
       boolean result = false;
       while (cursor.hasNext()) {
           coll.remove(cursor.next());
           result = true;
       }
       return result;
}
Production Deployments
  http://www.mongodb.org/display/DOCS/Production+Deployments



    SourceForge         Mozilla Ubiquity        Disqus
               Business Insider Floxee
         Silentale      BoxedIce Defensio
TweetSaver        ShopWiki       MusicNation         Detexify
    Sluggy      Freelance        eFlyover       soliMAP

                          (Sept 2009)
Domande ?
Grazie per l'attenzione !

      Massimiliano Dessì
      desmax74 at yahoo.it
 massimiliano.dessi at pronetics.it
                     http://twitter.com/desmax74
                      http://jroller.com/desmax
               http://www.linkedin.com/in/desmax74
      http://wiki.java.net/bin/view/People/MassimilianoDessi
 http://www.jugsardegna.org/vqwiki/jsp/Wiki?MassimilianoDessi



                Spring Framework Italian User Group
      http://it.groups.yahoo.com/group/SpringFramework-it

More Related Content

What's hot

Creating Highly-Available MongoDB Microservices with Docker Containers and Ku...
Creating Highly-Available MongoDB Microservices with Docker Containers and Ku...Creating Highly-Available MongoDB Microservices with Docker Containers and Ku...
Creating Highly-Available MongoDB Microservices with Docker Containers and Ku...MongoDB
 
Back to Basics, webinar 1: Introduzione a NoSQL
Back to Basics, webinar 1: Introduzione a NoSQLBack to Basics, webinar 1: Introduzione a NoSQL
Back to Basics, webinar 1: Introduzione a NoSQLMongoDB
 
Presentazione Tesi Marco Ventura
Presentazione Tesi Marco VenturaPresentazione Tesi Marco Ventura
Presentazione Tesi Marco Venturaguest335584
 
Back to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizioBack to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizioMongoDB
 
Corso Iphone in 48h (parte 2)
Corso Iphone in 48h (parte 2)Corso Iphone in 48h (parte 2)
Corso Iphone in 48h (parte 2)FLT.lab
 
Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...
Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...
Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...azuredayit
 
Community Tour 2009 Windows Azure Overview
Community Tour 2009 Windows Azure OverviewCommunity Tour 2009 Windows Azure Overview
Community Tour 2009 Windows Azure OverviewFabio Cozzolino
 
Webinar Italiano: Back-to-Basics: Sessione 8 - Monitoraggio e Performance Tuning
Webinar Italiano: Back-to-Basics: Sessione 8 - Monitoraggio e Performance TuningWebinar Italiano: Back-to-Basics: Sessione 8 - Monitoraggio e Performance Tuning
Webinar Italiano: Back-to-Basics: Sessione 8 - Monitoraggio e Performance TuningMongoDB
 
2014 it - app dev series - 04 - indicizzazione
2014   it - app dev series - 04 - indicizzazione2014   it - app dev series - 04 - indicizzazione
2014 it - app dev series - 04 - indicizzazioneMongoDB
 
E suap - tecnologie client
E suap - tecnologie client E suap - tecnologie client
E suap - tecnologie client Sabino Labarile
 
Sviluppare per Microsoft Band - Web Tiles (Preview)
Sviluppare per Microsoft Band - Web Tiles (Preview)Sviluppare per Microsoft Band - Web Tiles (Preview)
Sviluppare per Microsoft Band - Web Tiles (Preview)Massimo Bonanni
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBStefano Dindo
 

What's hot (14)

Creating Highly-Available MongoDB Microservices with Docker Containers and Ku...
Creating Highly-Available MongoDB Microservices with Docker Containers and Ku...Creating Highly-Available MongoDB Microservices with Docker Containers and Ku...
Creating Highly-Available MongoDB Microservices with Docker Containers and Ku...
 
Back to Basics, webinar 1: Introduzione a NoSQL
Back to Basics, webinar 1: Introduzione a NoSQLBack to Basics, webinar 1: Introduzione a NoSQL
Back to Basics, webinar 1: Introduzione a NoSQL
 
Ajax e jQuery
Ajax e jQueryAjax e jQuery
Ajax e jQuery
 
Ado net (versione 1 e 2)
Ado net (versione 1 e 2)Ado net (versione 1 e 2)
Ado net (versione 1 e 2)
 
Presentazione Tesi Marco Ventura
Presentazione Tesi Marco VenturaPresentazione Tesi Marco Ventura
Presentazione Tesi Marco Ventura
 
Back to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizioBack to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizio
 
Corso Iphone in 48h (parte 2)
Corso Iphone in 48h (parte 2)Corso Iphone in 48h (parte 2)
Corso Iphone in 48h (parte 2)
 
Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...
Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...
Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...
 
Community Tour 2009 Windows Azure Overview
Community Tour 2009 Windows Azure OverviewCommunity Tour 2009 Windows Azure Overview
Community Tour 2009 Windows Azure Overview
 
Webinar Italiano: Back-to-Basics: Sessione 8 - Monitoraggio e Performance Tuning
Webinar Italiano: Back-to-Basics: Sessione 8 - Monitoraggio e Performance TuningWebinar Italiano: Back-to-Basics: Sessione 8 - Monitoraggio e Performance Tuning
Webinar Italiano: Back-to-Basics: Sessione 8 - Monitoraggio e Performance Tuning
 
2014 it - app dev series - 04 - indicizzazione
2014   it - app dev series - 04 - indicizzazione2014   it - app dev series - 04 - indicizzazione
2014 it - app dev series - 04 - indicizzazione
 
E suap - tecnologie client
E suap - tecnologie client E suap - tecnologie client
E suap - tecnologie client
 
Sviluppare per Microsoft Band - Web Tiles (Preview)
Sviluppare per Microsoft Band - Web Tiles (Preview)Sviluppare per Microsoft Band - Web Tiles (Preview)
Sviluppare per Microsoft Band - Web Tiles (Preview)
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDB
 

Similar to MongoDB SpringFramework Meeting september 2009

Introduzione a google_app_engine_datastore
Introduzione a google_app_engine_datastoreIntroduzione a google_app_engine_datastore
Introduzione a google_app_engine_datastorefirenze-gtug
 
MongoDB
MongoDBMongoDB
MongoDBNaLUG
 
Big data stack tecnologico
Big data stack tecnologicoBig data stack tecnologico
Big data stack tecnologicoMassimo Romano
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateManuel Scapolan
 
Archeo foss 2012 slides 1
Archeo foss 2012 slides 1Archeo foss 2012 slides 1
Archeo foss 2012 slides 1CSP Scarl
 
Business Intelligence & Analytics
Business Intelligence & AnalyticsBusiness Intelligence & Analytics
Business Intelligence & AnalyticsDavide Mauri
 
Polyglot Persistence e Big Data: tra innovazione e difficoltà su casi reali -...
Polyglot Persistence e Big Data: tra innovazione e difficoltà su casi reali -...Polyglot Persistence e Big Data: tra innovazione e difficoltà su casi reali -...
Polyglot Persistence e Big Data: tra innovazione e difficoltà su casi reali -...Data Driven Innovation
 
Big data - stack tecnologico
Big data -  stack tecnologicoBig data -  stack tecnologico
Big data - stack tecnologicoConsulthinkspa
 
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-service
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-servicePower BI: Introduzione ai dataflow e alla preparazione dei dati self-service
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-serviceMarco Pozzan
 
M. Scannapieco - Da SDMX a RDF Data Cube Vocabulary: Integrare i Dati Statist...
M. Scannapieco - Da SDMX a RDF Data Cube Vocabulary: Integrare i Dati Statist...M. Scannapieco - Da SDMX a RDF Data Cube Vocabulary: Integrare i Dati Statist...
M. Scannapieco - Da SDMX a RDF Data Cube Vocabulary: Integrare i Dati Statist...Istituto nazionale di statistica
 
Cassandra DB - Linux Day 2019 - Catania - Italy
Cassandra DB - Linux Day 2019 - Catania - ItalyCassandra DB - Linux Day 2019 - Catania - Italy
Cassandra DB - Linux Day 2019 - Catania - ItalyFabrizio Spataro
 
Workshop paas - ECDay 23 Maggio 2012
Workshop paas - ECDay 23 Maggio 2012Workshop paas - ECDay 23 Maggio 2012
Workshop paas - ECDay 23 Maggio 2012VMEngine
 
Fabio Cecaro - WorkShop PaaS – Platform as a Services
Fabio Cecaro - WorkShop PaaS – Platform as a ServicesFabio Cecaro - WorkShop PaaS – Platform as a Services
Fabio Cecaro - WorkShop PaaS – Platform as a ServicesFondazione CUOA
 
Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRSManuel Scapolan
 

Similar to MongoDB SpringFramework Meeting september 2009 (20)

couchbase mobile
couchbase mobilecouchbase mobile
couchbase mobile
 
Introduzione a google_app_engine_datastore
Introduzione a google_app_engine_datastoreIntroduzione a google_app_engine_datastore
Introduzione a google_app_engine_datastore
 
MongoDB
MongoDBMongoDB
MongoDB
 
ORM - Introduzione
ORM - IntroduzioneORM - Introduzione
ORM - Introduzione
 
Big data stack tecnologico
Big data stack tecnologicoBig data stack tecnologico
Big data stack tecnologico
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernate
 
Appunti di big data
Appunti di big dataAppunti di big data
Appunti di big data
 
Scala e i database
Scala e i databaseScala e i database
Scala e i database
 
Linuxday2013
Linuxday2013 Linuxday2013
Linuxday2013
 
Archeo foss 2012 slides 1
Archeo foss 2012 slides 1Archeo foss 2012 slides 1
Archeo foss 2012 slides 1
 
Business Intelligence & Analytics
Business Intelligence & AnalyticsBusiness Intelligence & Analytics
Business Intelligence & Analytics
 
Polyglot Persistence e Big Data: tra innovazione e difficoltà su casi reali -...
Polyglot Persistence e Big Data: tra innovazione e difficoltà su casi reali -...Polyglot Persistence e Big Data: tra innovazione e difficoltà su casi reali -...
Polyglot Persistence e Big Data: tra innovazione e difficoltà su casi reali -...
 
Big data - stack tecnologico
Big data -  stack tecnologicoBig data -  stack tecnologico
Big data - stack tecnologico
 
NOSQL
NOSQLNOSQL
NOSQL
 
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-service
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-servicePower BI: Introduzione ai dataflow e alla preparazione dei dati self-service
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-service
 
M. Scannapieco - Da SDMX a RDF Data Cube Vocabulary: Integrare i Dati Statist...
M. Scannapieco - Da SDMX a RDF Data Cube Vocabulary: Integrare i Dati Statist...M. Scannapieco - Da SDMX a RDF Data Cube Vocabulary: Integrare i Dati Statist...
M. Scannapieco - Da SDMX a RDF Data Cube Vocabulary: Integrare i Dati Statist...
 
Cassandra DB - Linux Day 2019 - Catania - Italy
Cassandra DB - Linux Day 2019 - Catania - ItalyCassandra DB - Linux Day 2019 - Catania - Italy
Cassandra DB - Linux Day 2019 - Catania - Italy
 
Workshop paas - ECDay 23 Maggio 2012
Workshop paas - ECDay 23 Maggio 2012Workshop paas - ECDay 23 Maggio 2012
Workshop paas - ECDay 23 Maggio 2012
 
Fabio Cecaro - WorkShop PaaS – Platform as a Services
Fabio Cecaro - WorkShop PaaS – Platform as a ServicesFabio Cecaro - WorkShop PaaS – Platform as a Services
Fabio Cecaro - WorkShop PaaS – Platform as a Services
 
Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRS
 

More from Massimiliano Dessì

When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...Massimiliano Dessì
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Massimiliano Dessì
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudMassimiliano Dessì
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineMassimiliano Dessì
 
Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMMassimiliano Dessì
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Massimiliano Dessì
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCMassimiliano Dessì
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayMassimiliano Dessì
 
Why we cannot ignore functional programming
Why we cannot ignore functional programmingWhy we cannot ignore functional programming
Why we cannot ignore functional programmingMassimiliano Dessì
 
Three languages in thirty minutes
Three languages in thirty minutesThree languages in thirty minutes
Three languages in thirty minutesMassimiliano Dessì
 

More from Massimiliano Dessì (20)

Code One 2018 maven
Code One 2018   mavenCode One 2018   maven
Code One 2018 maven
 
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
 
Hacking Maven Linux day 2017
Hacking Maven Linux day 2017Hacking Maven Linux day 2017
Hacking Maven Linux day 2017
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloud
 
Docker dDessi november 2015
Docker dDessi november 2015Docker dDessi november 2015
Docker dDessi november 2015
 
Docker linuxday 2015
Docker linuxday 2015Docker linuxday 2015
Docker linuxday 2015
 
Openshift linuxday 2014
Openshift linuxday 2014Openshift linuxday 2014
Openshift linuxday 2014
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community Online
 
Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVM
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVC
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_spray
 
Why we cannot ignore functional programming
Why we cannot ignore functional programmingWhy we cannot ignore functional programming
Why we cannot ignore functional programming
 
Scala linux day 2012
Scala linux day 2012 Scala linux day 2012
Scala linux day 2012
 
Three languages in thirty minutes
Three languages in thirty minutesThree languages in thirty minutes
Three languages in thirty minutes
 
MongoDB dessi-codemotion
MongoDB dessi-codemotionMongoDB dessi-codemotion
MongoDB dessi-codemotion
 
MongoDB Webtech conference 2010
MongoDB Webtech conference 2010MongoDB Webtech conference 2010
MongoDB Webtech conference 2010
 
RESTEasy
RESTEasyRESTEasy
RESTEasy
 
Spring Roo Internals Javaday IV
Spring Roo Internals Javaday IVSpring Roo Internals Javaday IV
Spring Roo Internals Javaday IV
 

MongoDB SpringFramework Meeting september 2009

  • 1. Dessì Massimiliano SpringFramework Meeting 12 settembre 2009 Cagliari
  • 2. Author Software Architect and Engineer ProNetics / Sourcesense Presidente JugSardegna Onlus Fondatore e coordinatore SpringFramework Italian User Group Committer OpenNMS - MagicBox Autore Spring 2.5 Aspect Oriented Programming
  • 3. Abbiamo ancora bisogno di un RDBMS ?
  • 5. Neo4j Sesame FreeBase Hypertable Graph databases DirectedEdge Cassandra BigTable AllegroGraph HBase MongoDB CouchDB Document databases ThruDB JackRabbit Voldemort Scalaris Dynomite TokioCabinet Distributed key-value stores Hadoop Skynet Ringo MemcacheDB MapReduce Disco
  • 6. BigTable, Google 2006 http://labs.google.com/papers/bigtable.html Le colonne non sono predefinite Le righe possono esser aggiunte con qualsiasi numero di colonne Le colonne vuote non vengono salvate Adatto alle applicazioni dove gli attributi degli oggetti non sono conosciute o cambiano frequentemente
  • 7. Graph database Le relazioni tra gli item sono la caratteristica principale Modello dei dati molto interconnesso Adatto se nelle applicazioni avete delle lunghe catene di join, molte relazioni many to many e i dati sono già sotto una forma di grafo (social net..). I graph database sono spesso associati al web semantico e ai datastore RDF.
  • 8. MapReduce, Google 2004 http://labs.google.com/papers/mapreduce.html Lavori batch di grandi moli di dati senza preoccuparsi della infrastruttura. ●Automatic parallelization and distribution ● Fault-tolerance ● I/O scheduling ● Status and monitoring Adatto alle applicazioni dove si processando molti dati in processi batch.
  • 9. Distributed key-value store I database distribuiti partizionano e replicano i dati in maniera trasparente i dati su molte macchine in un cluster. I dati possono non essere immediatamente consistenti. La scelta è tra: ● Bassa latenza (velocità per req-res) ● Alto throughput (processi batch) Adatti ad applicazioni dove i dati sono indipendenti e la disponibilità e performance dei dati sono più importanti delle caratteristiche ACID.
  • 10. Document database Gli item sono dei Documenti Non sono permesse joins e transactions spalmate su più righe o documenti. Un documento è formato da valori o liste in formato JSON o XML e viene lavorato sulla struttura di un documento. Estrazione, indicizzazione aggregazione e filtraggio sono basati sugli attributi contenuti nel documento Adatto alle applicazioni dove i dati sono indipendenti tra loro e non sono richieste join.
  • 11. MongoDB http://www.mongodb.org DocumentDB Veloce Schema Free Query dinamiche Query Profiling Dati sono salvati in formato binario BSON Dati organizzati in Documenti o Collezioni in JSON Efficiente salvataggio di contenuti binari anche grandi
  • 12. MongoDB Full index support Replication and fail-over support Auto-sharding for cloud-level scalability Caratteristiche di un key-value e di un RDBMS Alta scalabilità Supporto commerciale p.s. Possiamo fare il dump :-)
  • 13. Adatto Siti web High volume, low data Alta scalabilita Dati in formato JSON Caching Logging Analisi real-time
  • 14. Non Adatto Sistemi altamente transazionali Traditional Business Intelligence Problemi che richiedono il SQL
  • 15. Documento != Stringa In prima istanza si potrebbe pensare di avere un Document DB salvando stringhe dentro le righe di un RDBMS. Un Document DB nasce invece sul concetto di documento e collezione, non di righe e colonne, infatti il modo di salvare e di recuperare le informazioni è diverso
  • 16. Document struttura JSON { "_id" : "027b6e279578a64aa0684700" , "address-city" : "Ca" , "address-zipCode" : "09100" , "address-province" : "CA" , "address-region" : "Sardegna" , "address-country" : "Campidano" , "address-streetName" : "V.le Europe" , "address-streetNumber" : "4" , "telephone-contactMobile" : "3391234556" , "telephone-contactTelephoneHome" : "070123456" , "telephone-contactTelephoneWork" : "070987654" , "telephone-contactAcceptSms" : true , "userInfo-dateOfBirth" : "2009-09-08T15:30:30Z" , "userInfo-email" : "max@gmail.com" , "userInfo-name" : "Paperino" , "userInfo-surname" : "Paolino" , "userInfo-sensibleData" : "no sensible data" , "id" : "d37m3051128" , "description" : "descr" , "groupId" : "15" , "centerId" : "centerThree" , "_ns" : "centerUser"}
  • 17. Schema Free In un RDBMS la struttura dei dati è vincolata allo schema in cui definiamo tabelle con le colonne per meglio relazionare i dati. In MongoDB lo “schema” viene definito dai dati quando vengono salvati. Raggruppiamo le entità della nostra applicazione in collezioni (Users, Centers...).
  • 18. Document Le informazioni possono essere embedded o referenziate. Ovviamente la soluzione embedded è più veloce non avendo bisogno di caricare altri dati come farebbe una join con il SQL. Automaticamente ogni Document ha un campo _id per identificarlo univocamente.
  • 19. Atomicità Il motivo principale della mancanza delle transazioni è la lentezza e il costo dei lock in ambienti distribuiti. Non essendoci le transazioni che coinvolgono più dati, qui abbiamo atomicità a livello di singolo documento con i seguenti comandi: $set $inc $push $pushAll $pull $pullAll
  • 20. Mongo Driver Mongo può essere utilizzato con i linguaggi più diffusi: Java (Groovy, Scala, JRuby), PHP, Ruby, C++, Python, Perl, C#, Erlang, Javascript server side. Ogni driver predispone i nostri oggetti ad essere utilizzati in Mongo.
  • 21. Collection I nostri item (Document) sono salvati dentro delle Collection che possiamo vedere come i corrispettivi delle tabelle in un RDBMS. Una collection viene creata effettivamente quando un document viene salvato al suo interno. public void createCollectionCenters(Mongo mongo) { NoCenter center = new NoCenter(); DBCollection collectionCenters = mongo.getCollection("centers"); collectionCenters.insert(new BasicDBObject(center.toMap())); }
  • 22. Mongo Java Driver Per essere salvati o letti i nostri oggetti devono essere “traslati” in oggetti com.mongodb.DBObject, per fare questo ci sono due alternative: Implementare l' interfaccia DBObject Utilizzare un BasicDBObjectBuilder
  • 23. Mongo Java Driver Se la nostra MyClass implementa l' interfaccia DBObject assegneremo i valori in questo modo. MyClass myObj= new MyClass(); myObj.put("user", userId); myObj.put("message", msg); myObj.put("date", new Date()); ... collection.insert(myObj);
  • 24. Mongo Java Driver Utilizzando BasicDBObjectBuilder collection.insert( BasicDBObjectBuilder.start() .add("user", myObj.getId()) .add("user", myObj.getUser()) .add("date", new Date()) ..... .get(); );
  • 25. Mongo Java Driver Una terza alternativa, più pratica consiste nel passare al Builder la mappa con i valori contenuti nel nostro oggetto. BasicDBObjectBuilder.start(myObj.toMap()).get(); Dobbiamo semplicemente aggiungere agli oggetti della nostra applicazione una rappresentazione sotto forma di Map e un costruttore con un Map per ricostruirli da un DBObject public class MyClass{ public MyClass(Map map){...} public Map toMap(){..} }
  • 26. Concorrenza Web App Nel caso di WebApp dove si hanno pesanti carichi in scrittura, è oppurtuno per avere consistenza nella sessione di lavoro (HttpRequest), eseguire il lavoro come mostrato nel codice, magari usando l' AOP con un before advice dove chiamare lo start e un after advice dove chiamare il done. Mongo dataStore; dataStore.requestStart(); //your code dataStore.requestDone();
  • 27. Interrogazioni Le query di ricerca vengono fatte costruendo i parametri di ricerca tramite un DBObject. Possiamo anche paginare il risultato della query. List<DBObject> objects = collection.find( BasicDBObjectBuilder.start(). add("userInfo-surname", surname). add("centerId", centerId).get() ). skip(offset * page).limit(offset).toArray();
  • 28. Interrogazioni Numero documenti in una collezione collection.find( BasicDBObjectBuilder.start() .add("centerId",centerId).get() ).length();
  • 29. Interrogazioni Se vogliamo recuperare solo alcuni campi del documento (Select SQL), costruiamo un DBObject con quei campi e utilizziamo il find che accetta due DBObject (query, campi richiesti). Il DBCursor è il corrispondente del ResultSet jdbc. DBCursor cursor = coll.find( BasicDBObjectBuilder.start().add("centerId", centerId).get(), BasicDBObjectBuilder.start().add("userInfo-email", "").get() );
  • 30. Interrogazioni Con espressioni regolari String pattern = new StringBuilder().append(character).append("*").toString(); List<DBObject> objects = coll.find(BasicDBObjectBuilder.start() .add("userInfo-surname", java.util.regex.Pattern.compile(pattern)) .get()).toArray();
  • 31. Interrogazioni avanzate Nelle query abbiamo a disposizione anche : <, <=, >, >=, $ne, $in, $nin, $mod, $all, $size, $exists Valori dentro Array Valori dentro un oggetto embedded Full language expressions con $where limit(), skip(), snapshot(), count(), group()
  • 32. Insert public String insertCenterUser(CenterUser user) { Map fields = user.toMap(); fields.put("id", IdGenerator.getUniqueId());//CustomId DBObject obj = coll.insert(BasicDBObjectBuilder.start(fields).get()); return obj != null ? obj.get("id").toString() : Constants.ID_NEW; }
  • 33. Update public int updateCenterUser(CenterUser user) { DBObject obj = coll.update( BasicDBObjectBuilder.start(). add("id",user.getEntity().getId()).get(), BasicDBObjectBuilder.start(user.toMap()).get(), false, false ); return obj != null ? 1 : 0; }
  • 34. Upsert Update if present insert is missing public int updateCenterUser(CenterUser user) { DBObject obj = coll.update( BasicDBObjectBuilder.start(). add("id",user.getEntity().getId()).get(), BasicDBObjectBuilder.start(user.toMap()).get(), true, false ); return obj != null ? 1 : 0; }
  • 35. Delete Delete diretto public void deleteCenterUser(String id, String centerId) { DBObject obj = coll.findOne( BasicDBObjectBuilder.start(). add("id", id). add("centerId", centerId).get()); coll.remove(obj); }
  • 36. Delete Delete utilizzando il DBcursor public boolean deleteCenterUser(String id, String centerId) { DBCursor cursor = coll.find( new BasicDBObject(), BasicDBObjectBuilder.start() .add("id", id) .add("centerId", centerId).get() ); boolean result = false; while (cursor.hasNext()) { coll.remove(cursor.next()); result = true; } return result; }
  • 37. Production Deployments http://www.mongodb.org/display/DOCS/Production+Deployments SourceForge Mozilla Ubiquity Disqus Business Insider Floxee Silentale BoxedIce Defensio TweetSaver ShopWiki MusicNation Detexify Sluggy Freelance eFlyover soliMAP (Sept 2009)
  • 39. Grazie per l'attenzione ! Massimiliano Dessì desmax74 at yahoo.it massimiliano.dessi at pronetics.it http://twitter.com/desmax74 http://jroller.com/desmax http://www.linkedin.com/in/desmax74 http://wiki.java.net/bin/view/People/MassimilianoDessi http://www.jugsardegna.org/vqwiki/jsp/Wiki?MassimilianoDessi Spring Framework Italian User Group http://it.groups.yahoo.com/group/SpringFramework-it