I'd suggest ClojureQL only optimize lisp form to SQL text transformation, and provide options whether to use PreparedStatement or not. Leave other kind of optimizations to databases/drivers.
Some thoughts below: - PreparedStatement avoids high cost of frequent query planning (oracle call it hard parsing) and SQL injection, which are critical for OLTP workload. However, it's not always good practice for datawarehousing queries. In some high end databases, query planner need to see join and filter conditions as constant for the best query planning (e.g. leveraging histogram, partition statistics). ClojureQL can provide controls to evaluate clojure variables right before creating SQL string. Not sure about whether at variable level, or statement level, or connection level though. I can see various trade- offs (simplicity vs flexibility etc). - Client side JDBC Statement caching should leave to db Driver, or DataSource implementations. Most of high end database and JEE appserver do, with various trade-offs and complexities. I think ClojureQL should stay away from them. BTW, great library and fun to use! On Jan 7, 6:23 am, LauJensen <lau.jen...@bestinclass.dk> wrote: > Hi Sean, > > Half right - It will compile everytime, but not necessary create the > AST everytime: > > (let [my-table (-> (table :user) > (select (where (= :id user-id))) > (project [:dateofbirth :gender :zipcode]))] > (repeatedly @my-table)) > > However I see there are some good thoughts on optimization in this > thread already. > Perhaps is the AST always kept the SQL representation in a field, we > could totally > avoid re-compilation for repeat queries. That would still created the > preparedStatement, > but Im not sure thats a real time-stealer. I'll have to check. > > On Jan 7, 1:33 am, Sean Corfield <seancorfi...@gmail.com> wrote: > > > On Thu, Jan 6, 2011 at 2:33 AM, LauJensen <lau.jen...@bestinclass.dk> wrote: > > > Yes the two statements are equivalent. ClojureQL compiles everything > > > to prepared > > > statements, with every argument automatically paramterized. > > > Cool, that's what I'd hoped. But just to clarify... > > > If I have code that repeatedly calls this: > > > @(-> (table :user) > > (select (where (= :id user-id))) > > (project [:dateofbirth :gender :zipcode])) > > > it is going to construct that AST and compile it to SQL every time it > > hits it, yes? > > -- > > Sean A Corfield -- (904) 302-SEAN > > Railo Technologies, Inc. --http://getrailo.com/ > > An Architect's View --http://corfield.org/ > > > "If you're not annoying somebody, you're not really alive." > > -- Margaret Atwood -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en