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

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's ConnPoolDesign demo: http://pgfoundry.org/projects/npgsql
  17. // The following is only proof-of-concept. A final implementation should be based
  18. // on "srcNpgsqlNpgsqlConnectorPool.cs"
  19. using System;
  20. using System.Collections.Generic;
  21. using System.Text;
  22. namespace SharpMap.Data.Providers.Pooling
  23. {
  24. /// <summary>
  25. /// The ConnectorPool class implements the functionality for 
  26. /// the administration of the connectors. Controls pooling and
  27. /// sharing of connectors.
  28. /// </summary>
  29. internal class ConnectorPool
  30. {
  31. /// <summary>Unique static instance of the connector pool manager.</summary>
  32. internal static ConnectorPool ConnectorPoolManager = new ConnectorPool();
  33. /// <summary>List of unused, pooled connectors avaliable to the next RequestConnector() call.</summary>
  34. internal List<Connector> PooledConnectors;
  35. /// <summary>List of shared, in use connectors.</summary>
  36. internal List<Connector> SharedConnectors;
  37. /// <summary>
  38. /// Default constructor, creates a new connector pool object.
  39. /// Should only be used once in an application, since more 
  40. /// than one connector pool does not make much sense..
  41. /// </summary>
  42. internal ConnectorPool()
  43. {
  44. this.PooledConnectors = new List<Connector>();
  45. this.SharedConnectors = new List<Connector>();
  46. }
  47. /// <summary>
  48. /// Searches the shared and pooled connector lists for a
  49. /// matching connector object or creates a new one.
  50. /// </summary>
  51. /// <param name="provider">Provider requested to connect to the database server</param>
  52. /// <param name="Shared">Allows multiple connections on a single connector. </param>
  53. /// <returns>A pooled connector object.</returns>
  54. internal Connector RequestConnector(SharpMap.Data.Providers.IProvider provider, bool Shared)
  55. {
  56. // if a shared connector is requested then the Shared
  57. // Connector List is searched first:
  58. if (Shared)
  59. {
  60. foreach (Connector Connector in this.SharedConnectors)
  61. {
  62. if (Connector.Provider.ConnectionID == provider.ConnectionID)
  63. { // Bingo!
  64. // Return the shared connector to caller.
  65. // The connector is already in use.
  66. Connector._ShareCount++;
  67. return Connector;
  68. }
  69. }
  70. }
  71. // if a shared connector could not be found or a
  72. // nonshared connector is requested, then the pooled
  73. // (unused) connectors are beeing searched.
  74. foreach (Connector Connector in this.PooledConnectors)
  75. {
  76. if (Connector.Provider.ConnectionID == provider.ConnectionID)
  77. { // Bingo!
  78. // Remove the Connector from the pooled connectors list.
  79. this.PooledConnectors.Remove(Connector);
  80. // Make the connector shared if requested
  81. if (Connector.Shared = Shared)
  82. {
  83. this.SharedConnectors.Add(Connector);
  84. Connector._ShareCount = 1;
  85. }
  86. // done...
  87. Connector.InUse = true;
  88. return Connector;
  89. }
  90. }
  91. // No suitable connector found, so create new one
  92. Connector NewConnector = new Connector(provider, Shared);
  93. // Shared connections must be added to the shared 
  94. // connectors list
  95. if (Shared)
  96. {
  97. this.SharedConnectors.Add(NewConnector);
  98. NewConnector._ShareCount = 1;
  99. }
  100. // and then returned to the caller
  101. NewConnector.InUse = true;
  102. NewConnector.Open();
  103. return NewConnector;
  104. }
  105. }
  106. }