MySQL 3/4 - com.mysql.jdbc.Driver And allowMultiQueries=true

Posted March 25, 2009 at 4:20 PM by Ben Nadel

Tags: ColdFusion, SQL

Just a quick note on configuring a MySQL JDBC Driver to allow multiple queries per CFQuery tag when using MySQL 3/4 (pre MySQL 5) on a ColdFusion 8 server. A few months ago, I leaned that you could add "allowMultiQueries=true" to the MySQL 5 connection string. However, today, I had to do some work on a ColdFusion MX 7 box that only had MySQL JDBC driver capabilities. I tried adding the allowMultiQueries to the connection string but this did not work.

After some Googling, I found that you have to add the allowMultiQueries=true to the actual JDBC Url, not the Connection String field:


 
 
 

 
Turning On Multiple Queries Using com.mysql.jdbc.Driver.  
 
 
 

I put that in and it worked nicely.




Reader Comments

Mar 25, 2009 at 4:33 PM // reply »
12 Comments

Make sure your queries are sanitized. Most SQL injection attacks use the ability to do multiple queries per connection.


Mar 25, 2009 at 4:35 PM // reply »
11,238 Comments

@Jules,

Most definitely.


Mar 25, 2009 at 4:35 PM // reply »
8 Comments

This is a setting which would be good to define always.

Depending on some of our projects we had to have on MySQL 5 definition too.

Thanks for sharing ...


Mar 25, 2009 at 9:38 PM // reply »
39 Comments

Maybe this is a dumb question, but I personally liked the thought that it only allowed one query at a time, and because of that much less worry about SQL injection.

Other then the convenience of writing multiple queries in a single cfquery tag, what are the benefits of doing that? A speed boost cause it pack multiple calls to the db into one?

I think it's a neat tip, but I guess I'd need to be convinced on why I'd actually do it.


Mar 25, 2009 at 9:40 PM // reply »
11,238 Comments

@Tim,

My biggest reason for using it is to create a new record and then immediately select the new auto-increment ID created using LAST_INSERT_ID(), or, in newer versions of MySQL, @@Identity.


Mar 26, 2009 at 5:40 AM // reply »
1 Comments

I try to use allowMultiQueries=true as less as possible, hence my default datasource for an application allows only one query at a time. If I need multiple queries for an app I define a second datasource and use it only where needed.

Question: What do folks think about LAST_INSERT_ID() and using it inside 1 cfquery. Is it safe? Or even inside 2 cfquery tags one after another? Would I need <cftransaction> or <cflock type="exclusive"> for that? I am not sure since I heard different opinions on that in the past.


Mar 26, 2009 at 8:25 AM // reply »
12 Comments

@Thilo Hermann,

My opinion on that is, to not use auto incrementing IDs - use UUIDs instead. But I'm sure Mr. Nadel is tired of that discussion =)


Mar 26, 2009 at 8:30 AM // reply »
11,238 Comments

@Thilo,

I have never had a problem with it and I find it to be saver than SELECT MAX(id).


Mar 26, 2009 at 8:30 AM // reply »
11,238 Comments

@Jules,

Ha ha, I never get tired of a good debate :)


Mar 27, 2009 at 2:52 PM // reply »
25 Comments

Try using UUID's as order ID's, and you'll have some pissed customers. :)


Mar 27, 2009 at 3:03 PM // reply »
12 Comments

@Will Tomlinson,
Use incremental IDs for order IDs and folks know how many orders were placed, and try to snoop on other orders.

Sorta like project/invoice and check numbers. My good client can see month to month how many other invoices I've generated besides theirs. And I can see how many checks they've written in the same amount of time.

There would be no security issues in using incremental IDs so long as your app is written correctly. But still, it's kinda like dropping your drawers.

For orders/tracking I use links in emails with the UUID.


Mar 27, 2009 at 3:49 PM // reply »
25 Comments

That's why I use a UUID in another field in the orders table - not as the PK ID.

Then I use the UUID in combination with the PK ID, for any viewing, editing, deletions, etc.

Now, my customer has a nice, short order ID, and UUID that prevents tampering.


Mar 27, 2009 at 4:33 PM // reply »
12 Comments

I'm confused by your method. Doesn't the client still have the PKID, and use it to gain access to order information? They could then still tamper with it - no?


Mar 27, 2009 at 5:20 PM // reply »
25 Comments

The UUID is used much like an unlock key. You need the UUID in order to do anything with the record.

No one can tamper with it because it's nearly impossible to guess someone's UUID.


Mar 27, 2009 at 9:07 PM // reply »
12 Comments

Yes, thats why I like it so much. So why bother with an auto incrementing ID?


Mar 27, 2009 at 10:58 PM // reply »
25 Comments

The incrementing ID is just for the customer to use. Sometimes they call to inquire about an order. They can give my client the four digit ID instead of some long UUID.


