Move examples to tests for now
This commit is contained in:
parent
376856600e
commit
38017d720d
2 changed files with 99 additions and 96 deletions
|
|
@ -45,98 +45,3 @@
|
||||||
(defmacro with-transaction
|
(defmacro with-transaction
|
||||||
[[sym connectable opts] & body]
|
[[sym connectable opts] & body]
|
||||||
`(p/-transact ~connectable (fn [~sym] ~@body) ~opts))
|
`(p/-transact ~connectable (fn [~sym] ~@body) ~opts))
|
||||||
|
|
||||||
(comment
|
|
||||||
(def db-spec {:dbtype "h2:mem" :dbname "perf"})
|
|
||||||
(def db-spec {:dbtype "derby" :dbname "perf" :create true})
|
|
||||||
(def db-spec {:dbtype "mysql" :dbname "worldsingles" :user "root" :password "visual"})
|
|
||||||
(def con db-spec)
|
|
||||||
(def con (get-datasource db-spec))
|
|
||||||
(get-connection con {})
|
|
||||||
(def con (get-connection (get-datasource db-spec) {}))
|
|
||||||
(def con (get-connection db-spec {}))
|
|
||||||
(execute! con ["DROP TABLE fruit"])
|
|
||||||
;; h2
|
|
||||||
(execute! con ["CREATE TABLE fruit (id int default 0, name varchar(32) primary key, appearance varchar(32), cost int, grade real)"])
|
|
||||||
(execute! con ["INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (1,'Apple','red',59,87), (2,'Banana','yellow',29,92.2), (3,'Peach','fuzzy',139,90.0), (4,'Orange','juicy',89,88.6)"])
|
|
||||||
;; mysql
|
|
||||||
(execute! con ["CREATE TABLE fruit (id int auto_increment, name varchar(32), appearance varchar(32), cost int, grade real, primary key (id))"])
|
|
||||||
(execute! con ["INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (1,'Apple','red',59,87), (2,'Banana','yellow',29,92.2), (3,'Peach','fuzzy',139,90.0), (4,'Orange','juicy',89,88.6)"]
|
|
||||||
{:return-keys true})
|
|
||||||
|
|
||||||
(.close con)
|
|
||||||
|
|
||||||
(require '[criterium.core :refer [bench quick-bench]])
|
|
||||||
|
|
||||||
;; calibrate
|
|
||||||
(quick-bench (reduce + (take 10e6 (range))))
|
|
||||||
|
|
||||||
;; raw java
|
|
||||||
(defn select* [^java.sql.Connection con]
|
|
||||||
(let [ps (doto (.prepareStatement con "SELECT * FROM fruit WHERE appearance = ?")
|
|
||||||
(.setObject 1 "red"))
|
|
||||||
rs (.executeQuery ps)
|
|
||||||
_ (.next rs)
|
|
||||||
value (.getObject rs "name")]
|
|
||||||
(.close ps)
|
|
||||||
value))
|
|
||||||
(quick-bench (select* con))
|
|
||||||
|
|
||||||
;; almost same as the Java example above
|
|
||||||
(quick-bench
|
|
||||||
(reduce (fn [rs m] (reduced (:name m)))
|
|
||||||
nil
|
|
||||||
(reducible! con ["select * from fruit where appearance = ?" "red"])))
|
|
||||||
(quick-bench
|
|
||||||
(execute-one! con
|
|
||||||
["select * from fruit where appearance = ?" "red"]
|
|
||||||
{:row-fn :name}))
|
|
||||||
|
|
||||||
;; simple query
|
|
||||||
(quick-bench
|
|
||||||
(execute! con ["select * from fruit where appearance = ?" "red"]))
|
|
||||||
|
|
||||||
;; with a prepopulated prepared statement
|
|
||||||
(with-open [ps (prepare con ["select * from fruit where appearance = ?" "red"] {})]
|
|
||||||
(quick-bench
|
|
||||||
[(reduce (fn [_ row] (reduced (:name row)))
|
|
||||||
nil
|
|
||||||
(reducible! ps))]))
|
|
||||||
|
|
||||||
;; same as above but setting parameters inside the benchmark
|
|
||||||
(with-open [ps (prepare con ["select * from fruit where appearance = ?"] {})]
|
|
||||||
(quick-bench
|
|
||||||
[(reduce (fn [_ row] (reduced (:name row)))
|
|
||||||
nil
|
|
||||||
(reducible! (prepare/set-parameters ps ["red"])))]))
|
|
||||||
|
|
||||||
;; this takes more than twice the time of the one above which seems strange
|
|
||||||
(with-open [ps (prepare con ["select * from fruit where appearance = ?"] {})]
|
|
||||||
(quick-bench
|
|
||||||
[(reduce (fn [_ row] (reduced (:name row)))
|
|
||||||
nil
|
|
||||||
(reducible! (prepare/set-parameters ps ["red"])))
|
|
||||||
(reduce (fn [_ row] (reduced (:name row)))
|
|
||||||
nil
|
|
||||||
(reducible! (prepare/set-parameters ps ["fuzzy"])))]))
|
|
||||||
|
|
||||||
;; full first row
|
|
||||||
(quick-bench
|
|
||||||
(execute-one! con ["select * from fruit where appearance = ?" "red"]))
|
|
||||||
|
|
||||||
;; test assoc works
|
|
||||||
(execute-one! con
|
|
||||||
["select * from fruit where appearance = ?" "red"]
|
|
||||||
{:row-fn #(assoc % :test :value)})
|
|
||||||
|
|
||||||
;; test assoc works
|
|
||||||
(execute! con
|
|
||||||
["select * from fruit where appearance = ?" "red"]
|
|
||||||
{:row-fn #(assoc % :test :value)})
|
|
||||||
|
|
||||||
(with-transaction [t con {:rollback-only? true}]
|
|
||||||
(execute! t ["INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (5,'Pear','green',49,47)"])
|
|
||||||
(execute! t ["select * from fruit where name = ?" "Pear"]))
|
|
||||||
(execute! con ["select * from fruit where name = ?" "Pear"])
|
|
||||||
|
|
||||||
(execute! con ["select * from membership"]))
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,105 @@
|
||||||
(ns next.jdbc-test
|
(ns next.jdbc-test
|
||||||
(:require [clojure.test :refer [deftest is testing]]
|
(:require [clojure.test :refer [deftest is testing]]
|
||||||
[next.jdbc :as j]))
|
[next.jdbc :refer :all]))
|
||||||
|
|
||||||
(deftest a-test
|
(deftest a-test
|
||||||
(testing "FIXME, I fail."
|
(testing "FIXME, I fail."
|
||||||
(is (= 0 1))))
|
(is (= 0 1))))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(def db-spec {:dbtype "h2:mem" :dbname "perf"})
|
||||||
|
(def db-spec {:dbtype "derby" :dbname "perf" :create true})
|
||||||
|
(def db-spec {:dbtype "mysql" :dbname "worldsingles" :user "root" :password "visual"})
|
||||||
|
(def con db-spec)
|
||||||
|
(def con (get-datasource db-spec))
|
||||||
|
(get-connection con {})
|
||||||
|
(def con (get-connection (get-datasource db-spec) {}))
|
||||||
|
(def con (get-connection db-spec {}))
|
||||||
|
(execute! con ["DROP TABLE fruit"])
|
||||||
|
;; h2
|
||||||
|
(execute! con ["CREATE TABLE fruit (id int default 0, name varchar(32) primary key, appearance varchar(32), cost int, grade real)"])
|
||||||
|
(execute! con ["INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (1,'Apple','red',59,87), (2,'Banana','yellow',29,92.2), (3,'Peach','fuzzy',139,90.0), (4,'Orange','juicy',89,88.6)"])
|
||||||
|
;; mysql
|
||||||
|
(execute! con ["CREATE TABLE fruit (id int auto_increment, name varchar(32), appearance varchar(32), cost int, grade real, primary key (id))"])
|
||||||
|
(execute! con ["INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (1,'Apple','red',59,87), (2,'Banana','yellow',29,92.2), (3,'Peach','fuzzy',139,90.0), (4,'Orange','juicy',89,88.6)"]
|
||||||
|
{:return-keys true})
|
||||||
|
|
||||||
|
(.close con)
|
||||||
|
|
||||||
|
(require '[criterium.core :refer [bench quick-bench]])
|
||||||
|
|
||||||
|
;; calibrate
|
||||||
|
(quick-bench (reduce + (take 10e6 (range))))
|
||||||
|
|
||||||
|
;; raw java
|
||||||
|
(defn select* [^java.sql.Connection con]
|
||||||
|
(let [ps (doto (.prepareStatement con "SELECT * FROM fruit WHERE appearance = ?")
|
||||||
|
(.setObject 1 "red"))
|
||||||
|
rs (.executeQuery ps)
|
||||||
|
_ (.next rs)
|
||||||
|
value (.getObject rs "name")]
|
||||||
|
(.close ps)
|
||||||
|
value))
|
||||||
|
(quick-bench (select* con))
|
||||||
|
|
||||||
|
;; almost same as the Java example above
|
||||||
|
(quick-bench
|
||||||
|
(reduce (fn [rs m] (reduced (:name m)))
|
||||||
|
nil
|
||||||
|
(reducible! con ["select * from fruit where appearance = ?" "red"])))
|
||||||
|
(quick-bench
|
||||||
|
(execute-one! con
|
||||||
|
["select * from fruit where appearance = ?" "red"]
|
||||||
|
{:row-fn :name}))
|
||||||
|
|
||||||
|
;; simple query
|
||||||
|
(quick-bench
|
||||||
|
(execute! con ["select * from fruit where appearance = ?" "red"]))
|
||||||
|
|
||||||
|
(execute! con ["select * from fruit"])
|
||||||
|
(into [] (map (partial into {})) (reducible! con ["select * from fruit"]))
|
||||||
|
|
||||||
|
;; with a prepopulated prepared statement
|
||||||
|
(with-open [ps (prepare con ["select * from fruit where appearance = ?" "red"] {})]
|
||||||
|
(quick-bench
|
||||||
|
[(reduce (fn [_ row] (reduced (:name row)))
|
||||||
|
nil
|
||||||
|
(reducible! ps))]))
|
||||||
|
|
||||||
|
;; same as above but setting parameters inside the benchmark
|
||||||
|
(with-open [ps (prepare con ["select * from fruit where appearance = ?"] {})]
|
||||||
|
(quick-bench
|
||||||
|
[(reduce (fn [_ row] (reduced (:name row)))
|
||||||
|
nil
|
||||||
|
(reducible! (prepare/set-parameters ps ["red"])))]))
|
||||||
|
|
||||||
|
;; this takes more than twice the time of the one above which seems strange
|
||||||
|
(with-open [ps (prepare con ["select * from fruit where appearance = ?"] {})]
|
||||||
|
(quick-bench
|
||||||
|
[(reduce (fn [_ row] (reduced (:name row)))
|
||||||
|
nil
|
||||||
|
(reducible! (prepare/set-parameters ps ["red"])))
|
||||||
|
(reduce (fn [_ row] (reduced (:name row)))
|
||||||
|
nil
|
||||||
|
(reducible! (prepare/set-parameters ps ["fuzzy"])))]))
|
||||||
|
|
||||||
|
;; full first row
|
||||||
|
(quick-bench
|
||||||
|
(execute-one! con ["select * from fruit where appearance = ?" "red"]))
|
||||||
|
|
||||||
|
;; test assoc works
|
||||||
|
(execute-one! con
|
||||||
|
["select * from fruit where appearance = ?" "red"]
|
||||||
|
{:row-fn #(assoc % :test :value)})
|
||||||
|
|
||||||
|
;; test assoc works
|
||||||
|
(execute! con
|
||||||
|
["select * from fruit where appearance = ?" "red"]
|
||||||
|
{:row-fn #(assoc % :test :value)})
|
||||||
|
|
||||||
|
(with-transaction [t con {:rollback-only? true}]
|
||||||
|
(execute! t ["INSERT INTO fruit (id,name,appearance,cost,grade) VALUES (5,'Pear','green',49,47)"])
|
||||||
|
(execute! t ["select * from fruit where name = ?" "Pear"]))
|
||||||
|
(execute! con ["select * from fruit where name = ?" "Pear"])
|
||||||
|
|
||||||
|
(execute! con ["select * from membership"]))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue