izgalmas ujdonsagok: 1. Morse, the next-gen REBL https://clojure.org/news/2023/04/28/introducing-morse 2. Datomic is free! (a sajat hostolasu valtozata is, meg majd idovel az AWS Cloud-os valtozata is) https://blog.datomic.com/2023/04/datomic-is-free.html
Datomic free az nagyon jó. Emiatt alkalmaztam az xtdb-t, mert 4K per év saját magamnak sok.. vagy prototypeokhoz
ha gyorsan ki akarjatok probalni, akkor itt van egy pelda deps.edn:
{:mvn/local-repo "./mvn-deps"
:paths ["classes" "src"]
:deps {org.clojure/clojure {:mvn/version "1.11.1"}
com.datomic/peer {:mvn/version "1.0.6726"}
org.slf4j/slf4j-nop {:mvn/version "2.0.7"}}}Milyen gyors a Datomic? Nem tudod Tomi? Meg nem teszteltem production
Biztosan van stat vhol fenn..
meg egy src/free/datomic.clj:
(ns free.datomic
(:require
[clojure.pprint :as pp]
[datomic.api :as d]))
(defn mk-db []
(let [db-name (-> "db-" gensym str (doto println))
db-uri (str "datomic:mem://" db-name)]
(d/create-database db-uri)
(d/connect db-uri)))
(def schema
[{:db/ident :person/name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}
{:db/ident :employee/id
:db/valueType :db.type/long
:db/cardinality :db.cardinality/one
:db/unique :db.unique/identity}])
(def persons
'{:find [(pull ?e [*])]
:in [$ ?name-regex]
:where [[$ ?e :person/name ?name]
[(re-find ?name-regex ?name)]]})
(comment
(def conn (mk-db))
(time
(let [conn (mk-db)]
@(d/transact conn schema)
@(d/transact conn [{:db/ident :someone
:person/name "Some One"
:employee/id 123}])
@(d/transact conn [{:db/ident :somebody
:person/name "Some Body"
:employee/id 456}])
(pp/pprint (d/q persons (d/db conn) #""))
conn))
)Ez tok jó: Morse runs remotely to or within your application JVM process, and can be used at dev-time without adding any runtime deps. The UI is written in JavaFX.
nincs igazan stat a datomic sebessegerol, mert annyira konfiguralhato meg annyira mas az architecturaja mint mas adatbazisoknak, hogy nem igazan lehet oket osszehasonlitani altalanossagban. mindenesetre a Datomic nem arra valo, h hatalmas real-time even stream-eket ingest-eljel. olvasas szempontjabol viszont baromira skalazhato es brutal gyors, mert sok szintu cache-elest tudsz benne csinalni. a vegso sebesseg meg attol fugg h h allitottad be a kulonbozo cache mereteket, ami meg attol fugg h mennyi penzt akarsz raszanni, meg h milyen usage pattern-jeid vannak. a lenyeg, h ezeknek a kerdesek a megvalaszolasa fuggetlen az adatmodel-tol, meg a programtol. amig ha pl dynamo db-t akarsz kozvetlenul hasznalni, akkor a tablaidat meg az indexeidet ugy kell megtervezni, h tamogassa a tervezett olvasasi muveleteidet, amik nem mindig ismertek a project elejen.
Nekem elsősorban gyors olvasásra kene mint vektor adatbázis
a fenti peldaba raktam egy time-ot, h lassatok, h fejlesztes kozben osszerakni egy eldobhato adatbazist valami semaval es pelda adatokkal az a 8ms nagysagrendjeben tud lenni (egy M2 Pro-n)
ezert mi ugy unit teszteljuk az adatbazis muveleteinket, h teljesen izolalt in-memory datomic db-ket csinalunk minden test case-nek.
igy 2+ ev fejlesztes utan is csak 4.5s a teljes test suite futasi ideje.
Igen az xtdb rocksdb-vel is kb így fut pár ms
Letesztelem később
Izolacio az tok jó!