| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- //
- // System.Data.SqlClient.SqlConnectionPool.cs
- //
- // Author:
- // Tim Coleman ([email protected])
- //
- // Copyright (C) 2002 Tim Coleman
- //
- using Mono.Data.Tds.Protocol;
- using System;
- using System.Collections;
- using System.Threading;
- namespace System.Data.SqlClient {
- internal class SqlConnectionPool : MarshalByRefObject, IList, ICollection, IEnumerable
- {
- #region Fields
- ArrayList list = new ArrayList ();
- int maxSize;
- int minSize;
- int packetSize;
- int port;
- int timeout;
- string dataSource;
- #endregion // Fields
- #region Constructors
- public SqlConnectionPool (string dataSource, int port, int packetSize, int timeout, int minSize, int maxSize)
- {
- this.dataSource = dataSource;
- this.port = port;
- this.packetSize = packetSize;
- this.timeout = timeout;
- this.minSize = minSize;
- this.maxSize = maxSize;
- }
- #endregion // Constructors
- #region Properties
- public ITds this[int index] {
- get { return (ITds) list[index]; }
- }
- object IList.this[int index] {
- get { return this[index]; }
- set { throw new InvalidOperationException (); }
- }
- public int Count {
- get { return list.Count; }
- }
- public bool IsFixedSize {
- get { return false; }
- }
- public bool IsReadOnly {
- get { return true; }
- }
- public bool IsSynchronized {
- get { return false; }
- }
- public int MaxSize {
- get { return maxSize; }
- }
- public int MinSize {
- get { return minSize; }
- }
- public object SyncRoot {
- get { throw new InvalidOperationException (); }
- }
- #endregion // Properties
- #region Methods
- public int Add (object o)
- {
- return list.Add ((Tds) o);
- }
- public void Clear ()
- {
- list.Clear ();
- }
- public bool Contains (object o)
- {
- return list.Contains ((Tds) o);
- }
- public void CopyTo (Array array, int index)
- {
- list.CopyTo (array, index);
- }
- public IEnumerator GetEnumerator ()
- {
- return list.GetEnumerator ();
- }
- [MonoTODO ("Handle pool exhaustion.")]
- public ITds AllocateConnection ()
- {
- // make sure we have the minimum count (really only useful the first time)
- lock (list) {
- for (int i = Count; i < minSize; i += 1)
- Add (new Tds70 (dataSource, port, packetSize, timeout));
- }
- // Try to obtain a lock
- foreach (object o in list)
- if (Monitor.TryEnter (o))
- return (ITds) o;
- if (Count < maxSize) {
- Tds tds = new Tds70 (dataSource, port, packetSize, timeout);
- Monitor.Enter (tds);
- Add (tds);
- return tds;
- }
- // else we have to wait for one to be available
-
- return null;
- }
- public void ReleaseConnection (ITds tds)
- {
- // Check if connection is still valid
- try
- {
- // Send dummy statement to check connection
- tds.Execute("select 1");
- }
- catch
- {
- // Remove invalid connection
- list.Remove(tds);
- }
- finally
- {
- // Release lock
- Monitor.Exit (tds);
- }
- }
- public int IndexOf (object o)
- {
- return list.IndexOf ((Tds) o);
- }
- public void Insert (int index, object o)
- {
- list.Insert (index, (Tds) o);
- }
- public void Remove (object o)
- {
- list.Remove ((Tds) o);
- }
- public void RemoveAt (int index)
- {
- list.RemoveAt (index);
- }
- #endregion // Methods
- }
- }
|