I think you are missing out on garbage collection here.
Did not check your code, but this can certainly be the source of the problem.
var sqlReq:SQLRequest = new SQLRequest(handleResult, _dbConn, sql); sqlReq.startLoad();
The sqlReq reference is local to the function and becomes inaccessible when the function returns. This makes it collectible. I assume that there should be some code in the AIR runtime that collects garbage more aggressively when there are sql connections associated with it. Because, as a rule, you will get rid of not having to store a link to your object (at least in a web environment, in my experience, this is a mistake in such code, however, you just need to be on a bad day, to experience it).
setTimeout masks this problem (or almost solves it, albeit inadvertently), because the setTimeout function uses Timer internally. Timers do not start. Thus, the timer is alive and kicking and has a link to your instance of SQLRequest , which makes it reusable, and therefore it cannot be read for collection. If your DB call takes longer than the wait time, you are in the same situation again.
To solve this problem, keep a reference to the object and delete it correctly when done.
Edit
Another option, if you do not want to change the way the code works, stores the ref in the instance in the dictionary with the class (i.e., static) for the entire duration of the call (this shoul dictionary does not use weak reference keys for obvious reasons).
You add a hidden side effect to your method, which is not a sign of good design in general, but as long as you delete it when the call to the database is completed (whether it was done or not) is safe, so I think that the problem is more in style than in anything else.
What I mean is something like this:
private static var _dict:Dictionary = new Dictionary(); public function startLoad():void {