public ConnectionPoolEntry GetConnection(string connectionString, AuthData authData)
        {
            var key = connectionString;

            ConnectionPoolEntry rv = null;

            avalableConnections.AddOrUpdate(key, k => new ConcurrentStack <ConnectionPoolEntry>(), (k, c) =>
            {
                while (c.TryPop(out var entry))
                {
                    //if we discover that the entry has expired, dispose of it
                    //this typically happens when the entry uses BEARER auth and its token
                    //has expired (or is about to).
                    if (entry.ValidTo > DateTime.Now.Subtract(TimeSpan.FromMinutes(1)))
                    {
                        entry.Connection.Dispose();
                        continue;
                    }

                    rv = entry;
                    break;
                }

                return(c);
            });
        public void ReturnConnection(ConnectionPoolEntry entry)
        {
            var key = entry.ConnectionString;

            entry.RecordCheckIn();
            avalableConnections[key].Push(entry);
        }