SlideShare a Scribd company logo
1 of 30
Download to read offline
Leveraging your
Knowledge of ORM
Towards Performance-
based N SQL T h l
b   d NoSQL Technology

By Robert Greene




 Versant Corporation U.S. Headquarters
 255 Shoreline Dr Suite 450 Redwood City CA 94065
               Dr.      450,          City,
 www.versant.com | 650-232-2400




                                                    #NoSQLVersant
Overview   NoSQL at it’s Core
             SQ          C

           Pole-Position – Overview

           About the Code

              Circuits Description

              RDB JPA Code

              MongoDB Code

              Versant JPA Code
              V     t     C d

           Results – Winners of the Race

           Developer Challenge




                                      #NoSQLVersant
NoSQL
at its core

              #NoSQLVersant
Traditional DBMS Scale Architecture
  INEFFICIENT
 CPU destroying
    Mapping




                                      EXPENSIVE
                                    Repetitive data
                                  movement and JOIN
                                      calculation



                  #NoSQLVersant
NoSQL at its Core
A Shift In Application Architecture
                                             UNIFED
                                          Application 
                                          A li ti
                                         driven schema




                                       COMMODITY HW
                                       COMMODITY HW
                                      Horizontal scale out, 
                                        distribution and 
                                          partitioning

     •   Google – Soft-Schema
     •   IBM – Schema-Less




                                  #NoSQLVersant
A Shift is Needed
► How Often do Relations Change?
                             g
  Blog : BlogEntry , Order : OrderItem , You : Friend


► R l ti
  Relations R l Ch
            Rarely Change, St R
                           Stop Recalculating Th
                                    l l ti Them

            ► Do you need ALL o you da a in o e p ace
               o      eed     of your data one place.

            ► You don’t. You can distribute it.




                                                    #NoSQLVersant
Measured V l
M      d Value
How NoSQL performance
 stacks up to Relational



                    #NoSQLVersant
PolePosition
           Performance Benchmark
► Established in 2003
   NoSQL
   N SQL -vs- ORM

► Code Complexity Circuits
   Flat Obj t
   Fl t Objects
   Graphs
   Inherited Objects
   Collections

► Data Operations
   CRUD
   Concurrency

► Scalability

                                  #NoSQLVersant
Contenders | Methodology
► Contenders
  ORM
  NoSQL

► Methodology
  External RDB Experts, Internal NoSQL Experts
  Open Source Benchmark Code for all contenders




                                        #NoSQLVersant
About the Code
► ORM
  Common Code Base


► Tested Database Engines
  Hibernate – MySQL / Postgres
  OpenJPA – MySQL / Postgres
  MongoDB
  Versant Object Database




                                 #NoSQLVersant
