@ben.sless If you really need to optimize fetching stuff to the point that you can't use map->SomeRecordType
, have you considered just writing your own low-level code to fetch the rows from the ResultSet
in this case? I think that would be a little easier and faster than the big macro to reify RowBuilder
and ResultSetBuilder
. If you know what columns are coming back you can avoid the overhead of having to programatically figure that out via the ResultSetMetaData
, the calls to read-column-by-index
, etc. e.g.
(defrecord Person [id name])
(defn reducible-people-results [^java.sql.ResultSet rs]
(reify
clojure.lang.IReduceInit
(reduce [_ rf init]
(loop [acc init]
(cond
(reduced? acc) acc
(.next rs) (recur (rf acc (->Person
(.getInt rs "id")
(.getString rs "name"))))
:else acc)))))
(toucan2.conn/with-connection [conn :test/postgres]
(with-open [stmt (.prepareStatement conn "SELECT id, name FROM people;")
rset (.executeQuery stmt)]
(reduce
conj
[]
(reducible-people-results rset))))
;; ->
[#Person{:id 1, :name "Cam"}
#Person{:id 2, :name "Sam"}
#Person{:id 3, :name "Pam"}
#Person{:id 4, :name "Tam"}]
Normally I wouldn't advocate writing such low-level JDBC code but if you're at the point you don't want to use the map->Record
fn because of overhead then it might be time to tune stuff a little furtherThanks Cam, I'm trying to make the least amount of mess in the code base I'm in. Adding adapters in hugsql using jdbc.next isn't a big change. Changing what actually returns from the query will give my colleagues a fit
And this is all temporary and I hope to tear it all out in the end