mysql-native v2.1.0

bauss jj_1337 at live.dk
Thu Mar 8 11:57:23 UTC 2018


On Thursday, 8 March 2018 at 06:49:52 UTC, Nick Sabalausky 
(Abscissa) wrote:
> On 03/07/2018 02:32 PM, bauss wrote:
>> 
>> Wait why has it been updated to array() ? So it's not a real 
>> range anymore? Or was it always represented as an array behind 
>> the scenes?
>> 
>> I just feel like allocating it into an additional array is a 
>> waste of memory? But if it was always like that I guess it 
>> doesn't matter.
>> 
>
> query() returns an input range. You can only access one element 
> at a time (as its read from the network) and you don't know how 
> many there are ahead of time, BUT it avoids allocating a whole 
> array to store everything.
>
> In addition to query(), there used to also be a querySet(). The 
> querySet() would allocate an array and read ALL the results 
> into it so you could get random-access. But that's exactly what 
> you already get when you call array() on an input range (such 
> as the input range returned by query), so querySet was deemed 
> redundant and eliminated.
>
> So if you had code that *did* need an array allocated to store 
> all the results, then "querySet()" has been replaced with 
> "query().array". But like you said, if you don't really need 
> the array, then there's no need to call array() and waste the 
> memory.
>
>
>> However idk what I changed, but the issue stopped for me.
>> 
>> However I still have this issue:
>> 
>> https://github.com/mysql-d/mysql-native/issues/153
>> 
>> (Currently trying to see if I can make a minimal example, but 
>> it's kinda hard to make a minimal example since it's from my 
>> Diamond MVC (vibe.d) library and it isn't used until deep 
>> nesting of the application.
>> 
>> Anyway before I report anything else I could easily be doing 
>> something wrong. There hasn't exactly been any good examples 
>> on how to use it with vibe.d so it has pretty much been a 
>> trial and error thing for me.
>
> Using mysql-native with vibe.d isn't any different from using 
> it without vibe.d.
>
> It's recommended to use MySQLPool to make a Connection rather 
> than doing "new Connection" directly simply because connecting 
> is faster that way (though "new Connection" will still work).
>
> But aside from that, there is absolutely nothing different 
> about mysql-native whether you're using vibe.d or not.
>
>
>> So basically I keep an associative array of connection pools 
>> based on connection strings like below:
>> 
>> private static __gshared MySQLPool[string] _pools;
>> 
>> And then I retrieve a connection with the function below.
>> 
>> Perhaps I'm not supposed to make a new pool every time, but 
>> there is someway to retrieve a pool already? Maybe that's what 
>> I'm doing wrong?
>> 
>> private static shared globalPoolLock = new Object;
>> 
>> private Connection getMySqlConnection(string connectionString)
>> {
>>    auto pool = _pools.get(connectionString, null);
>> 
>>    if (!pool)
>>    {
>>      synchronized (globalPoolLock)
>>      {
>>        pool = new MySQLPool(connectionString);
>> 
>>        _pools[connectionString] = pool;
>>      }
>>    }
>> 
>>    return pool.lockConnection();
>> }
>> 
>> After I retrieve the connection then it's basically like the 
>> code I showed you, but that seem to be correct, yes?
>
> Does your application need to support multiple connection 
> strings while it's running? That's pretty rare unless you're 
> making something like phpMyAdmin (and even then, I'd probably 
> do it a little differently). Normally you'd just make one 
> connection pool:
>
> MySQLPool pool;
>
> Then "new" that once with your connection string when you start 
> up, and you're good.
>
> I guess I can imagine some potential use-cases that get more 
> complicated than that, but that's really up to your own 
> project's needs.
>
> > However I still have this issue:
> >
> > https://github.com/mysql-d/mysql-native/issues/153
> >
> > (Currently trying to see if I can make a minimal example, but
> it's kinda
> > hard to make a minimal example since it's from my Diamond MVC
> (vibe.d)
> > library and it isn't used until deep nesting of the
> application.
>
> I'm only guessing here, but I wonder if that might be because 
> you seem to be trying to share pools and connections across 
> threads. I don't know whether vibe is designed to share TCP 
> connections across threads or not. I'd say, try ripping out all 
> that shared/__gshared/synchronized stuff and see how that works.

But if you can't store the pools anywhere, how are you supposed 
to use them with vibe.d?

Creating a new pool for every thread seems expensive and dosn't 
that defeat the purpose of using pools in the first place?

I mean a 1000 people could connect to a website and potentially 
that could create a thousand threads (It probably won't, BUT it 
could.) and thus it can't be afforded to create a pool per 
request.

I mean it's kind of a corner case, but it's a common corner case 
for big applications.

I don't create any explicit threads.

But like I said, it seems to work after I stopped returning the 
connection and just the pool.

so I think the problem wasn't the pool, but the connection itself.

At least I can't reproduce it and tried with hundreds of queries 
at once and before I could reproduce with less than 10.

And yes I need support for multiple connection strings. It's not 
an application, it's a library for writing enterprise 
websites/webapis and thus it should be scalable, since most 
enterprise solutions uses multiple databases.




More information about the Digitalmars-d-announce mailing list