You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
4 years ago | |
|---|---|---|
| .vscode | 4 years ago | |
| docker | 4 years ago | |
| modules | 4 years ago | |
| sql | 4 years ago | |
| .gitignore | 4 years ago | |
| pom.xml | 4 years ago | |
| readme.md | 4 years ago | |
| sources.md | 4 years ago | |
| workspace.code-workspace | 4 years ago | |
readme.md
Java ORM test
Initial assumptions
- JPA is f***ing slow, due too many layers of abstraction
- NO xml and other shit-styled non-code-like sources must be needed
- no additional tools to work (only boxed with technology set or none is applicable)
Initila list of techs
- Apache Cayenne 📝 🧰 ✨
- Apache OpenJPA 🧬 ✨
- Ebean 🧱 🧰 ✨
- jOOQ 💳 📝 🧰
- speedment 💳 📝
- ORMLite Core
- MyBatis 📝
- Querydsl
- Hibernate 🧬 🩹 ✨
- EclipseLink 🧬 ✨
- DataNucleus 🧬 🦠 ✨
Initial criteria
Must:
- encrypted columns
- no raw SQL for simple CRUD operations
- support for PostgreSQL
Good to see if:
- support for MariaDB
- support extended PostgreSQL features (including json and array)
- "N+1" problem automatic solutions (as much as possible)
- ability to generate raw SQL (to be executed elsewhere)
- support for binary (BLOB) storage and extraction (10Mb per record max)
Test plan
- postgres version 14 & 14-alpine (test database performance baseline)
- two databases (one with partitioning, one without)
- tables per database
- xxs [50 records]
- xs [500 records]
- s [5000 records]
- m [50000 records]
- l [500000 records]
- xl [5000000 records]
- xxl [50000000 records]
- each test module starts a fresh copy of database
- database content is procedure-generated
- random sequences must be pregenerated to be exactly same for all tests (to eliminate test-path diviations)
- random sequence for each test is unique and not intersect (to eliminate postgresql optimizations)
Requests plan
- insert
- single
- correct data
- constrain violation
- batch
- correct
- invalids (by hand to check if full transaction will roll back)
- single
- find
- by equals (1)
- integer
- string
- date
- by more X & less Y (N)
- integer
- float
- date
- by equals (1)
- update
- random by id (single)
- by criteria (batch)
- delete
- random by id (single)
- by criteria (batch)
Documentation analysis
- MyBatis - out of competitions, due to ass-whipping-xml notation.
Initial project setup analysis
- speedment - cool-looking streaming API, but it's way of from common SQL-like syntax & failes to work with UUID columns corectly, also they wanna' our money, dude if we need something not straightly mapped. Out of competition.
- jOOQ - enterprise style peace of ..., but still in.
Article cross analysis
Sources:
- Performance Evaluation of JPA Based ORM Techniques - Hibernate and EclipseJPA are best of JPA realizations (2016)
- Optimizing JPA Performance: An EclipseLink, Hibernate, and OpenJPA Comparison - Hibernate looks better in comparison (2010)
- JPA Performance Benchmark - good starting point for testing JPA-based ORMs. Best parter for PostgreSQL denoted here is EclipseLink and Hibernate (2012)
- Why JDO ? - feature comparison table for JDBC, EJB, JPA, JDO, etc.
Tools:
- HibernateTools - Reverse Engineering and Code Generation - how to generate classes for Hibernate from plain DB.
Honorable mentioning
- EJB 4.0 (now stands for Jakarta Enterprise Beans) is supported only in GlassFish 6 which is a part of Eclipse Foundation family. It's not included in research due to high binding to one particular implimentation with low chance of change in future.
- EOF (Enterprise Objects Framework) is a part of Apple now (originaly designed in NeXT). It supports java from back in a days, but now it's obsolete as of April 2005 (rise of Objective-C and Mac OS Tiger Intel-epoch)
- Oracle Kodo - JPA-based framework from Oracle, does not compete due to Oracle involvment and price tag.
- Oracle TopLink - part of Oracles' Fusion Middleware, was donated to Eclipse Foundation in 2007, and renamed to EclipseLink, so TopLink is obsolete now.