SlideShare a Scribd company logo
Java straitjackets for
MongoDB
Alexey Zinovyev, Java Trainer
About
I am a <graph theory, machine learning,
traffic jams prediction, BigData algorithms>
scientist
But I'm a <Java, NoSQL, Hadoop, Spark>
programmer
Raise your hands if you ..
•use Hibernate & Spring
Raise your hands if you ..
•use Hibernate & Spring
• keep your data in MongoDB
Raise your hands if you ..
•use Hibernate & Spring
• keep your data in MongoDB
• use only Java Driver for Mongo
Raise your hands if you ..
•use Hibernate & Spring
• keep your data in MongoDB
• use only Java Driver for Mongo
• write your own mapping from Java objects to
BSON
7Joker 2015
Let’s do this with Mongo’D
8Joker 2015
The Good Old Days
9Joker 2015
One of these fine days...
10Joker 2015
We have a NoSQL job for you, son!
11Joker 2015
But you like SQL and HATE nontraditional data
12Joker 2015
Typical situation, isn’t it?
13Joker 2015
Let’s talk about it, Java - boy...
NOSQL
15Joker 2015
What’s the problem with RBDMS’s
• Caching
• Master/Slave
• Cluster
• Table Partitioning
• Sharding
16Joker 2015
Try to find
Mongo
17Joker 2015
Homo
Mongous
18Joker 2015
Fashion and trend
19Joker 2015
Gentle NoSQL
• Scalability
20Joker 2015
Gentle NoSQL
• Scalability
• Nodes and Data Centers
21Joker 2015
Gentle NoSQL
• Scalability
• Nodes and Data Centers
• Easy to add new server
22Joker 2015
Gentle NoSQL
• Scalability
• Nodes and Data Centers
• Easy to add new server
• Specific data model
23Joker 2015
Gentle NoSQL
• Scalability
• Nodes and Data Centers
• Easy to add new server
• Specific data model
• Eventual consistency
24Joker 2015
Comparison criteria
• Education curve
• Performance
• Drivers & frameworks
• Hadoop integration
• Mobile client
25Joker 2015
But what about .. “ACID”?
26Joker 2015
ACID in SQL
27Joker 2015
Atomicity in NoSQL
• read-write-modify (CAS)
• key/row manipulation is atomic
• API for atomic operations
• bad support of transactions (play with 2 phase commit)
28Joker 2015
BASE
• basic availability – all queries will be finished
• soft state – state can be changed without writing
• eventual consistency
MONGO DB
30Joker 2015
BSON (something like JSON)
• Adds data types that JSON did not support – (ISO Dates,
ObjectId, etc.)
• Optimized for performance
• Adds compression
31Joker 2015
Mongo: pro and contra
❏ Full-featured query
language
❏ Aggregation framework
❏ Big variety of indexes
❏ Replication and sharding
❏ Documentation
★ Limit for document size
(16 mb)
★ Complex cluster schema
★ No joins
32Joker 2015
Is Mongo terrible?
• Stability?
• JavaScript at the bottom
• Something new
• Low barrier for entry
• Easy to lose your data
DBA
programmer
34Joker 2015
The Database and programmers
JAVA DRIVER API
36Joker 2015
INSERT
Mongo mongo = new Mongo(…);
DB db = mongo.getDB("myDb");
Collection collection = db.getCollection(“customers");
37Joker 2015
INSERT
Mongo mongo = new Mongo(…);
DB db = mongo.getDB("myDb");
Collection collection = db.getCollection(“customers");
DBObject hotel = new BasicDBObject();
address.put(“name”, “ParkInn”);
38Joker 2015
INSERT
Mongo mongo = new Mongo(…);
DB db = mongo.getDB("myDb");
Collection collection = db.getCollection(“customers");
DBObject hotel = new BasicDBObject();
address.put(“name”, “ParkInn”);
DBObject person = new BasicDBObject();
person.put("firstname”, “Alexey”);
person.put("lastname”, “Zinoviev”);
person.put(“hotel”, hotel);
collection.save(person);
39Joker 2015
SELECT with Filter
DBObject query = new BasicDBObject();
query.put(“hotel.name”, “ParkInn”);
DBCursor cursor = collection.find(query);
for (DBObject element : cursor) {
// Map data onto object
}
40Joker 2015
Async call
41Joker 2015
But.. how about @ and JPA and ..
MORPHIA
43Joker 2015
Morphia
Object Document Mapper
• Specifed with annotations
• Implemented with reflection
• Runtime validation
44Joker 2015
Morphia advantages
• Integrated with Spring, Guice and other DI frameworks
45Joker 2015
Morphia advantages
• Integrated with Spring, Guice and other DI frameworks
• Lifecycle Method Annotations (@PrePersist, @PostLoad)
46Joker 2015
Morphia advantages
• Integrated with Spring, Guice and other DI frameworks
• Lifecycle Method Annotations (@PrePersist, @PostLoad)
• Built on top of Mongo Java Driver
47Joker 2015
Morphia advantages
• Integrated with Spring, Guice and other DI frameworks
• Lifecycle Method Annotations (@PrePersist, @PostLoad)
• Built on top of Mongo Java Driver
• More better than old-style queries by BSON-object
48Joker 2015
Morphia advantages
• Integrated with Spring, Guice and other DI frameworks
• Lifecycle Method Annotations (@PrePersist, @PostLoad)
• Built on top of Mongo Java Driver
• More better than old-style queries by BSON-object
• Query API: ds.createQuery(MyEntity.class)
.filter("foo >",12)
.order("date, -foo");
49Joker 2015
Model
@Entity(“customers")
class Customer {
@Id String taxId;
Date memberSince;
boolean active;
int followers;
List<String> following;
}
50Joker 2015
Model with embedded entity
@Entity(“customers")
class Customer {
@Id String taxId;
Name name;
Date memberSince;
boolean active;
int followers;
List<String> following;
}
@Embedded
class Name {
String first, last;
}
51Joker 2015
Save
Customer customer = new Customer();
customer.taxId = "zaleslaw";
customer.name = new Name("Alexey", "Zinoviev");
customer.memberSince = dateFmt.parse("Aug 12, 2009");
customer.active = true;
customer.followers = 8;
customer.following = Arrays.asList("Boris", "Tor");
ds.save(customer);
52Joker 2015
Read from database
> db.customers.findOne()
{
"_id" : “zaleslaw",
"className" : "demo.Customer",
"name" : {
"first" : "Alexey",
"last" : "Zinoviev"
},
"memberSince" : ISODate("2009-08-12T04:00:00Z"),
"active" : true,
"followers" : 8,
"following" : [
"Boris",
"Tor"
]
}
53Joker 2015
Find by filter
ds.find(Customer.class).
field("since").lessThan(dateFmt.parse("Jan 1, 2010")).
field("followers").greaterThan(0)
54Joker 2015
Polymorphism
public abstract class EmployeeEntity {
protected String name;
}
public class ManagerEntity extends EmployeeEntity {
protected Boolean approveFunds;
}
public class WorkerEntity extends EmployeeEntity {
protected Integer yearsExperience;
}
55Joker 2015
Polymorphism in RDBMs
56Joker 2015
Polymorphism in RDBMs
1. Union table with (many) NULL values
57Joker 2015
Polymorphism in RDBMs
1. Union table with (many) NULL values
2. Concrete instances without common queries
58Joker 2015
Polymorphism in RDBMs
1. Union table with (many) NULL values
2. Concrete instances without common queries
3. Base table joined with all subtables
59Joker 2015
Polymorphism with Morphia
@Entity(value = "employee", noClassnameStored = false)
public abstract class EmployeeEntity {
@Id
protected ObjectId id;
protected String name;
}
public class ManagerEntity extends EmployeeEntity {
protected Boolean approveFunds;
}
public class WorkerEntity extends EmployeeEntity {
protected Integer yearsExperience;
}
60Joker 2015
Meanwhile in Mongo
{
"_id": ObjectId("5461c8bf9e2acf32ed5ab079"),
"className": "entities.ManagerEntity",
"name": “Alex",
"approveFunds": true
}
{
"_id": ObjectId("524d9fe7e4b0f8bd3031f89e"),
"className": "entities.WorkerEntity",
"name": “Max",
"yearsExperience": 100
}
61Joker 2015
SELECTs
public EmployeeEntity findByEmail(final String email) {
return mongoDatastore.find(EmployeeEntity.class)
.field("email").equal(email).get();
}
public List<EmployeeEntity> getAllEmployees() {
return mongoDatastore.find(EmployeeEntity.class).asList();
}
public List<ManagerEntity> getAllManagers() {
return mongoDatastore.find(ManagerEntity.class)
.disableValidation()
.field("className").equal(ManagerEntity.class.getName())
.asList();
62Joker 2015
It’s Time for Java Superhero, yeah!
SPRING DATA
64Joker 2015
One faith, one Spring for ages!
65Joker 2015
Spring Data
• Templating : connection configs, collection lifecycle
(create, drop), Map/Reduce + Aggregation
• Mapping: @Document, @Index, @Field
• Repository support: geospatial queries, queries derived
from method signatures (at runtime)
• Paging, sorting, CRUD operations
66Joker 2015
All we need in configs
67Joker 2015
Advanced configs
<mongo:mongo host="${mongo.host}" port="${mongo.port}">
<mongo:options
connections-per-host="${mongo.connectionsPerHost}„
threads-allowed-to-block-for-connection
multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}„
connect-timeout="${mongo.connectTimeout}„
max-wait-time="${mongo.maxWaitTime}„
auto-connect-retry="${mongo.autoConnectRetry}„
socket-keep-alive="${mongo.socketKeepAlive}„
socket-timeout="${mongo.socketTimeout}„
slave-ok="${mongo.slaveOk}„
write-number="1„
write-timeout="0„
write-fsync="true"/>
</mongo:mongo>
<mongo:db-factorydbname= "test" mongo-ref="mongo"/>
68Joker 2015
Entity Mapping
@Document
class Customer {
@Id private BigInteger id;
@Indexed private String firstname, lastname;
@Field("email") private String emailAddress;
@DBRef private Set<Customer> contacts;
public Person(String firstname) { … }
@PersistenceConstructor
public Customer(String firstname, String lastname) { … }
…
}
69Joker 2015
Mongo operations
public interface MongoOperations {
// Generic callback-accepting methods
<T> T execute(DbCallback<T> action);
<T> T execute(Class<?> entityClass, CollectionCallback<T> action);
<T> T execute(String collectionName, CollectionCallback<T> action);
}
70Joker 2015
Mongo operations
public interface MongoOperations {
// Generic callback-accepting methods
<T> T execute(DbCallback<T> action);
<T> T execute(Class<?> entityClass, CollectionCallback<T> action);
<T> T execute(String collectionName, CollectionCallback<T> action);
// Higher level access methods
<T> List<T> find(Query query, Class<T> entityClass);
void save(Object objectToSave, String collectionName);
WriteResult updateFirst(Query query, Update update, Class<?>
entityClass);
}
71Joker 2015
Template usage
Mongo mongo = new Mongo();
MongoDbFactory factory = new SimpleMongoDbFactory(mongo, „customers“);
MongoTemplate template = new MongoTemplate(factory);
72Joker 2015
Template usage
Mongo mongo = new Mongo();
MongoDbFactory factory = new SimpleMongoDbFactory(mongo, „customers“);
MongoTemplate template = new MongoTemplate(factory);
Customer me = new Customer (“Alexey", “Zinoviev");
me.setEmailAddress(“Alexey_Zinovyeve@epam.com");
template.save(me);
73Joker 2015
Template usage
Mongo mongo = new Mongo();
MongoDbFactory factory = new SimpleMongoDbFactory(mongo, „customers“);
MongoTemplate template = new MongoTemplate(factory);
Customer me = new Customer (“Alexey", “Zinoviev");
me.setEmailAddress(“Alexey_Zinovyeve@epam.com");
template.save(me);
Query query = new Query(new Criteria("emailAddress")
.is("Alexey_Zinovyeve@epam.com"));
assertThat(template.find(query), is(me));
74Joker 2015
Spring Repositories : it does all job
• Uses a method-naming convention that Spring interprets
during implementation
• Hides complexities of Spring Data templates
• Builds implementation for you based on interface design
• Implementation is built during Spring container load.
75Joker 2015
Typical JPA Repository
public interface PersonRepository extends Repository<Person, BigInteger>
{
// Finder for a single entity
Person findByEmailAddress(String emailAddress);
// Finder for multiple entities
List<Person> findByLastnameLike(String lastname);
// Finder with pagination
Page<Person> findByFirstnameLike(String firstname, Pageable page);
}
76Joker 2015
Mongo Repository
public interface PersonRepository extends Repository<Person, BigInteger>
{
// Finder for a single entity
Person findByEmailAddress(String emailAddress);
// Finder for multiple entities
List<Person> findByLastnameLike(String lastname);
// Finder with pagination
Page<Person> findByFirstnameLike(String firstname, Pageable page);
// Geospatial queries
List<Person> findByLocationNear(Point location, Distance distance);
GeoResults<Person> findByLocationNear(Point location);
}
77Joker 2015
Let’s autowire it!
@Component
public class MyClient {
@Autowired
private PersonRepository repository;
public List<Person> doSomething() {
Point point = new Point(55.7, 70.8);
Distance distance = new Distance(200, Metrics.KILOMETERS);
return repository.findByLocationNear(point, distance);
}
}
JONGO
79Joker 2015
Jongo
• Jackson and BSON4Jackson for (Un)marshalling
• No JPA / Hibernate style
• Query in Java as in Mongo Shell
80Joker 2015
Jongo : find
db.users.find( { $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] } )
Iterable<User> users = collection.find ("{ $or : [ { age :
{$gt:20,$lt:30} } , { age : {$gt:50,$lt:60} } ] } ").as(User.class);
81Joker 2015
Java Driver API
DB db = mongo.getDB("users");
DBCollection collection = db.getCollection("users");
DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get();
DBObject secondQuery = QueryBuilder.start("age").greaterThan(50).lessThan(60).get();
DBObject query = QueryBuilder.start().or(firstQuery,secondQuery).get();
DBCursor results = collection.find(query);
List<User> users = new ArrayList<User>();
for (DBObject result : results) {
User user = new User();
user.setUsername((String) result.get("username"));
user.setAge((Integer) result.get("age"));
users.add(user);
}
82Joker 2015
Jongo : aggregation
MongoCollection collection = new Jongo(db).getCollection("emails");
collection.aggregate(“ {$project:{sender:1}} ")
.and(“ {$match:{tags:'read'}} ")
.and(“ {$limit:10} ")
.as(Email.class);
WHAT ABOUT
HIBERNATE?
84Joker 2015
Hibernate in NoSQL world (by Hibernate opinion)
85Joker 2015
Hibernate in NoSQL world (in reality)
86Joker 2015
Hibernate OGM
• Java Persistence (JPA) support for NoSQL solutions
• JP-QL queries are converted in native backend queries
• Hibernate Search as indexing engine and use full-text
queries
• You can call flush(), commit() and demarcate transactions
• It supports only MongoDB, Neo4j, Infinispan, Ehcache
87Joker 2015
Data cycle
88Joker 2015
OGM mapping
@Entity
@NamedQuery(
name="byItemsQuantity",
query = "SELECT o FROM Order o JOIN o.items i WHERE i.quantity = :quantity"
)
public class Order {
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Id private String id;
private Date date;
@Column(name = "custInfo") private String customerInfo;
@ElementCollection
private List<Item> items;
POLYGLOT PERSISTANCE
90Joker 2015
Different databases in one project
• RBDMS: Needs transactional updates and has tabular structure
• Riak: Needs high availability across multiple locations. Can merge
inconsistent writes
• MongoDB: Lots of reads, infrequent writes. Powerful aggregation
mechanism
• Cassandra: Large-scale analytics on large cluster. High volume of
writes on multiple nodes
91Joker 2015
Your application, isn’t it?
92Joker 2015
Kundera
• Atomicity guarantee and Transaction management
• Strictly JPA 2.1 compatible
• It supports Cassandra, Mongo, Hbase, Redis, Neo4j and etc
• @Embedded and @ElementCollection for ColumnFamily and nested
documents
• OneToMany, OneToOne, ManyToMany relationships
• Not full JPQL support for different database
93Joker 2015
Kundera
94Joker 2015
It solves all problems!
IN CONCLUSION
96Joker 2015
Other tools
• EclipseLink : different support of different NoSQL
databases
• MJORM : Google Code, XML mapping + MQL (SQL syntax
for Mongo data extracting)
• DataNucleus : support many J as JDO, JPA
97Joker 2015
Abstraction vs Standardization
98Joker 2015
In conclusion
• Think about your data
99Joker 2015
In conclusion
• Think about your data
• Understand you project needs
100Joker 2015
In conclusion
• Think about your data
• Understand you project needs
• Choose right framework
101Joker 2015
In conclusion
• Think about your data
• Understand you project needs
• Choose right framework
• Know & use MongoDB features
102Joker 2015
Listen to your heart … DATA
103Joker 2015
CALL ME
IF YOU WANT TO KNOW MORE
Thanks a lot
104Joker 2015
Contacts
E-mail : Alexey_Zinovyev@epam.com
Twitter : @zaleslaw
LinkedIn: https://www.linkedin.com/in/zaleslaw

More Related Content

What's hot

MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring DataAnton Sulzhenko
 
SDEC2011 NoSQL Data modelling
SDEC2011 NoSQL Data modellingSDEC2011 NoSQL Data modelling
SDEC2011 NoSQL Data modellingKorea Sdec
 
NoSQL Tel Aviv Meetup#1: NoSQL Data Modeling
NoSQL Tel Aviv Meetup#1: NoSQL Data ModelingNoSQL Tel Aviv Meetup#1: NoSQL Data Modeling
NoSQL Tel Aviv Meetup#1: NoSQL Data Modeling
NoSQL TLV
 
ACADGILD:: HADOOP LESSON
ACADGILD:: HADOOP LESSON ACADGILD:: HADOOP LESSON
ACADGILD:: HADOOP LESSON
Padma shree. T
 
NoSQL Endgame JCON Conference 2020
NoSQL Endgame JCON Conference 2020NoSQL Endgame JCON Conference 2020
NoSQL Endgame JCON Conference 2020
Thodoris Bais
 
EclipseCon 2021 NoSQL Endgame
EclipseCon 2021 NoSQL EndgameEclipseCon 2021 NoSQL Endgame
EclipseCon 2021 NoSQL Endgame
Thodoris Bais
 
NoSQL Endgame DevoxxUA Conference 2020
NoSQL Endgame DevoxxUA Conference 2020NoSQL Endgame DevoxxUA Conference 2020
NoSQL Endgame DevoxxUA Conference 2020
Thodoris Bais
 
Building Spring Data with MongoDB
Building Spring Data with MongoDBBuilding Spring Data with MongoDB
Building Spring Data with MongoDBMongoDB
 
20170624 GraphQL Presentation
20170624 GraphQL Presentation20170624 GraphQL Presentation
20170624 GraphQL Presentation
Martin Heidegger
 
Modeling JSON data for NoSQL document databases
Modeling JSON data for NoSQL document databasesModeling JSON data for NoSQL document databases
Modeling JSON data for NoSQL document databases
Ryan CrawCour
 

What's hot (10)

MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring Data
 
SDEC2011 NoSQL Data modelling
SDEC2011 NoSQL Data modellingSDEC2011 NoSQL Data modelling
SDEC2011 NoSQL Data modelling
 
NoSQL Tel Aviv Meetup#1: NoSQL Data Modeling
NoSQL Tel Aviv Meetup#1: NoSQL Data ModelingNoSQL Tel Aviv Meetup#1: NoSQL Data Modeling
NoSQL Tel Aviv Meetup#1: NoSQL Data Modeling
 
ACADGILD:: HADOOP LESSON
ACADGILD:: HADOOP LESSON ACADGILD:: HADOOP LESSON
ACADGILD:: HADOOP LESSON
 
NoSQL Endgame JCON Conference 2020
NoSQL Endgame JCON Conference 2020NoSQL Endgame JCON Conference 2020
NoSQL Endgame JCON Conference 2020
 
EclipseCon 2021 NoSQL Endgame
EclipseCon 2021 NoSQL EndgameEclipseCon 2021 NoSQL Endgame
EclipseCon 2021 NoSQL Endgame
 
NoSQL Endgame DevoxxUA Conference 2020
NoSQL Endgame DevoxxUA Conference 2020NoSQL Endgame DevoxxUA Conference 2020
NoSQL Endgame DevoxxUA Conference 2020
 
Building Spring Data with MongoDB
Building Spring Data with MongoDBBuilding Spring Data with MongoDB
Building Spring Data with MongoDB
 
20170624 GraphQL Presentation
20170624 GraphQL Presentation20170624 GraphQL Presentation
20170624 GraphQL Presentation
 
Modeling JSON data for NoSQL document databases
Modeling JSON data for NoSQL document databasesModeling JSON data for NoSQL document databases
Modeling JSON data for NoSQL document databases
 

Viewers also liked

Spring Data in a Nutshell
Spring Data in a NutshellSpring Data in a Nutshell
Spring Data in a NutshellTsuyoshi Miyake
 
HappyDev'15 Keynote: Когда все данные станут большими...
HappyDev'15 Keynote: Когда все данные станут большими...HappyDev'15 Keynote: Когда все данные станут большими...
HappyDev'15 Keynote: Когда все данные станут большими...
Alexey Zinoviev
 
JPoint'15 Mom, I so wish Hibernate for my NoSQL database...
JPoint'15 Mom, I so wish Hibernate for my NoSQL database...JPoint'15 Mom, I so wish Hibernate for my NoSQL database...
JPoint'15 Mom, I so wish Hibernate for my NoSQL database...
Alexey Zinoviev
 
JavaDayKiev'15 Java in production for Data Mining Research projects
JavaDayKiev'15 Java in production for Data Mining Research projectsJavaDayKiev'15 Java in production for Data Mining Research projects
JavaDayKiev'15 Java in production for Data Mining Research projects
Alexey Zinoviev
 
OAuth In The Real World : 10 actual implementations you can't guess
OAuth In The Real World : 10 actual implementations you can't guessOAuth In The Real World : 10 actual implementations you can't guess
OAuth In The Real World : 10 actual implementations you can't guessMehdi Medjaoui
 
NEPHP '12: Create a RESTful API
NEPHP '12: Create a RESTful APINEPHP '12: Create a RESTful API
NEPHP '12: Create a RESTful APIAndrew Curioso
 
MongoDB - The database strikes back
MongoDB - The database strikes back MongoDB - The database strikes back
MongoDB - The database strikes back
Steven Cooper
 
Tomboy Web Sync Explained
Tomboy Web Sync ExplainedTomboy Web Sync Explained
Tomboy Web Sync Explained
Mohan Krishnan
 
Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15
Alexey Zinoviev
 
Angular meteor for angular devs
Angular meteor for angular devsAngular meteor for angular devs
Angular meteor for angular devsArc & Codementor
 
Java BigData Full Stack Development (version 2.0)
Java BigData Full Stack Development (version 2.0)Java BigData Full Stack Development (version 2.0)
Java BigData Full Stack Development (version 2.0)
Alexey Zinoviev
 
IBM Social Business Toolkit
IBM Social Business ToolkitIBM Social Business Toolkit
IBM Social Business Toolkit
Van Staub, MBA
 
IBM Digital Experience Theme Customization
IBM Digital Experience Theme CustomizationIBM Digital Experience Theme Customization
IBM Digital Experience Theme Customization
Van Staub, MBA
 
VMUG - Using PowerShell to call RESTful APIs
VMUG - Using PowerShell to call RESTful APIsVMUG - Using PowerShell to call RESTful APIs
VMUG - Using PowerShell to call RESTful APIs
Chris Wahl
 
The never-ending REST API design debate -- Devoxx France 2016
The never-ending REST API design debate -- Devoxx France 2016The never-ending REST API design debate -- Devoxx France 2016
The never-ending REST API design debate -- Devoxx France 2016
Restlet
 
The Present Future of OAuth
The Present Future of OAuthThe Present Future of OAuth
The Present Future of OAuth
Michael Bleigh
 
Hadoop Jungle
Hadoop JungleHadoop Jungle
Hadoop Jungle
Alexey Zinoviev
 
MongoDB Workshop
MongoDB WorkshopMongoDB Workshop
MongoDB Workshop
eagerdeveloper
 
VMUG - Picking Up New Skills - Tips and Tricks to Build Your Technical Tool C...
VMUG - Picking Up New Skills - Tips and Tricks to Build Your Technical Tool C...VMUG - Picking Up New Skills - Tips and Tricks to Build Your Technical Tool C...
VMUG - Picking Up New Skills - Tips and Tricks to Build Your Technical Tool C...
Chris Wahl
 
MongoDb scalability and high availability with Replica-Set
MongoDb scalability and high availability with Replica-SetMongoDb scalability and high availability with Replica-Set
MongoDb scalability and high availability with Replica-Set
Vivek Parihar
 

Viewers also liked (20)

Spring Data in a Nutshell
Spring Data in a NutshellSpring Data in a Nutshell
Spring Data in a Nutshell
 
HappyDev'15 Keynote: Когда все данные станут большими...
HappyDev'15 Keynote: Когда все данные станут большими...HappyDev'15 Keynote: Когда все данные станут большими...
HappyDev'15 Keynote: Когда все данные станут большими...
 
JPoint'15 Mom, I so wish Hibernate for my NoSQL database...
JPoint'15 Mom, I so wish Hibernate for my NoSQL database...JPoint'15 Mom, I so wish Hibernate for my NoSQL database...
JPoint'15 Mom, I so wish Hibernate for my NoSQL database...
 
JavaDayKiev'15 Java in production for Data Mining Research projects
JavaDayKiev'15 Java in production for Data Mining Research projectsJavaDayKiev'15 Java in production for Data Mining Research projects
JavaDayKiev'15 Java in production for Data Mining Research projects
 
OAuth In The Real World : 10 actual implementations you can't guess
OAuth In The Real World : 10 actual implementations you can't guessOAuth In The Real World : 10 actual implementations you can't guess
OAuth In The Real World : 10 actual implementations you can't guess
 
NEPHP '12: Create a RESTful API
NEPHP '12: Create a RESTful APINEPHP '12: Create a RESTful API
NEPHP '12: Create a RESTful API
 
MongoDB - The database strikes back
MongoDB - The database strikes back MongoDB - The database strikes back
MongoDB - The database strikes back
 
Tomboy Web Sync Explained
Tomboy Web Sync ExplainedTomboy Web Sync Explained
Tomboy Web Sync Explained
 
Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15Мастер-класс по BigData Tools для HappyDev'15
Мастер-класс по BigData Tools для HappyDev'15
 
Angular meteor for angular devs
Angular meteor for angular devsAngular meteor for angular devs
Angular meteor for angular devs
 
Java BigData Full Stack Development (version 2.0)
Java BigData Full Stack Development (version 2.0)Java BigData Full Stack Development (version 2.0)
Java BigData Full Stack Development (version 2.0)
 
IBM Social Business Toolkit
IBM Social Business ToolkitIBM Social Business Toolkit
IBM Social Business Toolkit
 
IBM Digital Experience Theme Customization
IBM Digital Experience Theme CustomizationIBM Digital Experience Theme Customization
IBM Digital Experience Theme Customization
 
VMUG - Using PowerShell to call RESTful APIs
VMUG - Using PowerShell to call RESTful APIsVMUG - Using PowerShell to call RESTful APIs
VMUG - Using PowerShell to call RESTful APIs
 
The never-ending REST API design debate -- Devoxx France 2016
The never-ending REST API design debate -- Devoxx France 2016The never-ending REST API design debate -- Devoxx France 2016
The never-ending REST API design debate -- Devoxx France 2016
 
The Present Future of OAuth
The Present Future of OAuthThe Present Future of OAuth
The Present Future of OAuth
 
Hadoop Jungle
Hadoop JungleHadoop Jungle
Hadoop Jungle
 
MongoDB Workshop
MongoDB WorkshopMongoDB Workshop
MongoDB Workshop
 
VMUG - Picking Up New Skills - Tips and Tricks to Build Your Technical Tool C...
VMUG - Picking Up New Skills - Tips and Tricks to Build Your Technical Tool C...VMUG - Picking Up New Skills - Tips and Tricks to Build Your Technical Tool C...
VMUG - Picking Up New Skills - Tips and Tricks to Build Your Technical Tool C...
 
MongoDb scalability and high availability with Replica-Set
MongoDb scalability and high availability with Replica-SetMongoDb scalability and high availability with Replica-Set
MongoDb scalability and high availability with Replica-Set
 

Similar to Joker'15 Java straitjackets for MongoDB

Object(ive) Thinking
Object(ive) ThinkingObject(ive) Thinking
Object(ive) Thinking
Michael McGarel
 
moma-django overview --> Django + MongoDB: building a custom ORM layer
moma-django overview --> Django + MongoDB: building a custom ORM layermoma-django overview --> Django + MongoDB: building a custom ORM layer
moma-django overview --> Django + MongoDB: building a custom ORM layer
Gadi Oren
 
MongoDB in the Middle of a Hybrid Cloud and Polyglot Persistence Architecture
MongoDB in the Middle of a Hybrid Cloud and Polyglot Persistence ArchitectureMongoDB in the Middle of a Hybrid Cloud and Polyglot Persistence Architecture
MongoDB in the Middle of a Hybrid Cloud and Polyglot Persistence Architecture
MongoDB
 
使用 Elasticsearch 及 Kibana 進行巨量資料搜尋及視覺化-曾書庭
使用 Elasticsearch 及 Kibana 進行巨量資料搜尋及視覺化-曾書庭使用 Elasticsearch 及 Kibana 進行巨量資料搜尋及視覺化-曾書庭
使用 Elasticsearch 及 Kibana 進行巨量資料搜尋及視覺化-曾書庭
台灣資料科學年會
 
Angular JS, A dive to concepts
Angular JS, A dive to conceptsAngular JS, A dive to concepts
Angular JS, A dive to concepts
Abhishek Sur
 
Spring 4-groovy
Spring 4-groovySpring 4-groovy
Spring 4-groovyGR8Conf
 
Angular JS - Introduction
Angular JS - IntroductionAngular JS - Introduction
Angular JS - Introduction
Sagar Acharya
 
Untangling - fall2017 - week 9
Untangling - fall2017 - week 9Untangling - fall2017 - week 9
Untangling - fall2017 - week 9
Derek Jacoby
 
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Milan 2017 - D...
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Milan 2017 - D...Monitoring Big Data Systems Done "The Simple Way" - Codemotion Milan 2017 - D...
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Milan 2017 - D...
Demi Ben-Ari
 
Demi Ben-Ari - Monitoring Big Data Systems Done "The Simple Way" - Codemotion...
Demi Ben-Ari - Monitoring Big Data Systems Done "The Simple Way" - Codemotion...Demi Ben-Ari - Monitoring Big Data Systems Done "The Simple Way" - Codemotion...
Demi Ben-Ari - Monitoring Big Data Systems Done "The Simple Way" - Codemotion...
Codemotion
 
MongoDB Tick Data Presentation
MongoDB Tick Data PresentationMongoDB Tick Data Presentation
MongoDB Tick Data PresentationMongoDB
 
Discover BigQuery ML, build your own CREATE MODEL statement
Discover BigQuery ML, build your own CREATE MODEL statementDiscover BigQuery ML, build your own CREATE MODEL statement
Discover BigQuery ML, build your own CREATE MODEL statement
Márton Kodok
 
DaZhangJM0203JM0203
DaZhangJM0203JM0203DaZhangJM0203JM0203
DaZhangJM0203JM0203Da Zhang
 
Big Data: Guidelines and Examples for the Enterprise Decision Maker
Big Data: Guidelines and Examples for the Enterprise Decision MakerBig Data: Guidelines and Examples for the Enterprise Decision Maker
Big Data: Guidelines and Examples for the Enterprise Decision Maker
MongoDB
 
Anaconda and PyData Solutions
Anaconda and PyData SolutionsAnaconda and PyData Solutions
Anaconda and PyData Solutions
Travis Oliphant
 
Supercharge your data analytics with BigQuery
Supercharge your data analytics with BigQuerySupercharge your data analytics with BigQuery
Supercharge your data analytics with BigQuery
Márton Kodok
 
AvalancheProject2012
AvalancheProject2012AvalancheProject2012
AvalancheProject2012fishetra
 
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Berlin 2017
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Berlin 2017Monitoring Big Data Systems Done "The Simple Way" - Codemotion Berlin 2017
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Berlin 2017
Demi Ben-Ari
 
node-crate: node.js and big data
 node-crate: node.js and big data node-crate: node.js and big data
node-crate: node.js and big data
Stefan Thies
 
Spring data requery
Spring data requerySpring data requery
Spring data requery
Sunghyouk Bae
 

Similar to Joker'15 Java straitjackets for MongoDB (20)

Object(ive) Thinking
Object(ive) ThinkingObject(ive) Thinking
Object(ive) Thinking
 
moma-django overview --> Django + MongoDB: building a custom ORM layer
moma-django overview --> Django + MongoDB: building a custom ORM layermoma-django overview --> Django + MongoDB: building a custom ORM layer
moma-django overview --> Django + MongoDB: building a custom ORM layer
 
MongoDB in the Middle of a Hybrid Cloud and Polyglot Persistence Architecture
MongoDB in the Middle of a Hybrid Cloud and Polyglot Persistence ArchitectureMongoDB in the Middle of a Hybrid Cloud and Polyglot Persistence Architecture
MongoDB in the Middle of a Hybrid Cloud and Polyglot Persistence Architecture
 
使用 Elasticsearch 及 Kibana 進行巨量資料搜尋及視覺化-曾書庭
使用 Elasticsearch 及 Kibana 進行巨量資料搜尋及視覺化-曾書庭使用 Elasticsearch 及 Kibana 進行巨量資料搜尋及視覺化-曾書庭
使用 Elasticsearch 及 Kibana 進行巨量資料搜尋及視覺化-曾書庭
 
Angular JS, A dive to concepts
Angular JS, A dive to conceptsAngular JS, A dive to concepts
Angular JS, A dive to concepts
 
Spring 4-groovy
Spring 4-groovySpring 4-groovy
Spring 4-groovy
 
Angular JS - Introduction
Angular JS - IntroductionAngular JS - Introduction
Angular JS - Introduction
 
Untangling - fall2017 - week 9
Untangling - fall2017 - week 9Untangling - fall2017 - week 9
Untangling - fall2017 - week 9
 
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Milan 2017 - D...
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Milan 2017 - D...Monitoring Big Data Systems Done "The Simple Way" - Codemotion Milan 2017 - D...
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Milan 2017 - D...
 
Demi Ben-Ari - Monitoring Big Data Systems Done "The Simple Way" - Codemotion...
Demi Ben-Ari - Monitoring Big Data Systems Done "The Simple Way" - Codemotion...Demi Ben-Ari - Monitoring Big Data Systems Done "The Simple Way" - Codemotion...
Demi Ben-Ari - Monitoring Big Data Systems Done "The Simple Way" - Codemotion...
 
MongoDB Tick Data Presentation
MongoDB Tick Data PresentationMongoDB Tick Data Presentation
MongoDB Tick Data Presentation
 
Discover BigQuery ML, build your own CREATE MODEL statement
Discover BigQuery ML, build your own CREATE MODEL statementDiscover BigQuery ML, build your own CREATE MODEL statement
Discover BigQuery ML, build your own CREATE MODEL statement
 
DaZhangJM0203JM0203
DaZhangJM0203JM0203DaZhangJM0203JM0203
DaZhangJM0203JM0203
 
Big Data: Guidelines and Examples for the Enterprise Decision Maker
Big Data: Guidelines and Examples for the Enterprise Decision MakerBig Data: Guidelines and Examples for the Enterprise Decision Maker
Big Data: Guidelines and Examples for the Enterprise Decision Maker
 
Anaconda and PyData Solutions
Anaconda and PyData SolutionsAnaconda and PyData Solutions
Anaconda and PyData Solutions
 
Supercharge your data analytics with BigQuery
Supercharge your data analytics with BigQuerySupercharge your data analytics with BigQuery
Supercharge your data analytics with BigQuery
 
AvalancheProject2012
AvalancheProject2012AvalancheProject2012
AvalancheProject2012
 
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Berlin 2017
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Berlin 2017Monitoring Big Data Systems Done "The Simple Way" - Codemotion Berlin 2017
Monitoring Big Data Systems Done "The Simple Way" - Codemotion Berlin 2017
 
node-crate: node.js and big data
 node-crate: node.js and big data node-crate: node.js and big data
node-crate: node.js and big data
 
Spring data requery
Spring data requerySpring data requery
Spring data requery
 

More from Alexey Zinoviev

Kafka pours and Spark resolves
Kafka pours and Spark resolvesKafka pours and Spark resolves
Kafka pours and Spark resolves
Alexey Zinoviev
 
Joker'16 Spark 2 (API changes; Structured Streaming; Encoders)
Joker'16 Spark 2 (API changes; Structured Streaming; Encoders)Joker'16 Spark 2 (API changes; Structured Streaming; Encoders)
Joker'16 Spark 2 (API changes; Structured Streaming; Encoders)
Alexey Zinoviev
 
Python's slippy path and Tao of thick Pandas: give my data, Rrrrr...
Python's slippy path and Tao of thick Pandas: give my data, Rrrrr...Python's slippy path and Tao of thick Pandas: give my data, Rrrrr...
Python's slippy path and Tao of thick Pandas: give my data, Rrrrr...
Alexey Zinoviev
 
Thorny path to the Large-Scale Graph Processing (Highload++, 2014)
Thorny path to the Large-Scale Graph Processing (Highload++, 2014)Thorny path to the Large-Scale Graph Processing (Highload++, 2014)
Thorny path to the Large-Scale Graph Processing (Highload++, 2014)
Alexey Zinoviev
 
Joker'14 Java as a fundamental working tool of the Data Scientist
Joker'14 Java as a fundamental working tool of the Data ScientistJoker'14 Java as a fundamental working tool of the Data Scientist
Joker'14 Java as a fundamental working tool of the Data Scientist
Alexey Zinoviev
 
First steps in Data Mining Kindergarten
First steps in Data Mining KindergartenFirst steps in Data Mining Kindergarten
First steps in Data Mining Kindergarten
Alexey Zinoviev
 
EST: Smart rate (Effective recommendation system for Taxi drivers based on th...
EST: Smart rate (Effective recommendation system for Taxi drivers based on th...EST: Smart rate (Effective recommendation system for Taxi drivers based on th...
EST: Smart rate (Effective recommendation system for Taxi drivers based on th...
Alexey Zinoviev
 
Android Geo Apps in Soviet Russia: Latitude and longitude find you
Android Geo Apps in Soviet Russia: Latitude and longitude find youAndroid Geo Apps in Soviet Russia: Latitude and longitude find you
Android Geo Apps in Soviet Russia: Latitude and longitude find you
Alexey Zinoviev
 
Keynote on JavaDay Omsk 2014 about new features in Java 8
Keynote on JavaDay Omsk 2014 about new features in Java 8Keynote on JavaDay Omsk 2014 about new features in Java 8
Keynote on JavaDay Omsk 2014 about new features in Java 8
Alexey Zinoviev
 
Big data algorithms and data structures for large scale graphs
Big data algorithms and data structures for large scale graphsBig data algorithms and data structures for large scale graphs
Big data algorithms and data structures for large scale graphs
Alexey Zinoviev
 
"Говнокод-шоу"
"Говнокод-шоу""Говнокод-шоу"
"Говнокод-шоу"
Alexey Zinoviev
 
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Alexey Zinoviev
 
Алгоритмы и структуры данных BigData для графов большой размерности
Алгоритмы и структуры данных BigData для графов большой размерностиАлгоритмы и структуры данных BigData для графов большой размерности
Алгоритмы и структуры данных BigData для графов большой размерности
Alexey Zinoviev
 
ALMADA 2013 (computer science school by Yandex and Microsoft Research)
ALMADA 2013 (computer science school by Yandex and Microsoft Research)ALMADA 2013 (computer science school by Yandex and Microsoft Research)
ALMADA 2013 (computer science school by Yandex and Microsoft Research)Alexey Zinoviev
 
GDG Devfest Omsk 2013. Year of events!
GDG Devfest Omsk 2013. Year of events!GDG Devfest Omsk 2013. Year of events!
GDG Devfest Omsk 2013. Year of events!
Alexey Zinoviev
 
How to port JavaScript library to Android and iOS
How to port JavaScript library to Android and iOSHow to port JavaScript library to Android and iOS
How to port JavaScript library to Android and iOS
Alexey Zinoviev
 
Поездка на IT-DUMP 2012
Поездка на IT-DUMP 2012Поездка на IT-DUMP 2012
Поездка на IT-DUMP 2012
Alexey Zinoviev
 
MyBatis и Hibernate на одном проекте. Как подружить?
MyBatis и Hibernate на одном проекте. Как подружить?MyBatis и Hibernate на одном проекте. Как подружить?
MyBatis и Hibernate на одном проекте. Как подружить?
Alexey Zinoviev
 
Google I/O туда и обратно.
Google I/O туда и обратно.Google I/O туда и обратно.
Google I/O туда и обратно.
Alexey Zinoviev
 
Google Maps. Zinoviev Alexey.
Google Maps. Zinoviev Alexey.Google Maps. Zinoviev Alexey.
Google Maps. Zinoviev Alexey.
Alexey Zinoviev
 

More from Alexey Zinoviev (20)

Kafka pours and Spark resolves
Kafka pours and Spark resolvesKafka pours and Spark resolves
Kafka pours and Spark resolves
 
Joker'16 Spark 2 (API changes; Structured Streaming; Encoders)
Joker'16 Spark 2 (API changes; Structured Streaming; Encoders)Joker'16 Spark 2 (API changes; Structured Streaming; Encoders)
Joker'16 Spark 2 (API changes; Structured Streaming; Encoders)
 
Python's slippy path and Tao of thick Pandas: give my data, Rrrrr...
Python's slippy path and Tao of thick Pandas: give my data, Rrrrr...Python's slippy path and Tao of thick Pandas: give my data, Rrrrr...
Python's slippy path and Tao of thick Pandas: give my data, Rrrrr...
 
Thorny path to the Large-Scale Graph Processing (Highload++, 2014)
Thorny path to the Large-Scale Graph Processing (Highload++, 2014)Thorny path to the Large-Scale Graph Processing (Highload++, 2014)
Thorny path to the Large-Scale Graph Processing (Highload++, 2014)
 
Joker'14 Java as a fundamental working tool of the Data Scientist
Joker'14 Java as a fundamental working tool of the Data ScientistJoker'14 Java as a fundamental working tool of the Data Scientist
Joker'14 Java as a fundamental working tool of the Data Scientist
 
First steps in Data Mining Kindergarten
First steps in Data Mining KindergartenFirst steps in Data Mining Kindergarten
First steps in Data Mining Kindergarten
 
EST: Smart rate (Effective recommendation system for Taxi drivers based on th...
EST: Smart rate (Effective recommendation system for Taxi drivers based on th...EST: Smart rate (Effective recommendation system for Taxi drivers based on th...
EST: Smart rate (Effective recommendation system for Taxi drivers based on th...
 
Android Geo Apps in Soviet Russia: Latitude and longitude find you
Android Geo Apps in Soviet Russia: Latitude and longitude find youAndroid Geo Apps in Soviet Russia: Latitude and longitude find you
Android Geo Apps in Soviet Russia: Latitude and longitude find you
 
Keynote on JavaDay Omsk 2014 about new features in Java 8
Keynote on JavaDay Omsk 2014 about new features in Java 8Keynote on JavaDay Omsk 2014 about new features in Java 8
Keynote on JavaDay Omsk 2014 about new features in Java 8
 
Big data algorithms and data structures for large scale graphs
Big data algorithms and data structures for large scale graphsBig data algorithms and data structures for large scale graphs
Big data algorithms and data structures for large scale graphs
 
"Говнокод-шоу"
"Говнокод-шоу""Говнокод-шоу"
"Говнокод-шоу"
 
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
 
Алгоритмы и структуры данных BigData для графов большой размерности
Алгоритмы и структуры данных BigData для графов большой размерностиАлгоритмы и структуры данных BigData для графов большой размерности
Алгоритмы и структуры данных BigData для графов большой размерности
 
ALMADA 2013 (computer science school by Yandex and Microsoft Research)
ALMADA 2013 (computer science school by Yandex and Microsoft Research)ALMADA 2013 (computer science school by Yandex and Microsoft Research)
ALMADA 2013 (computer science school by Yandex and Microsoft Research)
 
GDG Devfest Omsk 2013. Year of events!
GDG Devfest Omsk 2013. Year of events!GDG Devfest Omsk 2013. Year of events!
GDG Devfest Omsk 2013. Year of events!
 
How to port JavaScript library to Android and iOS
How to port JavaScript library to Android and iOSHow to port JavaScript library to Android and iOS
How to port JavaScript library to Android and iOS
 
Поездка на IT-DUMP 2012
Поездка на IT-DUMP 2012Поездка на IT-DUMP 2012
Поездка на IT-DUMP 2012
 
MyBatis и Hibernate на одном проекте. Как подружить?
MyBatis и Hibernate на одном проекте. Как подружить?MyBatis и Hibernate на одном проекте. Как подружить?
MyBatis и Hibernate на одном проекте. Как подружить?
 
Google I/O туда и обратно.
Google I/O туда и обратно.Google I/O туда и обратно.
Google I/O туда и обратно.
 
Google Maps. Zinoviev Alexey.
Google Maps. Zinoviev Alexey.Google Maps. Zinoviev Alexey.
Google Maps. Zinoviev Alexey.
 

Recently uploaded

Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Nexer Digital
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
mikeeftimakis1
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Aggregage
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
Aftab Hussain
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 
Climate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing DaysClimate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing Days
Kari Kakkonen
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
Assure Contact Center Experiences for Your Customers With ThousandEyes
Assure Contact Center Experiences for Your Customers With ThousandEyesAssure Contact Center Experiences for Your Customers With ThousandEyes
Assure Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..
UiPathCommunity
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
James Anderson
 
Quantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIsQuantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIs
Vlad Stirbu
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
Alpen-Adria-Universität
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 

Recently uploaded (20)

Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 
Climate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing DaysClimate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing Days
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
Assure Contact Center Experiences for Your Customers With ThousandEyes
Assure Contact Center Experiences for Your Customers With ThousandEyesAssure Contact Center Experiences for Your Customers With ThousandEyes
Assure Contact Center Experiences for Your Customers With ThousandEyes
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
 
Quantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIsQuantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIs
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 

Joker'15 Java straitjackets for MongoDB

  • 1. Java straitjackets for MongoDB Alexey Zinovyev, Java Trainer
  • 2. About I am a <graph theory, machine learning, traffic jams prediction, BigData algorithms> scientist But I'm a <Java, NoSQL, Hadoop, Spark> programmer
  • 3. Raise your hands if you .. •use Hibernate & Spring
  • 4. Raise your hands if you .. •use Hibernate & Spring • keep your data in MongoDB
  • 5. Raise your hands if you .. •use Hibernate & Spring • keep your data in MongoDB • use only Java Driver for Mongo
  • 6. Raise your hands if you .. •use Hibernate & Spring • keep your data in MongoDB • use only Java Driver for Mongo • write your own mapping from Java objects to BSON
  • 7. 7Joker 2015 Let’s do this with Mongo’D
  • 9. 9Joker 2015 One of these fine days...
  • 10. 10Joker 2015 We have a NoSQL job for you, son!
  • 11. 11Joker 2015 But you like SQL and HATE nontraditional data
  • 13. 13Joker 2015 Let’s talk about it, Java - boy...
  • 14. NOSQL
  • 15. 15Joker 2015 What’s the problem with RBDMS’s • Caching • Master/Slave • Cluster • Table Partitioning • Sharding
  • 16. 16Joker 2015 Try to find Mongo
  • 20. 20Joker 2015 Gentle NoSQL • Scalability • Nodes and Data Centers
  • 21. 21Joker 2015 Gentle NoSQL • Scalability • Nodes and Data Centers • Easy to add new server
  • 22. 22Joker 2015 Gentle NoSQL • Scalability • Nodes and Data Centers • Easy to add new server • Specific data model
  • 23. 23Joker 2015 Gentle NoSQL • Scalability • Nodes and Data Centers • Easy to add new server • Specific data model • Eventual consistency
  • 24. 24Joker 2015 Comparison criteria • Education curve • Performance • Drivers & frameworks • Hadoop integration • Mobile client
  • 25. 25Joker 2015 But what about .. “ACID”?
  • 27. 27Joker 2015 Atomicity in NoSQL • read-write-modify (CAS) • key/row manipulation is atomic • API for atomic operations • bad support of transactions (play with 2 phase commit)
  • 28. 28Joker 2015 BASE • basic availability – all queries will be finished • soft state – state can be changed without writing • eventual consistency
  • 30. 30Joker 2015 BSON (something like JSON) • Adds data types that JSON did not support – (ISO Dates, ObjectId, etc.) • Optimized for performance • Adds compression
  • 31. 31Joker 2015 Mongo: pro and contra ❏ Full-featured query language ❏ Aggregation framework ❏ Big variety of indexes ❏ Replication and sharding ❏ Documentation ★ Limit for document size (16 mb) ★ Complex cluster schema ★ No joins
  • 32. 32Joker 2015 Is Mongo terrible? • Stability? • JavaScript at the bottom • Something new • Low barrier for entry • Easy to lose your data
  • 34. 34Joker 2015 The Database and programmers
  • 36. 36Joker 2015 INSERT Mongo mongo = new Mongo(…); DB db = mongo.getDB("myDb"); Collection collection = db.getCollection(“customers");
  • 37. 37Joker 2015 INSERT Mongo mongo = new Mongo(…); DB db = mongo.getDB("myDb"); Collection collection = db.getCollection(“customers"); DBObject hotel = new BasicDBObject(); address.put(“name”, “ParkInn”);
  • 38. 38Joker 2015 INSERT Mongo mongo = new Mongo(…); DB db = mongo.getDB("myDb"); Collection collection = db.getCollection(“customers"); DBObject hotel = new BasicDBObject(); address.put(“name”, “ParkInn”); DBObject person = new BasicDBObject(); person.put("firstname”, “Alexey”); person.put("lastname”, “Zinoviev”); person.put(“hotel”, hotel); collection.save(person);
  • 39. 39Joker 2015 SELECT with Filter DBObject query = new BasicDBObject(); query.put(“hotel.name”, “ParkInn”); DBCursor cursor = collection.find(query); for (DBObject element : cursor) { // Map data onto object }
  • 41. 41Joker 2015 But.. how about @ and JPA and ..
  • 43. 43Joker 2015 Morphia Object Document Mapper • Specifed with annotations • Implemented with reflection • Runtime validation
  • 44. 44Joker 2015 Morphia advantages • Integrated with Spring, Guice and other DI frameworks
  • 45. 45Joker 2015 Morphia advantages • Integrated with Spring, Guice and other DI frameworks • Lifecycle Method Annotations (@PrePersist, @PostLoad)
  • 46. 46Joker 2015 Morphia advantages • Integrated with Spring, Guice and other DI frameworks • Lifecycle Method Annotations (@PrePersist, @PostLoad) • Built on top of Mongo Java Driver
  • 47. 47Joker 2015 Morphia advantages • Integrated with Spring, Guice and other DI frameworks • Lifecycle Method Annotations (@PrePersist, @PostLoad) • Built on top of Mongo Java Driver • More better than old-style queries by BSON-object
  • 48. 48Joker 2015 Morphia advantages • Integrated with Spring, Guice and other DI frameworks • Lifecycle Method Annotations (@PrePersist, @PostLoad) • Built on top of Mongo Java Driver • More better than old-style queries by BSON-object • Query API: ds.createQuery(MyEntity.class) .filter("foo >",12) .order("date, -foo");
  • 49. 49Joker 2015 Model @Entity(“customers") class Customer { @Id String taxId; Date memberSince; boolean active; int followers; List<String> following; }
  • 50. 50Joker 2015 Model with embedded entity @Entity(“customers") class Customer { @Id String taxId; Name name; Date memberSince; boolean active; int followers; List<String> following; } @Embedded class Name { String first, last; }
  • 51. 51Joker 2015 Save Customer customer = new Customer(); customer.taxId = "zaleslaw"; customer.name = new Name("Alexey", "Zinoviev"); customer.memberSince = dateFmt.parse("Aug 12, 2009"); customer.active = true; customer.followers = 8; customer.following = Arrays.asList("Boris", "Tor"); ds.save(customer);
  • 52. 52Joker 2015 Read from database > db.customers.findOne() { "_id" : “zaleslaw", "className" : "demo.Customer", "name" : { "first" : "Alexey", "last" : "Zinoviev" }, "memberSince" : ISODate("2009-08-12T04:00:00Z"), "active" : true, "followers" : 8, "following" : [ "Boris", "Tor" ] }
  • 53. 53Joker 2015 Find by filter ds.find(Customer.class). field("since").lessThan(dateFmt.parse("Jan 1, 2010")). field("followers").greaterThan(0)
  • 54. 54Joker 2015 Polymorphism public abstract class EmployeeEntity { protected String name; } public class ManagerEntity extends EmployeeEntity { protected Boolean approveFunds; } public class WorkerEntity extends EmployeeEntity { protected Integer yearsExperience; }
  • 56. 56Joker 2015 Polymorphism in RDBMs 1. Union table with (many) NULL values
  • 57. 57Joker 2015 Polymorphism in RDBMs 1. Union table with (many) NULL values 2. Concrete instances without common queries
  • 58. 58Joker 2015 Polymorphism in RDBMs 1. Union table with (many) NULL values 2. Concrete instances without common queries 3. Base table joined with all subtables
  • 59. 59Joker 2015 Polymorphism with Morphia @Entity(value = "employee", noClassnameStored = false) public abstract class EmployeeEntity { @Id protected ObjectId id; protected String name; } public class ManagerEntity extends EmployeeEntity { protected Boolean approveFunds; } public class WorkerEntity extends EmployeeEntity { protected Integer yearsExperience; }
  • 60. 60Joker 2015 Meanwhile in Mongo { "_id": ObjectId("5461c8bf9e2acf32ed5ab079"), "className": "entities.ManagerEntity", "name": “Alex", "approveFunds": true } { "_id": ObjectId("524d9fe7e4b0f8bd3031f89e"), "className": "entities.WorkerEntity", "name": “Max", "yearsExperience": 100 }
  • 61. 61Joker 2015 SELECTs public EmployeeEntity findByEmail(final String email) { return mongoDatastore.find(EmployeeEntity.class) .field("email").equal(email).get(); } public List<EmployeeEntity> getAllEmployees() { return mongoDatastore.find(EmployeeEntity.class).asList(); } public List<ManagerEntity> getAllManagers() { return mongoDatastore.find(ManagerEntity.class) .disableValidation() .field("className").equal(ManagerEntity.class.getName()) .asList();
  • 62. 62Joker 2015 It’s Time for Java Superhero, yeah!
  • 64. 64Joker 2015 One faith, one Spring for ages!
  • 65. 65Joker 2015 Spring Data • Templating : connection configs, collection lifecycle (create, drop), Map/Reduce + Aggregation • Mapping: @Document, @Index, @Field • Repository support: geospatial queries, queries derived from method signatures (at runtime) • Paging, sorting, CRUD operations
  • 66. 66Joker 2015 All we need in configs
  • 67. 67Joker 2015 Advanced configs <mongo:mongo host="${mongo.host}" port="${mongo.port}"> <mongo:options connections-per-host="${mongo.connectionsPerHost}„ threads-allowed-to-block-for-connection multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}„ connect-timeout="${mongo.connectTimeout}„ max-wait-time="${mongo.maxWaitTime}„ auto-connect-retry="${mongo.autoConnectRetry}„ socket-keep-alive="${mongo.socketKeepAlive}„ socket-timeout="${mongo.socketTimeout}„ slave-ok="${mongo.slaveOk}„ write-number="1„ write-timeout="0„ write-fsync="true"/> </mongo:mongo> <mongo:db-factorydbname= "test" mongo-ref="mongo"/>
  • 68. 68Joker 2015 Entity Mapping @Document class Customer { @Id private BigInteger id; @Indexed private String firstname, lastname; @Field("email") private String emailAddress; @DBRef private Set<Customer> contacts; public Person(String firstname) { … } @PersistenceConstructor public Customer(String firstname, String lastname) { … } … }
  • 69. 69Joker 2015 Mongo operations public interface MongoOperations { // Generic callback-accepting methods <T> T execute(DbCallback<T> action); <T> T execute(Class<?> entityClass, CollectionCallback<T> action); <T> T execute(String collectionName, CollectionCallback<T> action); }
  • 70. 70Joker 2015 Mongo operations public interface MongoOperations { // Generic callback-accepting methods <T> T execute(DbCallback<T> action); <T> T execute(Class<?> entityClass, CollectionCallback<T> action); <T> T execute(String collectionName, CollectionCallback<T> action); // Higher level access methods <T> List<T> find(Query query, Class<T> entityClass); void save(Object objectToSave, String collectionName); WriteResult updateFirst(Query query, Update update, Class<?> entityClass); }
  • 71. 71Joker 2015 Template usage Mongo mongo = new Mongo(); MongoDbFactory factory = new SimpleMongoDbFactory(mongo, „customers“); MongoTemplate template = new MongoTemplate(factory);
  • 72. 72Joker 2015 Template usage Mongo mongo = new Mongo(); MongoDbFactory factory = new SimpleMongoDbFactory(mongo, „customers“); MongoTemplate template = new MongoTemplate(factory); Customer me = new Customer (“Alexey", “Zinoviev"); me.setEmailAddress(“Alexey_Zinovyeve@epam.com"); template.save(me);
  • 73. 73Joker 2015 Template usage Mongo mongo = new Mongo(); MongoDbFactory factory = new SimpleMongoDbFactory(mongo, „customers“); MongoTemplate template = new MongoTemplate(factory); Customer me = new Customer (“Alexey", “Zinoviev"); me.setEmailAddress(“Alexey_Zinovyeve@epam.com"); template.save(me); Query query = new Query(new Criteria("emailAddress") .is("Alexey_Zinovyeve@epam.com")); assertThat(template.find(query), is(me));
  • 74. 74Joker 2015 Spring Repositories : it does all job • Uses a method-naming convention that Spring interprets during implementation • Hides complexities of Spring Data templates • Builds implementation for you based on interface design • Implementation is built during Spring container load.
  • 75. 75Joker 2015 Typical JPA Repository public interface PersonRepository extends Repository<Person, BigInteger> { // Finder for a single entity Person findByEmailAddress(String emailAddress); // Finder for multiple entities List<Person> findByLastnameLike(String lastname); // Finder with pagination Page<Person> findByFirstnameLike(String firstname, Pageable page); }
  • 76. 76Joker 2015 Mongo Repository public interface PersonRepository extends Repository<Person, BigInteger> { // Finder for a single entity Person findByEmailAddress(String emailAddress); // Finder for multiple entities List<Person> findByLastnameLike(String lastname); // Finder with pagination Page<Person> findByFirstnameLike(String firstname, Pageable page); // Geospatial queries List<Person> findByLocationNear(Point location, Distance distance); GeoResults<Person> findByLocationNear(Point location); }
  • 77. 77Joker 2015 Let’s autowire it! @Component public class MyClient { @Autowired private PersonRepository repository; public List<Person> doSomething() { Point point = new Point(55.7, 70.8); Distance distance = new Distance(200, Metrics.KILOMETERS); return repository.findByLocationNear(point, distance); } }
  • 78. JONGO
  • 79. 79Joker 2015 Jongo • Jackson and BSON4Jackson for (Un)marshalling • No JPA / Hibernate style • Query in Java as in Mongo Shell
  • 80. 80Joker 2015 Jongo : find db.users.find( { $or : [ { age : {$gt:20,$lt:30} } , { age : {$gt:50,$lt:60} } ] } ) Iterable<User> users = collection.find ("{ $or : [ { age : {$gt:20,$lt:30} } , { age : {$gt:50,$lt:60} } ] } ").as(User.class);
  • 81. 81Joker 2015 Java Driver API DB db = mongo.getDB("users"); DBCollection collection = db.getCollection("users"); DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get(); DBObject secondQuery = QueryBuilder.start("age").greaterThan(50).lessThan(60).get(); DBObject query = QueryBuilder.start().or(firstQuery,secondQuery).get(); DBCursor results = collection.find(query); List<User> users = new ArrayList<User>(); for (DBObject result : results) { User user = new User(); user.setUsername((String) result.get("username")); user.setAge((Integer) result.get("age")); users.add(user); }
  • 82. 82Joker 2015 Jongo : aggregation MongoCollection collection = new Jongo(db).getCollection("emails"); collection.aggregate(“ {$project:{sender:1}} ") .and(“ {$match:{tags:'read'}} ") .and(“ {$limit:10} ") .as(Email.class);
  • 84. 84Joker 2015 Hibernate in NoSQL world (by Hibernate opinion)
  • 85. 85Joker 2015 Hibernate in NoSQL world (in reality)
  • 86. 86Joker 2015 Hibernate OGM • Java Persistence (JPA) support for NoSQL solutions • JP-QL queries are converted in native backend queries • Hibernate Search as indexing engine and use full-text queries • You can call flush(), commit() and demarcate transactions • It supports only MongoDB, Neo4j, Infinispan, Ehcache
  • 88. 88Joker 2015 OGM mapping @Entity @NamedQuery( name="byItemsQuantity", query = "SELECT o FROM Order o JOIN o.items i WHERE i.quantity = :quantity" ) public class Order { @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid2") @Id private String id; private Date date; @Column(name = "custInfo") private String customerInfo; @ElementCollection private List<Item> items;
  • 90. 90Joker 2015 Different databases in one project • RBDMS: Needs transactional updates and has tabular structure • Riak: Needs high availability across multiple locations. Can merge inconsistent writes • MongoDB: Lots of reads, infrequent writes. Powerful aggregation mechanism • Cassandra: Large-scale analytics on large cluster. High volume of writes on multiple nodes
  • 92. 92Joker 2015 Kundera • Atomicity guarantee and Transaction management • Strictly JPA 2.1 compatible • It supports Cassandra, Mongo, Hbase, Redis, Neo4j and etc • @Embedded and @ElementCollection for ColumnFamily and nested documents • OneToMany, OneToOne, ManyToMany relationships • Not full JPQL support for different database
  • 94. 94Joker 2015 It solves all problems!
  • 96. 96Joker 2015 Other tools • EclipseLink : different support of different NoSQL databases • MJORM : Google Code, XML mapping + MQL (SQL syntax for Mongo data extracting) • DataNucleus : support many J as JDO, JPA
  • 97. 97Joker 2015 Abstraction vs Standardization
  • 98. 98Joker 2015 In conclusion • Think about your data
  • 99. 99Joker 2015 In conclusion • Think about your data • Understand you project needs
  • 100. 100Joker 2015 In conclusion • Think about your data • Understand you project needs • Choose right framework
  • 101. 101Joker 2015 In conclusion • Think about your data • Understand you project needs • Choose right framework • Know & use MongoDB features
  • 102. 102Joker 2015 Listen to your heart … DATA
  • 103. 103Joker 2015 CALL ME IF YOU WANT TO KNOW MORE Thanks a lot
  • 104. 104Joker 2015 Contacts E-mail : Alexey_Zinovyev@epam.com Twitter : @zaleslaw LinkedIn: https://www.linkedin.com/in/zaleslaw