Connector.cs
上传用户:sex100000
上传日期:2013-11-09
资源大小:1377k
文件大小:5k
源码类别:

GIS编程

开发平台:

C#

  1. // Copyright 2005, 2006 - Morten Nielsen (www.iter.dk)
  2. //
  3. // This file is part of SharpMap.
  4. // SharpMap is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation; either version 2 of the License, or
  7. // (at your option) any later version.
  8. // 
  9. // SharpMap is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. // GNU Lesser General Public License for more details.
  13. // You should have received a copy of the GNU Lesser General Public License
  14. // along with SharpMap; if not, write to the Free Software
  15. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
  16. // Based on ngpsql: http://pgfoundry.org/projects/npgsql
  17. // The following is only proof-of-concept. A final implementation should be based
  18. // on "srcNpgsqlNpgsqlConnector.cs"
  19. using System;
  20. using System.Collections.Generic;
  21. using System.Text;
  22. namespace SharpMap.Data.Providers.Pooling
  23. {
  24. /// <summary>
  25. /// The Connector class implements the logic for the Connection 
  26. /// Objects to access the physical connection to the data source, and 
  27. /// isolate the application developer from connection pooling 
  28. /// internals.
  29. /// </summary>
  30. internal class Connector
  31. {
  32. /// <summary>Instance Counting</summary>
  33. /// <remarks>!!! for debugging only</remarks>
  34. private static int InstanceCounter;
  35. internal int InstanceNumber;
  36. /// <summary>Buffer for the public Pooled property</summary>
  37. /// <remarks>Pooled will be ignored if Shared is set!</remarks>
  38. internal bool Pooled;
  39. /// <summary>Buffer for the public Shared property</summary>
  40. private bool _Shared;
  41. /// <summary>Controls the physical connection sharing.</summary>
  42. /// <remarks>Can only be set via ConnectorPool.Request().</remarks>
  43. internal bool Shared
  44. {
  45. get { return this._Shared; }
  46. set { if (!this.InUse) this._Shared = value; }
  47. }
  48. /// <summary>Counts the numbers of Connections that share
  49. /// this Connector. Used in Release() to decide wether this
  50. /// connector is to be moved to the PooledConnectors list.</summary>
  51. internal int _ShareCount;
  52. /// <summary>Share count, read only</summary>
  53. /// <remarks>!!! for debugging only</remarks>
  54. internal int ShareCount
  55. {
  56. get { return this._ShareCount; }
  57. }
  58. private SharpMap.Data.Providers.IProvider _Provider;
  59. /// <summary>
  60. /// Used to connect to the data source. 
  61. /// </summary>
  62. internal SharpMap.Data.Providers.IProvider Provider
  63. {
  64. get { return _Provider; }
  65. set
  66. {
  67. if (this.InUse)
  68. {
  69. throw new ApplicationException("Provider cannot be modified if connection is open.");
  70. }
  71. _Provider = value;
  72. }
  73. }
  74. /// <summary>True if the physical connection is in used 
  75. /// by a Connection Object. That is, if the connector is
  76. /// not contained in the PooledConnectors List.</summary>
  77. internal bool InUse;
  78. /// <summary>
  79. /// Construcor, initializes the Connector object.
  80. /// </summary>
  81. internal Connector(SharpMap.Data.Providers.IProvider provider, bool Shared)
  82. {
  83. this.Provider = provider;
  84. this._Shared = Shared;
  85. this.Pooled = true;
  86. Connector.InstanceCounter++;
  87. this.InstanceNumber = Connector.InstanceCounter;
  88. }
  89. /// <summary>
  90. /// Opens the physical connection to the server.
  91. /// </summary>
  92. /// <remarks>Usually called by the RequestConnector
  93. /// Method of the connection pool manager.</remarks>
  94. internal void Open()
  95. {
  96. this.Provider.Open();
  97. }
  98. internal void Release()
  99. {
  100. if (this._Shared)
  101. {
  102. // A shared connector is returned to the pooled connectors
  103. // list only if it is not used by any Connection object.
  104. // Otherwise the job is done by simply decrementing the
  105. // usage counter:
  106. if (--this._ShareCount == 0)
  107. {
  108. // Shared connectors are *always* pooled after usage.
  109. // Depending on the Pooled property at this point
  110. // might introduce a lot of trouble into an application...
  111. ConnectorPool.ConnectorPoolManager.SharedConnectors.Remove(this);
  112. ConnectorPool.ConnectorPoolManager.PooledConnectors.Add(this);
  113. this.Pooled = true;
  114. this.InUse = false;
  115. }
  116. }
  117. else // it is a nonshared connector
  118. {
  119. if (this.Pooled)
  120. {
  121. // Pooled connectors are simply put in the
  122. // PooledConnectors list for later recycling
  123. this.InUse = false;
  124. ConnectorPool.ConnectorPoolManager.PooledConnectors.Add(this);
  125. }
  126. else
  127. {
  128. // Unpooled private connectors get the physical
  129. // connection closed, they are *not* recyled later.
  130. // Instead they are (implicitly) handed over to the
  131. // garbage collection.
  132. // !!! to be fixed
  133. this.Provider.Close();
  134. this.Provider.Dispose();
  135. }
  136. }
  137. }  
  138. }
  139. }