Thrift has a prepare_cql call which returns an ID. Then it has an exececute_cql call which takes the id and a map or variable bindings.
On Tue, Apr 23, 2013 at 10:29 AM, Stuart Broad <stu...@moogsoft.com> wrote: > Hi all, > > I just realised that the binary protocol is the low-level thrift api that > I was originally using (Cassandra.Client>> get / insert ...). How can a > prepared statement be called through the thrift api (i.e. not the cql > methods)? > > Cheers, > > Stuart > > > On Tue, Apr 23, 2013 at 11:48 AM, Stuart Broad <stu...@moogsoft.com>wrote: > >> Hi Sylvain, >> >> Thanks for your response. I am handling the >> 'PreparedQueryNotFoundException' more for the case of a cassandra re-start >> (rather then expecting to build 100000 statements). >> >> I am not familiar with the binary protocol - which class/methods should I >> look at? >> >> Regards, >> >> Stuart >> >> >> >> On Tue, Apr 23, 2013 at 11:29 AM, Sylvain Lebresne >> <sylv...@datastax.com>wrote: >> >>> In thrift, a lot of exceptions (like PreparedQueryNotFoundException) are >>> simply returned as InvalidRequestException. The reason for that was a mix >>> of not wanting to change the thrift API too much and because we didn't knew >>> how to return a lot of different exception with thrift without making it >>> horrible to work with. So you'll probably have to parse strings here indeed. >>> >>> This will be cleaner/less fragile if you use the binary protocol as >>> exceptions are more fined grained there. >>> >>> Though taking a step back (and without saying that you shouldn't handle >>> the case where a query is not prepared on the node you contact), if you're >>> really considering preparing more than 100000 statements, I'd suggest that >>> it might be worth benchmarking whether using prepared statements in your >>> case is really going to be worth the trouble. Just saying. >>> >>> -- >>> Sylvain >>> >>> >>> >>> On Tue, Apr 23, 2013 at 12:14 PM, Stuart Broad <stu...@moogsoft.com>wrote: >>> >>>> Hi Sorin, >>>> >>>> The PreparedQueryNotFoundException is not thrown from >>>> Cassandra.Client>>execute_prepared_cql3_query method. I created some >>>> prepared statements and then re-started cassandra and received the >>>> following exception: >>>> >>>> InvalidRequestException(why: Prepared query with ID 1124421588 not >>>> found (either the query was not prepared on this host (maybe the host has >>>> been restarted?) or you have prepared more than 100000 queries and queries >>>> 1124421588 has been evicted from the internal cache)) >>>> >>>> The best I have been able to come up with is the following: >>>> >>>> try { >>>> client.execute_prepared_cql3_query(psId, bindValues, >>>> ..); >>>> } catch (InvalidRequestException invEx) { >>>> String why = invEx.getWhy(); >>>> CLogger.logger().warning(why); >>>> if(why.startsWith("Prepared query with ID")) { >>>> rebuildPreparedStatement(preparedStatement); >>>> client.execute_prepared_cql3_query(psId, >>>> bindValues, ..); >>>> } else { >>>> throw invEx; >>>> } >>>> } >>>> >>>> Obviously this is pretty fragile and would break if the cassandra >>>> message was changed...but it least it works for now! >>>> >>>> Cheers, >>>> >>>> Stuart >>>> >>>> >>>> On Sun, Apr 21, 2013 at 11:51 AM, Sorin Manolache <sor...@gmail.com>wrote: >>>> >>>>> On 2013-04-19 13:57, Stuart Broad wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> I am using Cassandra.Client >>>>>> prepare_cql3_query/execute_**prepared_cql3_query to create and run >>>>>> some >>>>>> prepared statements. It is working well but I am unclear as to how >>>>>> long >>>>>> the server side 'caches' the prepared statements. Should a prepared >>>>>> statement be prepared for every new Cassandra.Client? Based on my >>>>>> limited testing it seems like I can create some prepared statements in >>>>>> one Cassandra.Client and use in another but I am not sure how >>>>>> reliable/lasting this is i.e. If I called the prepared statement >>>>>> again >>>>>> the next day would it still exist? What about if cassandra was >>>>>> re-started? >>>>>> >>>>>> _Background:_ >>>>>> >>>>>> I am creating prepared statements for batch updates of pre-defined >>>>>> lengths (e.g. 10000, 1000, 500, 250, 50, 10, 1) and wanted to know if >>>>>> these could just be set up once. We felt that using the prepared >>>>>> statements was easier than escaping values within a CQL statement and >>>>>> probably more performant. >>>>>> >>>>>> Thanks in advance for your help. >>>>>> >>>>>> >>>>> I've looked in Cassandra's code (v1.2.3). The cache of prepared >>>>> statements has a size of 100,000. So if you prepare more than 100 thousand >>>>> statements, the least recently used ones will vanish. You'll get the >>>>> exception PreparedQueryNotFoundException**, code 0x2500. >>>>> >>>>> Regards, >>>>> Sorin >>>>> >>>>> >>>>> >>>> >>> >> >