A prepared statement is something inside a database. The true object
isn't part of JDBC or a JDBC driver.

So you open a connection, then create your SQL using JDBC's
PreparedStatement to tell the DB to use a prepared statement. Next
time that same SQL is used with another JDBC PreparedStatement, the DB
will do it's magic.

Re-using a single PreparedStatement within a Connection is something
you can only do with one Connection on one thread. Generally it's not
worth over-thinking. Using batching is where you really see
performance gains.

This is all separate from parsing from ClojureQL to SQL/JDBC, of course.


On Fri, Jan 7, 2011 at 10:22 AM, Feng <hou...@gmail.com> wrote:
> 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

-- 
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

Reply via email to