Mar 28, 2009 at 11:12 AM // reply »
7 Comments

Backend processing and the CLIENT can use the Auto PKID to simplify look-ups and processing... Such as a means of using @@identity or last insert id on the backend (as already mentioned) or a quick order lookup for the CLIENT... not to be confused with the consumer.

Unless it is in an authenticated section of your application, or you have taken other measures to thwart enumeration, you would never display any order information based on an auto incrementing PKID without combining it with something that ensures the user should be able to see it. Such as a UUID

Securing order information is of course only one scenario. I typically use a secondary UUID field in tables that hold file information for which I don't want the download links easily enumerated. The UUID is passed through the URL as a download key. So a file download link might look like...

http://thedomain.com/files/#fileID#/#downloadKey#

-or-

http://thedomain.com/files/?fileid=#fileID#&downloadKey=#downloadKey#

The where clause on the file lookup would simply be...

where fileID = <cfqueryparam etc... value="#url.fileID#" />
AND downloadKey = <cfqueryparam etc... value="#url.downloadKey#" />

Without the combination of both unique columns, the file record cannot be recovered.


Mar 29, 2009 at 7:54 PM // reply »
110 Comments

Could just use stored procedures and pass parameters off to them. Set the result returned to be the id you're looking for. You wouldn't have to run multiple queries in your cf pages then.


Mar 30, 2009 at 9:19 AM // reply »
11,238 Comments

@Gareth,

I could do that, but then I'd have to write stored procedures :)


Mar 30, 2009 at 9:22 AM // reply »
110 Comments

Have your DBA do it...his name's Ben too, right? :)


Mar 30, 2009 at 9:27 AM // reply »
11,238 Comments

@Gareth,

Ha ha ha, yeah, but he's sooo lazy.


Mar 19, 2010 at 7:26 PM // reply »
1 Comments

Thank you very much for this post. Adding allowMultiQueries="true" in context.xml didn't help until I added it to url as allowMultiQueries=true

Good idea is to use prepared statements and it will help you to avoid possible SQL injection.


Feb 1, 2013 at 9:34 AM // reply »
1 Comments

what if you simple remove any semicolons that are passed in a variable before they reach the query. I can't think of a situation where a semi colon would be legitimately passed from a public form.

#REPLACE(variablename,";","","all")#',

would that be sufficient protection?



Post A Comment

Comment Etiquette: Please do not post spam. Please keep the comments on-topic. Please do not post unrelated questions or large chunks of code. And, above all, please be nice to each other - we're trying to have a good conversation here.

Please review the following issues:

Author Name:


Author Email:

Author Website:

Comment:

Supported HTML tags for formatting: <strong>bold</strong>   <em>italic</em>   <code>code</code>







  • Help Wanted - Find Your Next ColdFusion Job
Ben Nadel's Company - Epicenter Consulting Recent Blog Comments
May 17, 2013 at 7:42 PM
HashKeyCopier - An AngularJS Utility Class For Merging Cached And Live Data
Ben - thanks so much for posting these Angular articles and findings, they've been a huge help towards learning one of the more 'complex' JavaScript frameworks out there (IMO). I have been using Angu ... read »
May 16, 2013 at 5:01 PM
UPDATE: Parsing CSV Data Files In ColdFusion With csvToArray()
Your code was the closest thing I've found to obtaining some direction for converting ISO fields to values that CF can translate properly. Thank you for posting! ... read »
May 15, 2013 at 10:37 PM
Very Simple Pusher And ColdFusion Powered Chat
hi id making plz easy ... read »
May 15, 2013 at 6:07 PM
Making SOAP Web Service Requests With ColdFusion And CFHTTP
Ben, you once again saved my bacon at work. Thank you, thank you, thank you! ... read »
May 15, 2013 at 4:15 PM
What If All User Interface (UI) Data Came In Reports?
@Josh, Thanks! @Ben, I definitely recommend the David West book "Object Thinking" I've been quoting from. It goes deeply into the philosophy and history of OO programming. His breadth ... read »
May 15, 2013 at 11:36 AM
Ask Ben: Print Part Of A Web Page With jQuery
I found this helpfull when you need to keep (refresh) the original parent page after closing the iframe child print dialog (Hoping you're not using a form at this time so it won't submit again): On ... read »
May 14, 2013 at 7:13 PM
What If All User Interface (UI) Data Came In Reports?
@Jonah, If there's any books you'd recommend on the subject of domain modelling, I'd love to hear it. I just downloaded the free PDF of "Domain Driven Design Quickly". Figured I'd give it ... read »
May 14, 2013 at 6:57 PM
The UX Of Prototyping: Low-Fidelity Is The New High-Fidelity
@Phillip, I'm not sure I follow what you mean? Are you saying that you looked at the list of widgets provided by the jQuery UI and let that be your style guide? ... read »
InVision App - Prototyping Made Beautiful With Prototyping Tools