Circuit Structure
► Simulate CRUD on embedded graph of different Classes.
► Cl
  Class model - C
           d l Complex Ci it
                    l Circuit:

      class Holder0 { 
             String _name; 
             String name;
             List <Holder0> _children;
             Holder0[] _array; } 
      class Holder1 extends Holder0 { 
                                    {
             int _i1; } 
      class Holder2 extends Holder1 { 
             int _i2 <indexed>; }     ...class HolderN

extends…..



                                                #NoSQLVersant
Hibernate JPA Code
► Write – Generates Holder’s to user spec depth
  ComplexHolder cp = new ComplexHolder( );  
  em.makePersistent(cp);
► Read – Access root of graph and traverse
   cp = em.find( ComplexHolder.class, id ); cp.getChildren().touch();
► Query
   String query 
   String query = "from
                   from 
   org.polepos.teams.hibernate.data.Holder2 where i2=" + 
   currentInt;    Iterator it =  em.iterate(query); 
► Delete – Deletes Graph - cascading operation




                                                            #NoSQLVersant
ORM JPA Mapping
            XML Mapping File for each Persistent Class ( 11ea Files )
- <hibernate-mapping package="org.polepos.teams.hibernate.data" default-cascade="none" default-access="property" default-lazy="true" auto-import="true">
- <class name="ComplexHolder0" table="tComplexHolderNew0" polymorphism="implicit" mutable="true" dynamic-update="false" dynamic-insert="false" select-before-update="false"
optimistic-lock="version">
   ti i ti l k "      i ">
  <id name="id" column="fid" type="long" />
- <discriminator type="string" not-null="true" force="false" insert="true">
  <column name="DISCRIMINATOR" />
  </discriminator>
  <property name="name" column="fname" type="string" unique="false" optimistic-lock="true" lazy="false" generated="never" />
- <list name="children" access="field" cascade="all" inverse="false" mutable="true" optimistic-lock="true" embed-xml="true">
  <key column="parentId" on-delete="noaction" />
  <index l
  <i d column="elementIndex" />
                  " l      tI d "
  <many-to-many class="ComplexHolder0" embed-xml="true" not-found="exception" unique="false" />
  </list>
- <array name="array" access="field" cascade="all" inverse="false" mutable="true" optimistic-lock="true" embed-xml="true">
  <key column="parentId" on-delete="noaction" />
  <index column="elementIndex" />
  <many-to-many class="ComplexHolder0" embed-xml="true" not-found="exception" unique="false" />
  </array>
- <subclass name="ComplexHolder1" discriminator-value="D" dynamic-update="false" dynamic insert="false" select before update="false">
                                        discriminator value="D" dynamic update="false" dynamic-insert="false" select-before-update="false">
  <property name="i1" column="i1" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" />
- <subclass name="ComplexHolder2" discriminator-value="E" dynamic-update="false" dynamic-insert="false" select-before-update="false">
  <property name="i2" column="i2" type="int" index="i2_idx" unique="false" optimistic-lock="true" lazy="false" generated="never" />
- <subclass name="ComplexHolder3" discriminator-value="F" dynamic-update="false" dynamic-insert="false" select-before-update="false">
  <property name="i3" column="i3" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" />
- <subclass name="ComplexHolder4" discriminator-value="G" dynamic-update="false" dynamic-insert="false" select-before-update="false">
  <property name="i4" column="i4" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" />
  </subclass>
  </subclass>
  </subclass>
  </subclass>
  </class>
  </hibernate-mapping>




                                                                                                                                   #NoSQLVersant
MongoDB Code
private void storeData(Mongo mongo) {
       collection(mongo).insert(new BasicDBObject("test", "object"));
   }

public ComplexHolder0 convertFromDocument(DBObject data, DeserializationOptions
   deserializationOption) {
       ComplexHolder0 instance = createInstance(getAsString(data, TYPE_ATTRIBUTE));
       instance.setName(getAsString(data, NAME_ATTRIBUTE));
       if ( ll ! d t
          (null != data.get(CHILDREN)) {
                           t(CHILDREN)) {
           instance.setChildren(fromMongoObjectToList(getAsList(data, CHILDREN), 
   deserializationOption));
       }
       if (null != data.get(ARRAY)) {
           final List<ComplexHolder0> arrayContent = fromMongoObjectToList(getAsList(data, 
                         p                y                 g   j         (g        (    ,
   ARRAY), deserializationOption);
           instance.setArray(arrayContent.toArray(new ComplexHolder0[arrayContent.size()]));
       }
       readAttributes(data, instance);
       return instance;
   } 




                                                                         #NoSQLVersant
MongoDB Mapping
private static void writeSubTypeAttributes(ComplexHolder0 holder, 
  BasicDBObject dataStorage) {
       if (h ld
          (holder instanceof ComplexHolder1) {
                  i t      f     l    ld   ) {
           dataStorage.put(FIELD_I1, ((ComplexHolder1) holder)._i1);
       }
       if (holder instanceof ComplexHolder2) {
           dataStorage.put(FIELD_I2, ((ComplexHolder2) holder)._i2);
           d t St        t(FIELD I2 ((C    l H ld 2) h ld ) i2)
       }

private static void readAttributes(DBObject dataStorage, ComplexHolder0 
  holder) {
  holder) {
       if (holder instanceof ComplexHolder1) {
           ((ComplexHolder1) holder)._i1 = (Integer) 
  dataStorage.get(FIELD_I1);
       }
       if (holder instanceof ComplexHolder2) {
           ((ComplexHolder2) holder)._i2 = (Integer) 
  dataStorage.get(FIELD_I2);
       }



                                                       #NoSQLVersant
g        _
Holder0.class.getPackage().getName();
nal String NAME_ATTRIBUTE = "name";
nal String CHILDREN = "children";
nal String ARRAY = "array";
nal String REFERENCE_TO_ORIGINAL_DOCUMENT = "_refToOriginal";
nal String FIELD_I1 = "_i1";
nal String FIELD_I2 = "_i2";
nal String FIELD_I3 = "_i3";
nal String FIELD_I4 = "_i4";        MongoDB Mapping
inal OneArgFunction<BasicDBObject, DBRef> refCreator;


tion(OneArgFunction<BasicDBObject, DBRef> refCreator) {
refCreator = refCreator;


atic Serialisation create(OneArgFunction<BasicDBObject, DBRef> 
tor) {
ull == refCreator) {
hrow new ArgumentNullException("requires a reference creator");

n new Serialisation(refCreator);


atic OneArgFunction<BasicDBObject, DBRef> 
eferenceCreator(final DBCollection collection) {
ull == collection) {
hrow new ArgumentNullException("requires a collection");

n new OneArgFunction<BasicDBObject, DBRef>() {
Override
ublic DBRef invoke(BasicDBObject basicDBObject) {
   final DB db = collection.getDB();
   final Object id = basicDBObject.get("_id");
   if (null == id) {
       throw new IllegalStateException("Expected an '_id' on the 
);
   }
   return new DBRef(db, collection.getName(), id);
                   ( ,             g      (),   );




                                                                    #NoSQLVersant
Versant JPA Code

► Write – Generates Holder’s to user spec depth
                                      p     p
  ComplexHolder cp = new ComplexHolder( );  
  em.makePersistent(cp);

► Read – Access root of graph and traverse
  cp = em.find( ComplexHolder.class, id );   
  cp.getChildren().touch();

► Q
  Query
  String query = "from org.polepos.teams.versant.data.Holder2 
  where i2=" + currentInt;    Iterator it = 
  session.iterate(query); 
      i   i      (     )

► Delete – Deletes Graph – Cascading Operation


                                                #NoSQLVersant
Versant JPA Mapping
Single XML File with primitive declaration entries


 <class name="ComplexHolder0">
        <field name name />
        <field name="name" />
        <field name="array" />
            <field name="children">
        <collection element‐
type="ComplexHolder0"/> </field>
 </class>




                                           #NoSQLVersant
Sh@t’s and Grins
► JDBC Code
JDBC StringBuilder sb = new StringBuilder(); sb.append("select " + 
   HOLDER_TABLE0 + ".id from " + HOLDER_TABLE0); sb.append(" INNER 
   JOIN " + HOLDER_TABLES[0]); sb.append(" on " + HOLDER_TABLE0 + 
   ".id =   "  + HOLDER_TABLES[0] +  ".id "); sb.append("  INNER JOIN  "  
    .id        + HOLDER TABLES[0] + .id  ); sb.append( INNER JOIN
   + HOLDER_TABLES[1]); sb.append(" on " + HOLDER_TABLE0 + ".id = " 
   + HOLDER_TABLES[1] + ".id "); sb.append(" LEFT OUTER JOIN " + 
   HOLDER_TABLES[2]); sb.append(" on " + HOLDER_TABLE0 + ".id = " + 
   HOLDER_TABLES[2] + ".id "); sb.append(" LEFT OUTER JOIN " + 
   HOLDER_TABLES[3]); sb.append( on
   HOLDER TABLES[3]); sb.append("  on  "  + HOLDER_TABLE0 +  ".id =   "  + 
                                           + HOLDER TABLE0 + .id         +
   HOLDER_TABLES[3] + ".id "); sb.append(" where " + 
   HOLDER_TABLES[1] + ".i2 = ?"); PreparedStatement stat = 
   prepareStatement(sb.toString()); ResultSet resultSet
   stat.executeQuery(); 




                                                         #NoSQLVersant
PolePosition
Benchmark Summary Results




                   #NoSQLVersant
FlatObject - Single Thread




                     #NoSQLVersant
Results – ComplexConcurrency
        @mongo - no safe mode




                                #NoSQLVersant
Results – QueryConcurrency
       @mongo – no safe mode




                               #NoSQLVersant
Results – InsertConcurrent
      @mongo – no safe mode




                              #NoSQLVersant
Results – ComplexConcurrency
         @mongo – safe mode




                              #NoSQLVersant
Results – QueryConcurrency
       @mongo – safe mode




                            #NoSQLVersant
Results – InsertConcurrent
       @mongo – safe mode




                            #NoSQLVersant
Conclusions
► Wake-up, smell the coffee
        p,
  JOINs are not needed - unless adhoc analytics
► Take care of business, dump a load of code
  Serialization is bad, data useful once structured
  Mapping is Mapping, even when it’s not an ORM
► Get on your Bad Motor Scooter and Ride
  NoSQL without Mapping rules the road


         Get the Code: http://www.polepos.org


                                             #NoSQLVersant
Q&A


      #NoSQLVersant
Contact
      Robert Greene
Vice President, Technology
   rgreene@versant.com
          @      t

  NoSQL Now! – Booth #
    SQ               #14




                           #NoSQLVersant

More Related Content

What's hot

Easy data-with-spring-data-jpa
Easy data-with-spring-data-jpaEasy data-with-spring-data-jpa
Easy data-with-spring-data-jpa
Staples
 
Non Cms For Web Apps
Non Cms For Web AppsNon Cms For Web Apps
Non Cms For Web Apps
day
 
Create custom looping procedures in sql server 2005 tech republic
Create custom looping procedures in sql server 2005   tech republicCreate custom looping procedures in sql server 2005   tech republic
Create custom looping procedures in sql server 2005 tech republic
Kaing Menglieng
 

What's hot (20)

Apache Spark - Key-Value RDD | Big Data Hadoop Spark Tutorial | CloudxLab
Apache Spark - Key-Value RDD | Big Data Hadoop Spark Tutorial | CloudxLabApache Spark - Key-Value RDD | Big Data Hadoop Spark Tutorial | CloudxLab
Apache Spark - Key-Value RDD | Big Data Hadoop Spark Tutorial | CloudxLab
 
Easy data-with-spring-data-jpa
Easy data-with-spring-data-jpaEasy data-with-spring-data-jpa
Easy data-with-spring-data-jpa
 
DSLs In Erlang
DSLs In ErlangDSLs In Erlang
DSLs In Erlang
 
Non Cms For Web Apps
Non Cms For Web AppsNon Cms For Web Apps
Non Cms For Web Apps
 
Simple Jdbc With Spring 2.5
Simple Jdbc With Spring 2.5Simple Jdbc With Spring 2.5
Simple Jdbc With Spring 2.5
 
Groovy.pptx
Groovy.pptxGroovy.pptx
Groovy.pptx
 
JDBC - JPA - Spring Data
JDBC - JPA - Spring DataJDBC - JPA - Spring Data
JDBC - JPA - Spring Data
 
Rapid development tools for java ee 8 [tut2998]
Rapid development tools for java ee 8 [tut2998]Rapid development tools for java ee 8 [tut2998]
Rapid development tools for java ee 8 [tut2998]
 
Java Persistence API 2.0: An Overview
Java Persistence API 2.0: An OverviewJava Persistence API 2.0: An Overview
Java Persistence API 2.0: An Overview
 
Advanced Php - Macq Electronique 2010
Advanced Php - Macq Electronique 2010Advanced Php - Macq Electronique 2010
Advanced Php - Macq Electronique 2010
 
Design Patterns Reconsidered
Design Patterns ReconsideredDesign Patterns Reconsidered
Design Patterns Reconsidered
 
Create custom looping procedures in sql server 2005 tech republic
Create custom looping procedures in sql server 2005   tech republicCreate custom looping procedures in sql server 2005   tech republic
Create custom looping procedures in sql server 2005 tech republic
 
Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web Stack
 
Java Persistence API
Java Persistence APIJava Persistence API
Java Persistence API
 
ScalikeJDBC Tutorial for Beginners
ScalikeJDBC Tutorial for BeginnersScalikeJDBC Tutorial for Beginners
ScalikeJDBC Tutorial for Beginners
 
hibernate
hibernatehibernate
hibernate
 
OakTable World 2015 - Using XMLType content with the Oracle In-Memory Column...
OakTable World 2015  - Using XMLType content with the Oracle In-Memory Column...OakTable World 2015  - Using XMLType content with the Oracle In-Memory Column...
OakTable World 2015 - Using XMLType content with the Oracle In-Memory Column...
 
Map-Reduce and Apache Hadoop
Map-Reduce and Apache HadoopMap-Reduce and Apache Hadoop
Map-Reduce and Apache Hadoop
 
JPA 2.0
JPA 2.0JPA 2.0
JPA 2.0
 
Er model
Er modelEr model
Er model
 

Similar to Leveraging your Knowledge of ORM Towards Performance-based NoSQL Technology

Spark as the Gateway Drug to Typed Functional Programming: Spark Summit East ...
Spark as the Gateway Drug to Typed Functional Programming: Spark Summit East ...Spark as the Gateway Drug to Typed Functional Programming: Spark Summit East ...
Spark as the Gateway Drug to Typed Functional Programming: Spark Summit East ...
Spark Summit
 
Nko workshop - node js & nosql
Nko workshop - node js & nosqlNko workshop - node js & nosql
Nko workshop - node js & nosql
Simon Su
 

Similar to Leveraging your Knowledge of ORM Towards Performance-based NoSQL Technology (20)

PostgreSQL Open SV 2018
PostgreSQL Open SV 2018PostgreSQL Open SV 2018
PostgreSQL Open SV 2018
 
Drupal II: The SQL
Drupal II: The SQLDrupal II: The SQL
Drupal II: The SQL
 
Spark Structured APIs
Spark Structured APIsSpark Structured APIs
Spark Structured APIs
 
Apache Spark, the Next Generation Cluster Computing
Apache Spark, the Next Generation Cluster ComputingApache Spark, the Next Generation Cluster Computing
Apache Spark, the Next Generation Cluster Computing
 
Domain Driven Design Tactical Patterns
Domain Driven Design Tactical PatternsDomain Driven Design Tactical Patterns
Domain Driven Design Tactical Patterns
 
Spark as the Gateway Drug to Typed Functional Programming: Spark Summit East ...
Spark as the Gateway Drug to Typed Functional Programming: Spark Summit East ...Spark as the Gateway Drug to Typed Functional Programming: Spark Summit East ...
Spark as the Gateway Drug to Typed Functional Programming: Spark Summit East ...
 
Nko workshop - node js & nosql
Nko workshop - node js & nosqlNko workshop - node js & nosql
Nko workshop - node js & nosql
 
Big Data Analytics with Apache Spark
Big Data Analytics with Apache SparkBig Data Analytics with Apache Spark
Big Data Analytics with Apache Spark
 
NoSQL – Beyond the Key-Value Store
NoSQL – Beyond the Key-Value StoreNoSQL – Beyond the Key-Value Store
NoSQL – Beyond the Key-Value Store
 
Module Ninja .JS
Module Ninja .JSModule Ninja .JS
Module Ninja .JS
 
Spark & Cassandra - DevFest Córdoba
Spark & Cassandra - DevFest CórdobaSpark & Cassandra - DevFest Córdoba
Spark & Cassandra - DevFest Córdoba
 
Apache Spark Fundamentals Meetup Talk
Apache Spark Fundamentals Meetup TalkApache Spark Fundamentals Meetup Talk
Apache Spark Fundamentals Meetup Talk
 
NoSQL Endgame DevoxxUA Conference 2020
NoSQL Endgame DevoxxUA Conference 2020NoSQL Endgame DevoxxUA Conference 2020
NoSQL Endgame DevoxxUA Conference 2020
 
A really really fast introduction to PySpark - lightning fast cluster computi...
A really really fast introduction to PySpark - lightning fast cluster computi...A really really fast introduction to PySpark - lightning fast cluster computi...
A really really fast introduction to PySpark - lightning fast cluster computi...
 
20140614 introduction to spark-ben white
20140614 introduction to spark-ben white20140614 introduction to spark-ben white
20140614 introduction to spark-ben white
 
Introduction to Spark Datasets - Functional and relational together at last
Introduction to Spark Datasets - Functional and relational together at lastIntroduction to Spark Datasets - Functional and relational together at last
Introduction to Spark Datasets - Functional and relational together at last
 
EclipseCon 2017 - Introduction to Machine Learning with Eclipse Deeplearning4j
EclipseCon 2017 - Introduction to Machine Learning with Eclipse Deeplearning4jEclipseCon 2017 - Introduction to Machine Learning with Eclipse Deeplearning4j
EclipseCon 2017 - Introduction to Machine Learning with Eclipse Deeplearning4j
 
Intro to Spark and Spark SQL
Intro to Spark and Spark SQLIntro to Spark and Spark SQL
Intro to Spark and Spark SQL
 
Vitalii Bondarenko HDinsight: spark. advanced in memory big-data analytics wi...
Vitalii Bondarenko HDinsight: spark. advanced in memory big-data analytics wi...Vitalii Bondarenko HDinsight: spark. advanced in memory big-data analytics wi...
Vitalii Bondarenko HDinsight: spark. advanced in memory big-data analytics wi...
 
SE2016 BigData Vitalii Bondarenko "HD insight spark. Advanced in-memory Big D...
SE2016 BigData Vitalii Bondarenko "HD insight spark. Advanced in-memory Big D...SE2016 BigData Vitalii Bondarenko "HD insight spark. Advanced in-memory Big D...
SE2016 BigData Vitalii Bondarenko "HD insight spark. Advanced in-memory Big D...
 

More from DATAVERSITY

The Data Trifecta – Privacy, Security & Governance Race from Reactivity to Re...
The Data Trifecta – Privacy, Security & Governance Race from Reactivity to Re...The Data Trifecta – Privacy, Security & Governance Race from Reactivity to Re...
The Data Trifecta – Privacy, Security & Governance Race from Reactivity to Re...
DATAVERSITY
 
Data Strategy Best Practices
Data Strategy Best PracticesData Strategy Best Practices
Data Strategy Best Practices
DATAVERSITY
 

More from DATAVERSITY (20)

Architecture, Products, and Total Cost of Ownership of the Leading Machine Le...
Architecture, Products, and Total Cost of Ownership of the Leading Machine Le...Architecture, Products, and Total Cost of Ownership of the Leading Machine Le...
Architecture, Products, and Total Cost of Ownership of the Leading Machine Le...
 
Data at the Speed of Business with Data Mastering and Governance
Data at the Speed of Business with Data Mastering and GovernanceData at the Speed of Business with Data Mastering and Governance
Data at the Speed of Business with Data Mastering and Governance
 
Exploring Levels of Data Literacy
Exploring Levels of Data LiteracyExploring Levels of Data Literacy
Exploring Levels of Data Literacy
 
Building a Data Strategy – Practical Steps for Aligning with Business Goals
Building a Data Strategy – Practical Steps for Aligning with Business GoalsBuilding a Data Strategy – Practical Steps for Aligning with Business Goals
Building a Data Strategy – Practical Steps for Aligning with Business Goals
 
Make Data Work for You
Make Data Work for YouMake Data Work for You
Make Data Work for You
 
Data Catalogs Are the Answer – What is the Question?
Data Catalogs Are the Answer – What is the Question?Data Catalogs Are the Answer – What is the Question?
Data Catalogs Are the Answer – What is the Question?
 
Data Catalogs Are the Answer – What Is the Question?
Data Catalogs Are the Answer – What Is the Question?Data Catalogs Are the Answer – What Is the Question?
Data Catalogs Are the Answer – What Is the Question?
 
Data Modeling Fundamentals
Data Modeling FundamentalsData Modeling Fundamentals
Data Modeling Fundamentals
 
Showing ROI for Your Analytic Project
Showing ROI for Your Analytic ProjectShowing ROI for Your Analytic Project
Showing ROI for Your Analytic Project
 
How a Semantic Layer Makes Data Mesh Work at Scale
How a Semantic Layer Makes  Data Mesh Work at ScaleHow a Semantic Layer Makes  Data Mesh Work at Scale
How a Semantic Layer Makes Data Mesh Work at Scale
 
Is Enterprise Data Literacy Possible?
Is Enterprise Data Literacy Possible?Is Enterprise Data Literacy Possible?
Is Enterprise Data Literacy Possible?
 
The Data Trifecta – Privacy, Security & Governance Race from Reactivity to Re...
The Data Trifecta – Privacy, Security & Governance Race from Reactivity to Re...The Data Trifecta – Privacy, Security & Governance Race from Reactivity to Re...
The Data Trifecta – Privacy, Security & Governance Race from Reactivity to Re...
 
Emerging Trends in Data Architecture – What’s the Next Big Thing?
Emerging Trends in Data Architecture – What’s the Next Big Thing?Emerging Trends in Data Architecture – What’s the Next Big Thing?
Emerging Trends in Data Architecture – What’s the Next Big Thing?
 
Data Governance Trends - A Look Backwards and Forwards
Data Governance Trends - A Look Backwards and ForwardsData Governance Trends - A Look Backwards and Forwards
Data Governance Trends - A Look Backwards and Forwards
 
Data Governance Trends and Best Practices To Implement Today
Data Governance Trends and Best Practices To Implement TodayData Governance Trends and Best Practices To Implement Today
Data Governance Trends and Best Practices To Implement Today
 
2023 Trends in Enterprise Analytics
2023 Trends in Enterprise Analytics2023 Trends in Enterprise Analytics
2023 Trends in Enterprise Analytics
 
Data Strategy Best Practices
Data Strategy Best PracticesData Strategy Best Practices
Data Strategy Best Practices
 
Who Should Own Data Governance – IT or Business?
Who Should Own Data Governance – IT or Business?Who Should Own Data Governance – IT or Business?
Who Should Own Data Governance – IT or Business?
 
Data Management Best Practices
Data Management Best PracticesData Management Best Practices
Data Management Best Practices
 
MLOps – Applying DevOps to Competitive Advantage
MLOps – Applying DevOps to Competitive AdvantageMLOps – Applying DevOps to Competitive Advantage
MLOps – Applying DevOps to Competitive Advantage
 

Recently uploaded

Recently uploaded (20)

ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 

Leveraging your Knowledge of ORM Towards Performance-based NoSQL Technology

  • 1. Leveraging your Knowledge of ORM Towards Performance- based N SQL T h l b d NoSQL Technology By Robert Greene Versant Corporation U.S. Headquarters 255 Shoreline Dr Suite 450 Redwood City CA 94065 Dr. 450, City, www.versant.com | 650-232-2400 #NoSQLVersant
  • 2. Overview NoSQL at it’s Core SQ C Pole-Position – Overview About the Code Circuits Description RDB JPA Code MongoDB Code Versant JPA Code V t C d Results – Winners of the Race Developer Challenge #NoSQLVersant
  • 3. NoSQL at its core #NoSQLVersant
  • 4. Traditional DBMS Scale Architecture INEFFICIENT CPU destroying Mapping EXPENSIVE Repetitive data movement and JOIN calculation #NoSQLVersant
  • 5. NoSQL at its Core A Shift In Application Architecture UNIFED Application  A li ti driven schema COMMODITY HW COMMODITY HW Horizontal scale out,  distribution and  partitioning • Google – Soft-Schema • IBM – Schema-Less #NoSQLVersant
  • 6. A Shift is Needed ► How Often do Relations Change? g Blog : BlogEntry , Order : OrderItem , You : Friend ► R l ti Relations R l Ch Rarely Change, St R Stop Recalculating Th l l ti Them ► Do you need ALL o you da a in o e p ace o eed of your data one place. ► You don’t. You can distribute it. #NoSQLVersant
  • 7. Measured V l M d Value How NoSQL performance stacks up to Relational #NoSQLVersant
  • 8. PolePosition Performance Benchmark ► Established in 2003 NoSQL N SQL -vs- ORM ► Code Complexity Circuits Flat Obj t Fl t Objects Graphs Inherited Objects Collections ► Data Operations CRUD Concurrency ► Scalability #NoSQLVersant
  • 9. Contenders | Methodology ► Contenders ORM NoSQL ► Methodology External RDB Experts, Internal NoSQL Experts Open Source Benchmark Code for all contenders #NoSQLVersant
  • 10. About the Code ► ORM Common Code Base ► Tested Database Engines Hibernate – MySQL / Postgres OpenJPA – MySQL / Postgres MongoDB Versant Object Database #NoSQLVersant
  • 11. Circuit Structure ► Simulate CRUD on embedded graph of different Classes. ► Cl Class model - C d l Complex Ci it l Circuit: class Holder0 {  String _name;  String name; List <Holder0> _children; Holder0[] _array; }  class Holder1 extends Holder0 {  { int _i1; }  class Holder2 extends Holder1 {  int _i2 <indexed>; }     ...class HolderN extends….. #NoSQLVersant
  • 12. Hibernate JPA Code ► Write – Generates Holder’s to user spec depth ComplexHolder cp = new ComplexHolder( );   em.makePersistent(cp); ► Read – Access root of graph and traverse cp = em.find( ComplexHolder.class, id ); cp.getChildren().touch(); ► Query String query  String query = "from from  org.polepos.teams.hibernate.data.Holder2 where i2=" +  currentInt;    Iterator it =  em.iterate(query);  ► Delete – Deletes Graph - cascading operation #NoSQLVersant
  • 13. ORM JPA Mapping XML Mapping File for each Persistent Class ( 11ea Files ) - <hibernate-mapping package="org.polepos.teams.hibernate.data" default-cascade="none" default-access="property" default-lazy="true" auto-import="true"> - <class name="ComplexHolder0" table="tComplexHolderNew0" polymorphism="implicit" mutable="true" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version"> ti i ti l k " i "> <id name="id" column="fid" type="long" /> - <discriminator type="string" not-null="true" force="false" insert="true"> <column name="DISCRIMINATOR" /> </discriminator> <property name="name" column="fname" type="string" unique="false" optimistic-lock="true" lazy="false" generated="never" /> - <list name="children" access="field" cascade="all" inverse="false" mutable="true" optimistic-lock="true" embed-xml="true"> <key column="parentId" on-delete="noaction" /> <index l <i d column="elementIndex" /> " l tI d " <many-to-many class="ComplexHolder0" embed-xml="true" not-found="exception" unique="false" /> </list> - <array name="array" access="field" cascade="all" inverse="false" mutable="true" optimistic-lock="true" embed-xml="true"> <key column="parentId" on-delete="noaction" /> <index column="elementIndex" /> <many-to-many class="ComplexHolder0" embed-xml="true" not-found="exception" unique="false" /> </array> - <subclass name="ComplexHolder1" discriminator-value="D" dynamic-update="false" dynamic insert="false" select before update="false"> discriminator value="D" dynamic update="false" dynamic-insert="false" select-before-update="false"> <property name="i1" column="i1" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" /> - <subclass name="ComplexHolder2" discriminator-value="E" dynamic-update="false" dynamic-insert="false" select-before-update="false"> <property name="i2" column="i2" type="int" index="i2_idx" unique="false" optimistic-lock="true" lazy="false" generated="never" /> - <subclass name="ComplexHolder3" discriminator-value="F" dynamic-update="false" dynamic-insert="false" select-before-update="false"> <property name="i3" column="i3" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" /> - <subclass name="ComplexHolder4" discriminator-value="G" dynamic-update="false" dynamic-insert="false" select-before-update="false"> <property name="i4" column="i4" type="int" unique="false" optimistic-lock="true" lazy="false" generated="never" /> </subclass> </subclass> </subclass> </subclass> </class> </hibernate-mapping> #NoSQLVersant
  • 14. MongoDB Code private void storeData(Mongo mongo) { collection(mongo).insert(new BasicDBObject("test", "object")); } public ComplexHolder0 convertFromDocument(DBObject data, DeserializationOptions deserializationOption) { ComplexHolder0 instance = createInstance(getAsString(data, TYPE_ATTRIBUTE)); instance.setName(getAsString(data, NAME_ATTRIBUTE)); if ( ll ! d t (null != data.get(CHILDREN)) { t(CHILDREN)) { instance.setChildren(fromMongoObjectToList(getAsList(data, CHILDREN),  deserializationOption)); } if (null != data.get(ARRAY)) { final List<ComplexHolder0> arrayContent = fromMongoObjectToList(getAsList(data,  p y g j (g ( , ARRAY), deserializationOption); instance.setArray(arrayContent.toArray(new ComplexHolder0[arrayContent.size()])); } readAttributes(data, instance); return instance; }  #NoSQLVersant
  • 15. MongoDB Mapping private static void writeSubTypeAttributes(ComplexHolder0 holder,  BasicDBObject dataStorage) { if (h ld (holder instanceof ComplexHolder1) { i t f l ld ) { dataStorage.put(FIELD_I1, ((ComplexHolder1) holder)._i1); } if (holder instanceof ComplexHolder2) { dataStorage.put(FIELD_I2, ((ComplexHolder2) holder)._i2); d t St t(FIELD I2 ((C l H ld 2) h ld ) i2) } private static void readAttributes(DBObject dataStorage, ComplexHolder0  holder) { holder) { if (holder instanceof ComplexHolder1) { ((ComplexHolder1) holder)._i1 = (Integer)  dataStorage.get(FIELD_I1); } if (holder instanceof ComplexHolder2) { ((ComplexHolder2) holder)._i2 = (Integer)  dataStorage.get(FIELD_I2); } #NoSQLVersant
  • 16. g _ Holder0.class.getPackage().getName(); nal String NAME_ATTRIBUTE = "name"; nal String CHILDREN = "children"; nal String ARRAY = "array"; nal String REFERENCE_TO_ORIGINAL_DOCUMENT = "_refToOriginal"; nal String FIELD_I1 = "_i1"; nal String FIELD_I2 = "_i2"; nal String FIELD_I3 = "_i3"; nal String FIELD_I4 = "_i4"; MongoDB Mapping inal OneArgFunction<BasicDBObject, DBRef> refCreator; tion(OneArgFunction<BasicDBObject, DBRef> refCreator) { refCreator = refCreator; atic Serialisation create(OneArgFunction<BasicDBObject, DBRef>  tor) { ull == refCreator) { hrow new ArgumentNullException("requires a reference creator"); n new Serialisation(refCreator); atic OneArgFunction<BasicDBObject, DBRef>  eferenceCreator(final DBCollection collection) { ull == collection) { hrow new ArgumentNullException("requires a collection"); n new OneArgFunction<BasicDBObject, DBRef>() { Override ublic DBRef invoke(BasicDBObject basicDBObject) { final DB db = collection.getDB(); final Object id = basicDBObject.get("_id"); if (null == id) { throw new IllegalStateException("Expected an '_id' on the  ); } return new DBRef(db, collection.getName(), id); ( , g (), ); #NoSQLVersant
  • 17. Versant JPA Code ► Write – Generates Holder’s to user spec depth p p ComplexHolder cp = new ComplexHolder( );   em.makePersistent(cp); ► Read – Access root of graph and traverse cp = em.find( ComplexHolder.class, id );    cp.getChildren().touch(); ► Q Query String query = "from org.polepos.teams.versant.data.Holder2  where i2=" + currentInt;    Iterator it =  session.iterate(query);  i i ( ) ► Delete – Deletes Graph – Cascading Operation #NoSQLVersant
  • 18. Versant JPA Mapping Single XML File with primitive declaration entries <class name="ComplexHolder0"> <field name name /> <field name="name" /> <field name="array" /> <field name="children"> <collection element‐ type="ComplexHolder0"/> </field> </class> #NoSQLVersant
  • 19. Sh@t’s and Grins ► JDBC Code JDBC StringBuilder sb = new StringBuilder(); sb.append("select " +  HOLDER_TABLE0 + ".id from " + HOLDER_TABLE0); sb.append(" INNER  JOIN " + HOLDER_TABLES[0]); sb.append(" on " + HOLDER_TABLE0 +  ".id =   "  + HOLDER_TABLES[0] +  ".id "); sb.append("  INNER JOIN  "   .id  + HOLDER TABLES[0] + .id  ); sb.append( INNER JOIN + HOLDER_TABLES[1]); sb.append(" on " + HOLDER_TABLE0 + ".id = "  + HOLDER_TABLES[1] + ".id "); sb.append(" LEFT OUTER JOIN " +  HOLDER_TABLES[2]); sb.append(" on " + HOLDER_TABLE0 + ".id = " +  HOLDER_TABLES[2] + ".id "); sb.append(" LEFT OUTER JOIN " +  HOLDER_TABLES[3]); sb.append( on HOLDER TABLES[3]); sb.append("  on  "  + HOLDER_TABLE0 +  ".id =   "  +  + HOLDER TABLE0 + .id  + HOLDER_TABLES[3] + ".id "); sb.append(" where " +  HOLDER_TABLES[1] + ".i2 = ?"); PreparedStatement stat =  prepareStatement(sb.toString()); ResultSet resultSet stat.executeQuery();  #NoSQLVersant
  • 21. FlatObject - Single Thread #NoSQLVersant
  • 22. Results – ComplexConcurrency @mongo - no safe mode #NoSQLVersant
  • 23. Results – QueryConcurrency @mongo – no safe mode #NoSQLVersant
  • 24. Results – InsertConcurrent @mongo – no safe mode #NoSQLVersant
  • 25. Results – ComplexConcurrency @mongo – safe mode #NoSQLVersant
  • 26. Results – QueryConcurrency @mongo – safe mode #NoSQLVersant
  • 27. Results – InsertConcurrent @mongo – safe mode #NoSQLVersant
  • 28. Conclusions ► Wake-up, smell the coffee p, JOINs are not needed - unless adhoc analytics ► Take care of business, dump a load of code Serialization is bad, data useful once structured Mapping is Mapping, even when it’s not an ORM ► Get on your Bad Motor Scooter and Ride NoSQL without Mapping rules the road Get the Code: http://www.polepos.org #NoSQLVersant
  • 29. Q&A #NoSQLVersant
  • 30. Contact Robert Greene Vice President, Technology rgreene@versant.com @ t NoSQL Now! – Booth # SQ #14 #NoSQLVersant