Пример #1
0
        public DbConnectionInstance GetDbConnection(string connectionString, bool waitingUntilUseable)
        {
            List <DbConnectionInstance> instances = null;

            lock (_dbConnInstances)
            {
                if (!_dbConnInstances.ContainsKey(connectionString))
                {
                    DbConnectionInstance instance = CreateNewInstance(connectionString);
                    instance.IsBusy = true;
                    instances       = new List <DbConnectionInstance>();
                    instances.Add(instance);
                    _dbConnInstances.Add(connectionString, instances);
                    return(instance);
                }
            }
            instances = _dbConnInstances[connectionString];
            lock (instances)
            {
                foreach (DbConnectionInstance instance in instances)
                {
                    if (!instance.IsBusy)
                    {
                        instance.IsBusy = true;
                        return(instance);
                    }
                }
                //
                if (instances.Count < cstMaxConnectionCount)
                {
                    DbConnectionInstance instance = CreateNewInstance(connectionString);
                    instance.IsBusy = true;
                    instances.Add(instance);
                    return(instance);
                }
            }
            //
            while (true && waitingUntilUseable)
            {
waitingLine:
                int n = instances.Count;
                for (int i = 0; i < n; i++)
                {
                    if (!instances[i].IsBusy)
                    {
                        instances[i].IsBusy = true;
                        return(instances[i]);
                    }
                }
                Thread.Sleep(cstWaitingInterval);
                goto waitingLine;
            }
            return(null);
        }
Пример #2
0
 public void FreeDbConnectionInstance(DbConnectionInstance instance)
 {
     instance.IsBusy = false;
 }