AppHostConfigHelper.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. using System;
  2. using System.Linq;
  3. using System.Configuration;
  4. using System.Collections.Generic;
  5. using System.Threading;
  6. using MongoDB.Bson;
  7. using MongoDB.Bson.Serialization;
  8. using MongoDB.Driver;
  9. using ServiceStack.ServiceHost;
  10. using ServiceStackBenchmark.Model;
  11. namespace ServiceStackBenchmark
  12. {
  13. public static class AppHostConfigHelper
  14. {
  15. public static bool InitMongoDB(this Funq.Container container)
  16. {
  17. try
  18. {
  19. // Register the MySql Database Connection Factory
  20. var mongoDbConnectionString = ConfigurationManager.ConnectionStrings["MongoDB"].ConnectionString;
  21. var client = new MongoClient(mongoDbConnectionString);
  22. var server = client.GetServer();
  23. var database = server.GetDatabase("hello_world");
  24. container.Register<MongoDatabase>(c => database);
  25. BsonClassMap.RegisterClassMap<World>(cm => {
  26. cm.MapProperty(c => c.id);
  27. cm.MapProperty(c => c.randomNumber);
  28. });
  29. BsonClassMap.RegisterClassMap<Fortune>(cm => {
  30. cm.MapProperty(c => c.id);
  31. cm.MapProperty(c => c.message);
  32. });
  33. // Create needed tables in MySql Server if they do not exist
  34. return database.CreateWorldTable() && database.CreateFortuneTable();
  35. }
  36. catch
  37. {
  38. // Unregister failed database connection factory
  39. container.Register<MongoDatabase>(c => null);
  40. return false;
  41. }
  42. }
  43. public static bool InitMySQL(this Funq.Container container)
  44. {
  45. try
  46. {
  47. // Register the MySql Database Connection Factory
  48. var mySqlConnectionString = ConfigurationManager.ConnectionStrings["MySQL"];
  49. var mySqlFactory = new MySqlOrmLiteConnectionFactory(mySqlConnectionString.ConnectionString);
  50. mySqlFactory.DialectProvider.UseUnicode = true;
  51. container.Register<IMySqlOrmLiteConnectionFactory>(c => mySqlFactory);
  52. // Create needed tables in MySql Server if they do not exist
  53. using (var conn = mySqlFactory.OpenDbConnection())
  54. {
  55. return conn.CreateWorldTable() && conn.CreateFortuneTable();
  56. }
  57. }
  58. catch (Exception ex)
  59. {
  60. // Unregister failed database connection factory
  61. container.Register<IMySqlOrmLiteConnectionFactory>(c => null);
  62. return false;
  63. }
  64. }
  65. public static bool InitPostgreSQL(this Funq.Container container)
  66. {
  67. try
  68. {
  69. // Register the PostgreSQL Database Connection Factory
  70. var postgreSqlConnectionString = ConfigurationManager.ConnectionStrings["PostgreSQL"];
  71. var postgreSqlFactory = new PostgreSqlOrmLiteConnectionFactory(postgreSqlConnectionString.ConnectionString);
  72. postgreSqlFactory.DialectProvider.UseUnicode = true;
  73. container.Register<IPostgreSqlOrmLiteConnectionFactory>(c => postgreSqlFactory);
  74. // Create needed tables in PostgreSql Server if they do not exist
  75. using (var conn = postgreSqlFactory.OpenDbConnection())
  76. {
  77. return conn.CreateWorldTable() && conn.CreateFortuneTable();
  78. }
  79. }
  80. catch (Exception ex)
  81. {
  82. // Unregister failed database connection factory
  83. container.Register<IPostgreSqlOrmLiteConnectionFactory>(c => null);
  84. return false;
  85. }
  86. }
  87. public static bool InitSQLServer(this Funq.Container container)
  88. {
  89. try
  90. {
  91. // Register the Microsoft Sql Server Database Connection Factory
  92. var sqlServerConnectionString = ConfigurationManager.ConnectionStrings["SQLServer"];
  93. var sqlServerFactory = new SqlServerOrmLiteConnectionFactory(sqlServerConnectionString.ConnectionString);
  94. sqlServerFactory.DialectProvider.UseUnicode = true;
  95. container.Register<ISqlServerOrmLiteConnectionFactory>(c => sqlServerFactory);
  96. // Create needed tables in Microsoft Sql Server if they do not exist
  97. using (var conn = sqlServerFactory.OpenDbConnection())
  98. {
  99. return conn.CreateWorldTable() && conn.CreateFortuneTable();
  100. }
  101. }
  102. catch (Exception ex)
  103. {
  104. // Unregister failed database connection factory
  105. container.Register<ISqlServerOrmLiteConnectionFactory>(c => null);
  106. return false;
  107. }
  108. }
  109. public static void InitDatabaseRoutes(this Funq.Container container, IServiceRoutes routes)
  110. {
  111. if (container.InitMongoDB())
  112. {
  113. routes.Add<MongoDBDbRequest>("/mongodb/db", "GET");
  114. routes.Add<MongoDBQueriesRequest>("/mongodb/queries/{queries}", "GET");
  115. routes.Add<MongoDBFortunesRequest>("/mongodb/fortunes", "GET");
  116. routes.Add<MongoDBUpdatesRequest>("/mongodb/updates/{queries}", "GET");
  117. routes.Add<MongoDBCachedDbRequest>("/mongodb/cached/db", "GET");
  118. }
  119. if (container.InitMySQL())
  120. {
  121. routes.Add<MySqlDbRequest>("/mysql/db", "GET");
  122. routes.Add<MySqlQueriesRequest>("/mysql/queries/{queries}", "GET");
  123. routes.Add<MySqlFortunesRequest>("/mysql/fortunes", "GET");
  124. routes.Add<MySqlUpdatesRequest>("/mysql/updates/{queries}", "GET");
  125. routes.Add<MySqlCachedDbRequest>("/mysql/cached/db", "GET");
  126. }
  127. if (container.InitPostgreSQL())
  128. {
  129. routes.Add<PostgreSqlDbRequest>("/postgresql/db", "GET");
  130. routes.Add<PostgreSqlQueriesRequest>("/postgresql/queries/{queries}", "GET");
  131. routes.Add<PostgreSqlFortunesRequest>("/postgresql/fortunes", "GET");
  132. routes.Add<PostgreSqlUpdatesRequest>("/postgresql/updates/{queries}", "GET");
  133. routes.Add<PostgreSqlCachedDbRequest>("/postgresql/cached/db", "GET");
  134. }
  135. if (container.InitSQLServer())
  136. {
  137. routes.Add<SqlServerDbRequest>("/sqlserver/db", "GET");
  138. routes.Add<SqlServerQueriesRequest>("/sqlserver/queries/{queries}", "GET");
  139. routes.Add<SqlServerFortunesRequest>("/sqlserver/fortunes", "GET");
  140. routes.Add<SqlServerUpdatesRequest>("/sqlserver/updates/{queries}", "GET");
  141. routes.Add<SqlServerCachedDbRequest>("/sqlserver/cached/db", "GET");
  142. }
  143. }
  144. public static Feature GetDisabledFeatures()
  145. {
  146. try
  147. {
  148. var disabled = ConfigurationManager.AppSettings.Get("DisabledFeatures");
  149. Feature d;
  150. if (Enum.TryParse(disabled, true, out d))
  151. return d;
  152. return Feature.None;
  153. }
  154. catch
  155. {
  156. return Feature.None;
  157. }
  158. }
  159. /// <summary>
  160. /// Method to config the Minimum number of Worker Threads per Logical Processor Count.
  161. /// </summary>
  162. /// <remarks>the Completion Port Threads are set to their defaults as there is no IO concerrency in our app</remarks>
  163. public static void ConfigThreadPool()
  164. {
  165. string minTPLPSetting = ConfigurationManager.AppSettings["minWorkerThreadsPerLogicalProcessor"];
  166. if (minTPLPSetting == null)
  167. return;
  168. int sysMinWorkerThreads, sysMinCompletionPortThreads;
  169. ThreadPool.GetMinThreads(out sysMinWorkerThreads, out sysMinCompletionPortThreads);
  170. int newMinWorkerThreadsPerCPU = Math.Max(1, Convert.ToInt32(minTPLPSetting));
  171. var minWorkerThreads = Environment.ProcessorCount * newMinWorkerThreadsPerCPU;
  172. ThreadPool.SetMinThreads(minWorkerThreads, sysMinCompletionPortThreads);
  173. }
  174. }
  175. }