SlideShare a Scribd company logo
Scala e i databaseOnofrio PanzarinoTwitter: @onof80onofrio.panzarino@gmail.comhttp://it.linkedin.com/in/onofriopanzarinohttp://www.google.com/profiles/onofrio.panzarinoJug Ancona
AgendaIntroduzione a NoSQLMongoDBScala e i databaseMongo-scala-driverScalaQuery
Limiti dei RDBMS tradizionaliLe classiche web-app sono “Scale-out”Si aggiungono nodi al sistema per aumentare le performanceGli RDBMS, a causa di lock e join, sono “Scale-up”Per aumentare le performance è necessario potenziare il serverRDBMS ottimizzati perbrevi e frequenti transazioni r/wgrandi transazioni batch con pochi accessi in scritturanon per pesanti carichi di lavoro r/w!
CAP theorem (Brewer, 2000)Sistemi distribuitiC = Consistencytutti i nodi con gli stessi datiA = Availabilityil fallimento di un nodo non impedisce agli altri di continuareP = Partitiontoleranceil sistema tollera arbitrarie perdite di messaggi“Un sistema distribuito non può garantirle simultaneamente tutte, ma al massimo due”(C && A) => ! P
Data modelsKey / ValueCassandra (Apache)Facebook, Twitter, Digg, …Berkeley DB (Oracle)Asterisk PBX, OpenLDAP, RPM, SVN, Terracotta, …VoldemortLinkedInTabularBigTable (Google)HbaseHypertableDocument-orientedMongoDBNY Times, Foursquare, Bit.ly, Sourceforge, Eventbrite, LHC (CERN), CouchDB (Apache)TerrastoreJackrabbit (Apache)GraphNeo4jTuple – storeApache River
MongoDBJSON-style data store{ name: “onofrio”, tags: [ “scala”, “java”] }Schemalessnella stessa collection:{ username: “bill”, password: “h298LYT”, age: 30, active: true }{ username: “james”, openId: http://www...”,  }{ username: “admin”, alias: “bill” }facile da gestirenon è più necessario fare il deploy dello schema del DB!
MongoDBQueryMap / ReduceEsempio:varmap = function() {emit(this.username, { votes: this.votes }}var reduce = function() {var sum = 0;values.forEach(function(doc) {    sum += doc.votes;  });return {votes: sum};}db.comments.mapReduce(map, reduce);
MongoDBNo-joins, no multi objecttransationsScalabilità orizzontaleUsecasesCMSCommentstorage, votingHigh-volumeproblemsReal-time statsEventloggingSconsigliato per:Banking systemsComplextransactionsTraditional BIData warehouse
DemoLancio del serverAlcuni comandi console
Mongo-scala-driverÈ un wrapper di mongo-java-driver, scritto in ScalaFornisce il modo di mappare un documento MongoDB (DBObject) in un “POSO” Fondamentalmente è un DSL per repositoryMongoDB.val m = new Mongo("localhost") valcoll = m.getDB(“test”).getCollection("addresses") of Address coll << new Address(“Onofrio", “Via Garibaldi", “1111", “NYC") valaddressOfNY = for { a <- Address where { Address.street is “NYC” } in coll }
DemoScala + MongoDB
Scala + RDBMSScala può linkare ogni JARJDBC“JDBC is the reasonwhy Java guysuseORMs”Non è type-safegetString(“Name”)getFloat(“Price”)…La mappatura columntype – Java type non è centralizzabileviene ripetuta ad ogni query
ScalaQueryDSL per JDBCScala – friendlyTotalmente type-safeLa mappatura è centralizzata in un Scala objectNon è un ORMNo cacheNon viene oscurato il momento in cui vengono effettuate le queryÈ possibile usare oggetti immutabili
DemoScala + ScalaQuery
Riferimentihttp://nosql-database.org/http://www.mongodb.org/http://kylebanker.com/blog/http://cassandra.apache.org/http://www.json.org/KyleBanker, MongoDB in Action, Manning (MEAP)
Riferimentihttp://www.scala-lang.org/M. Odersky, L. Spoon, B. Venners, Programming in Scala, Artimascala-user mailing listhttp://stackoverflow.com/questions/tagged/scalahttp://www.artima.com/index.jspirc://irc.freenode.net/scala
Riferimenti (2)Libreriescalaz: http://code.google.com/p/scalaz/Mongo-scala-driver: https://github.com/osinka/mongo-scala-driverScalaQuery: http://scalaquery.org/Blogshttp://debasishg.blogspot.com/http://james-iry.blogspot.com/http://www.codecommit.com/Enjoywith

More Related Content

Scala e i database

  • 1. Scala e i databaseOnofrio PanzarinoTwitter: @onof80onofrio.panzarino@gmail.comhttp://it.linkedin.com/in/onofriopanzarinohttp://www.google.com/profiles/onofrio.panzarinoJug Ancona
  • 2. AgendaIntroduzione a NoSQLMongoDBScala e i databaseMongo-scala-driverScalaQuery
  • 3. Limiti dei RDBMS tradizionaliLe classiche web-app sono “Scale-out”Si aggiungono nodi al sistema per aumentare le performanceGli RDBMS, a causa di lock e join, sono “Scale-up”Per aumentare le performance è necessario potenziare il serverRDBMS ottimizzati perbrevi e frequenti transazioni r/wgrandi transazioni batch con pochi accessi in scritturanon per pesanti carichi di lavoro r/w!
  • 4. CAP theorem (Brewer, 2000)Sistemi distribuitiC = Consistencytutti i nodi con gli stessi datiA = Availabilityil fallimento di un nodo non impedisce agli altri di continuareP = Partitiontoleranceil sistema tollera arbitrarie perdite di messaggi“Un sistema distribuito non può garantirle simultaneamente tutte, ma al massimo due”(C && A) => ! P
  • 5. Data modelsKey / ValueCassandra (Apache)Facebook, Twitter, Digg, …Berkeley DB (Oracle)Asterisk PBX, OpenLDAP, RPM, SVN, Terracotta, …VoldemortLinkedInTabularBigTable (Google)HbaseHypertableDocument-orientedMongoDBNY Times, Foursquare, Bit.ly, Sourceforge, Eventbrite, LHC (CERN), CouchDB (Apache)TerrastoreJackrabbit (Apache)GraphNeo4jTuple – storeApache River
  • 6. MongoDBJSON-style data store{ name: “onofrio”, tags: [ “scala”, “java”] }Schemalessnella stessa collection:{ username: “bill”, password: “h298LYT”, age: 30, active: true }{ username: “james”, openId: http://www...”, }{ username: “admin”, alias: “bill” }facile da gestirenon è più necessario fare il deploy dello schema del DB!
  • 7. MongoDBQueryMap / ReduceEsempio:varmap = function() {emit(this.username, { votes: this.votes }}var reduce = function() {var sum = 0;values.forEach(function(doc) { sum += doc.votes; });return {votes: sum};}db.comments.mapReduce(map, reduce);
  • 8. MongoDBNo-joins, no multi objecttransationsScalabilità orizzontaleUsecasesCMSCommentstorage, votingHigh-volumeproblemsReal-time statsEventloggingSconsigliato per:Banking systemsComplextransactionsTraditional BIData warehouse
  • 10. Mongo-scala-driverÈ un wrapper di mongo-java-driver, scritto in ScalaFornisce il modo di mappare un documento MongoDB (DBObject) in un “POSO” Fondamentalmente è un DSL per repositoryMongoDB.val m = new Mongo("localhost") valcoll = m.getDB(“test”).getCollection("addresses") of Address coll << new Address(“Onofrio", “Via Garibaldi", “1111", “NYC") valaddressOfNY = for { a <- Address where { Address.street is “NYC” } in coll }
  • 12. Scala + RDBMSScala può linkare ogni JARJDBC“JDBC is the reasonwhy Java guysuseORMs”Non è type-safegetString(“Name”)getFloat(“Price”)…La mappatura columntype – Java type non è centralizzabileviene ripetuta ad ogni query
  • 13. ScalaQueryDSL per JDBCScala – friendlyTotalmente type-safeLa mappatura è centralizzata in un Scala objectNon è un ORMNo cacheNon viene oscurato il momento in cui vengono effettuate le queryÈ possibile usare oggetti immutabili
  • 16. Riferimentihttp://www.scala-lang.org/M. Odersky, L. Spoon, B. Venners, Programming in Scala, Artimascala-user mailing listhttp://stackoverflow.com/questions/tagged/scalahttp://www.artima.com/index.jspirc://irc.freenode.net/scala
  • 17. Riferimenti (2)Libreriescalaz: http://code.google.com/p/scalaz/Mongo-scala-driver: https://github.com/osinka/mongo-scala-driverScalaQuery: http://scalaquery.org/Blogshttp://debasishg.blogspot.com/http://james-iry.blogspot.com/http://www.codecommit.com/Enjoywith