MongoDbClient.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. using Flyinsono.DBCopy.Tool.Entities;
  2. using Microsoft.VisualBasic;
  3. using MongoDB.Bson;
  4. using MongoDB.Driver.Core.Misc;
  5. using MongoDB.Driver;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Diagnostics.Metrics;
  9. using System.Diagnostics;
  10. using System.IO.Packaging;
  11. using System.Linq;
  12. using System.Reflection;
  13. using System.Text;
  14. using System.Threading;
  15. using System.Threading.Tasks;
  16. using System.Windows.Input;
  17. using Flyinsono.DBCopy.Tool.Properties;
  18. using System.Xml.Linq;
  19. using System.Net;
  20. namespace Flyinsono.DBCopy.Tool.Utilities
  21. {
  22. internal class MongoDbClient
  23. {
  24. private const int ConnnectTimeOut = 3000;
  25. private const int WaitQueueTimeout = 3000;
  26. private const int ServerSelectionTimeout = 20000;
  27. private const int SocketTimeout = 20000;
  28. private string _databaseName = "vCloudDb";
  29. private string _host = "localhost";
  30. private int _port = 8333;
  31. private IMongoDatabase _database;
  32. private MongoClient _mongoClient;
  33. public MongoDbClient()
  34. {
  35. BuilderClient();
  36. RegisterEntities();
  37. }
  38. /// <summary>
  39. /// 构造MongoClient
  40. /// </summary>
  41. private void BuilderClient()
  42. {
  43. bool isLocalHost = CommonConfigManager.IsLocalHost;
  44. if (isLocalHost)
  45. {
  46. _databaseName = "vCloudDb";
  47. _host = "localhost";
  48. _port = 8333;
  49. }
  50. else
  51. {
  52. _databaseName = CommonConfigManager.DatabaseInfo.DbName;
  53. _host = CommonConfigManager.DatabaseInfo.Host;
  54. _port = CommonConfigManager.DatabaseInfo.Port;
  55. }
  56. var mongoSetting = new MongoClientSettings
  57. {
  58. ConnectTimeout = TimeSpan.FromSeconds(ConnnectTimeOut),
  59. Server = new MongoServerAddress(_host, _port),
  60. MaxConnectionPoolSize = 2000,
  61. WaitQueueSize = 200,
  62. WaitQueueTimeout = TimeSpan.FromSeconds(WaitQueueTimeout),
  63. ServerSelectionTimeout = TimeSpan.FromSeconds(ServerSelectionTimeout),
  64. SocketTimeout = TimeSpan.FromSeconds(SocketTimeout),
  65. };
  66. Logger.WriteLineInfo($"DBServer {_host}:{_port}");
  67. _mongoClient = new MongoClient(mongoSetting);
  68. _database = _mongoClient.GetDatabase(_databaseName);
  69. }
  70. /// <summary>
  71. /// 关闭Mongo服务
  72. /// </summary>
  73. public void CloseMongodbServer()
  74. {
  75. Stopwatch stopwatch = new Stopwatch();
  76. stopwatch.Start();
  77. try
  78. {
  79. var adminDatabase = _mongoClient.GetDatabase("admin");
  80. adminDatabase.RunCommandAsync(new JsonCommand<BsonDocument>("{shutdown : 1, force : true}"));
  81. }
  82. catch (Exception e)
  83. {
  84. Logger.WriteLineError($"Close Mongodb Server exception: {e}");
  85. }
  86. finally
  87. {
  88. stopwatch.Stop();
  89. Logger.WriteLineInfo($"Close Mongodb Server used: {stopwatch.ElapsedMilliseconds}Milliseconds");
  90. }
  91. }
  92. private IMongoDatabase GetUsedDatabase()
  93. {
  94. int tryCount = 0;
  95. while (_database.Client.Cluster.Description.State == MongoDB.Driver.Core.Clusters.ClusterState.Disconnected && tryCount < 3)
  96. {
  97. _database.Client.Cluster.Initialize();
  98. tryCount++;
  99. Logger.WriteLineInfo($"Rebuilder MongodbClient finish");
  100. Thread.Sleep(1000);
  101. }
  102. return _database;
  103. }
  104. public bool DatabaseExist()
  105. {
  106. Stopwatch stopwatch = new Stopwatch();
  107. stopwatch.Start();
  108. try
  109. {
  110. var database = _mongoClient.GetDatabase("vCloudDb");
  111. return database.ListCollectionNames().Any();
  112. }
  113. catch (Exception ex)
  114. {
  115. Logger.WriteLineError($"Exist Mongodb Server exception: {ex}");
  116. throw new Exception("Database connection timeout,Please restart server!");
  117. }
  118. finally
  119. {
  120. stopwatch.Stop();
  121. Logger.WriteLineInfo($"Exist Mongodb Server used: {stopwatch.ElapsedMilliseconds}Milliseconds");
  122. }
  123. }
  124. public bool MongodServerIsRunning()
  125. {
  126. try
  127. {
  128. var collections = GetUsedDatabase().RunCommand(new JsonCommand<BsonDocument>("{ listCollections: 1 }"));
  129. if (collections.ElementCount > 0)
  130. {
  131. return true;
  132. }
  133. return false;
  134. }
  135. catch
  136. {
  137. return false;
  138. }
  139. }
  140. /// <summary>
  141. /// 获取数据集对象
  142. /// </summary>
  143. /// <typeparam name="T"></typeparam>
  144. /// <param name="collectionName"></param>
  145. /// <returns></returns>
  146. public IMongoCollection<T> GetCollection<T>(string collectionName)
  147. {
  148. IMongoCollection<T> collection = _database.GetCollection<T>(collectionName);
  149. return collection;
  150. }
  151. //private MongoCollectionProxy<T> GetCollectionProxy<T>(string collectionName)
  152. //{
  153. // //return _database.GetCollectionProxy<T>(collectionName);
  154. // _database.GetCollection<T>(collectionName);
  155. //}
  156. public void RunScript(string command)
  157. {
  158. _database.RunCommand(new JsonCommand<BsonDocument>(command));
  159. }
  160. public IMongoCollection<Admins> Admins { get; private set; }
  161. public IMongoCollection<Carotid3dModelData> Carotid3dModelDatas { get; private set; }
  162. public IMongoCollection<ChatMessages> ChatMessages { get; private set; }
  163. public IMongoCollection<ConsultationEvaluates> ConsultationEvaluates { get; private set; }
  164. public IMongoCollection<ConsultationRecords> ConsultationRecords { get; private set; }
  165. public IMongoCollection<Conversations> Conversations { get; private set; }
  166. public IMongoCollection<CourseNoticeReminds> CourseNoticeReminds { get; private set; }
  167. public IMongoCollection<Courses> Courses { get; private set; }
  168. public IMongoCollection<CourseStudents> CourseStudents { get; private set; }
  169. public IMongoCollection<DiagnosisResult> DiagnosisResult { get; private set; }
  170. public IMongoCollection<ExaminationPaper> ExaminationPaper { get; private set; }
  171. public IMongoCollection<ExamScores> ExamScores { get; private set; }
  172. public IMongoCollection<FinishedTerminalRecords> FinishedTerminalRecords { get; private set; }
  173. public IMongoCollection<LectureContestBrowserRecords> LectureContestBrowserRecords { get; private set; }
  174. public IMongoCollection<LectureContestEntryScoreRecords> LectureContestEntryScoreRecords { get; private set; }
  175. public IMongoCollection<LectureContestMessages> LectureContestMessages { get; private set; }
  176. public IMongoCollection<LectureContestResults> LectureContestResults { get; private set; }
  177. public IMongoCollection<LectureContests> LectureContests { get; private set; }
  178. public IMongoCollection<Locations> Locations { get; private set; }
  179. public IMongoCollection<Organizations> Organizations { get; private set; }
  180. public IMongoCollection<PosterConfigs> PosterConfigs { get; private set; }
  181. public IMongoCollection<PosterHistories> PosterHistories { get; private set; }
  182. public IMongoCollection<ReportInfoResults> ReportInfoResults { get; private set; }
  183. public IMongoCollection<StorageFileInfoes> StorageFileInfoes { get; private set; }
  184. public IMongoCollection<TerminalAIDataExcuteRecords> TerminalAIDataExcuteRecords { get; private set; }
  185. public IMongoCollection<TerminalAIDatas> TerminalAIDatas { get; private set; }
  186. public IMongoCollection<TerminalDatas> TerminalDatas { get; private set; }
  187. public IMongoCollection<TerminalRecordReportAISelectResults> TerminalRecordReportAISelectResults { get; private set; }
  188. public IMongoCollection<TerminalRecords> TerminalRecords { get; private set; }
  189. public IMongoCollection<Terminals> Terminals { get; private set; }
  190. public IMongoCollection<UploadStorageFileInfo> UploadStorageFileInfo { get; private set; }
  191. public IMongoCollection<Users> Users { get; private set; }
  192. public IMongoCollection<UsersBak> UsersBak { get; private set; }
  193. public IMongoCollection<OrganizationsBak> OrganizationsBak { get; private set; }
  194. public IMongoCollection<TerminalsBak> TerminalsBak { get; private set; }
  195. public IMongoCollection<TerminalRecordsBak> TerminalRecordsBak { get; private set; }
  196. public IMongoCollection<ConsultationRecordsBak> ConsultationRecordsBak { get; private set; }
  197. public IMongoCollection<LectureContestEntries> LectureContestEntries { get; private set; }
  198. public IMongoCollection<ExamPapers> ExamPapers { get; private set; }
  199. public IMongoCollection<PatientInfos> PatientInfos { get; private set; }
  200. public IMongoCollection<Patients> Patients { get; private set; }
  201. public IMongoCollection<TerminalRecordReportStates> TerminalRecordReportStates { get; private set; }
  202. public IMongoCollection<ReportInfoResultsBak> ReportInfoResultsBak { get; private set; }
  203. public IMongoCollection<UserRoleTypes> UserRoleTypes { get; private set; }
  204. public IMongoCollection<TerminalPushLiveConfigs> TerminalPushLiveConfigs { get; private set; }
  205. public IMongoCollection<Video> Videos { get; private set; }
  206. public IMongoCollection<UserGroup> UserGroups { get; private set; }
  207. public IMongoCollection<UltrasonicClass> UltrasonicClasses { get; private set; }
  208. public IMongoCollection<ReportTemplates> ReportTemplates { get; private set; }
  209. public IMongoCollection<CourseAvailabilityExtensions> CourseAvailabilityExtensions { get; private set; }
  210. public IMongoCollection<CustomLabel> CustomLabels { get; private set; }
  211. public IMongoCollection<VideoCategories> VideoCategories { get; private set; }
  212. public IMongoCollection<VideoSecoundCategories> VideoSecoundCategories { get; private set; }
  213. public IMongoCollection<CloudFiles> CloudFiles { get; private set; }
  214. public IMongoCollection<UserLinkVideos> UserLinkVideos { get; private set; }
  215. public IMongoCollection<TeachingTerminalDatas> TeachingTerminalDatas { get; private set; }
  216. public IMongoCollection<Questionnaires> Questionnaires { get; private set; }
  217. public IMongoCollection<ExamTemplates> ExamTemplates { get; private set; }
  218. public IMongoCollection<DistributionRecords> DistributionRecords { get; private set; }
  219. public IMongoCollection<AnswerSheets> AnswerSheets { get; private set; }
  220. public IMongoCollection<ReportInfoResultsInfo> ReportInfoResultsInfo { get; private set; }
  221. public IMongoCollection<FollowUpVisitInfos> FollowUpVisitInfos { get; private set; }
  222. public IMongoCollection<TrainingBrowsedRecords> TrainingBrowsedRecords { get; private set; }
  223. public IMongoCollection<PrinterDrives> PrinterDrives { get; private set; }
  224. public IMongoCollection<Patch> Patches { get; private set; }
  225. public IMongoCollection<Entities.Package> Packages { get; private set; }
  226. private void RegisterEntities()
  227. {
  228. Admins = GetCollection<Admins>("Admins");
  229. Carotid3dModelDatas = GetCollection<Carotid3dModelData>("Carotid3dModelDatas");
  230. ChatMessages = GetCollection<ChatMessages>("ChatMessages");
  231. ConsultationEvaluates = GetCollection<ConsultationEvaluates>("ConsultationEvaluates");
  232. ConsultationRecords = GetCollection<ConsultationRecords>("ConsultationRecords");
  233. ConsultationRecordsBak = GetCollection<ConsultationRecordsBak>("ConsultationRecordsBak");
  234. Conversations = GetCollection<Conversations>("Conversations");
  235. CourseNoticeReminds = GetCollection<CourseNoticeReminds>("CourseNoticeReminds");
  236. Courses = GetCollection<Courses>("Courses");
  237. CourseStudents = GetCollection<CourseStudents>("CourseStudents");
  238. DiagnosisResult = GetCollection<DiagnosisResult>("DiagnosisResult");
  239. ExaminationPaper = GetCollection<ExaminationPaper>("ExaminationPaper");
  240. ExamScores = GetCollection<ExamScores>("ExamScores");
  241. FinishedTerminalRecords = GetCollection<FinishedTerminalRecords>("FinishedTerminalRecords");
  242. LectureContestBrowserRecords = GetCollection<LectureContestBrowserRecords>("LectureContestBrowserRecords");
  243. LectureContestEntryScoreRecords = GetCollection<LectureContestEntryScoreRecords>("LectureContestEntryScoreRecords");
  244. LectureContestMessages = GetCollection<LectureContestMessages>("LectureContestMessages");
  245. LectureContestResults = GetCollection<LectureContestResults>("LectureContestResults");
  246. LectureContests = GetCollection<LectureContests>("LectureContests");
  247. Locations = GetCollection<Locations>("Locations");
  248. Organizations = GetCollection<Organizations>("Organizations");
  249. OrganizationsBak = GetCollection<OrganizationsBak>("OrganizationsBak");
  250. PosterConfigs = GetCollection<PosterConfigs>("PosterConfigs");
  251. PosterHistories = GetCollection<PosterHistories>("PosterHistories");
  252. ReportInfoResults = GetCollection<ReportInfoResults>("ReportInfoResults");
  253. StorageFileInfoes = GetCollection<StorageFileInfoes>("StorageFileInfoes");
  254. TerminalAIDataExcuteRecords = GetCollection<TerminalAIDataExcuteRecords>("TerminalAIDataExcuteRecords");
  255. TerminalAIDatas = GetCollection<TerminalAIDatas>("TerminalAIDatas");
  256. TerminalDatas = GetCollection<TerminalDatas>("TerminalDatas");
  257. TerminalRecordReportAISelectResults = GetCollection<TerminalRecordReportAISelectResults>("TerminalRecordReportAISelectResults");
  258. TerminalRecords = GetCollection<TerminalRecords>("TerminalRecords");
  259. TerminalRecordsBak = GetCollection<TerminalRecordsBak>("TerminalRecordsBak");
  260. Terminals = GetCollection<Terminals>("Terminals");
  261. TerminalsBak = GetCollection<TerminalsBak>("TerminalsBak");
  262. UploadStorageFileInfo = GetCollection<UploadStorageFileInfo>("UploadStorageFileInfo");
  263. Users = GetCollection<Users>("Users");
  264. UsersBak = GetCollection<UsersBak>("UsersBak");
  265. LectureContestEntries = GetCollection<LectureContestEntries>("LectureContestEntries");
  266. ExamPapers = GetCollection<ExamPapers>("ExamPapers");
  267. TerminalRecordReportStates = GetCollection<TerminalRecordReportStates>("TerminalRecordReportStates");
  268. PatientInfos = GetCollection<PatientInfos>("PatientInfos");
  269. Patients = GetCollection<Patients>("Patients");
  270. ReportInfoResultsBak = GetCollection<ReportInfoResultsBak>("ReportInfoResultsBak");
  271. UserRoleTypes = GetCollection<UserRoleTypes>("UserRoleTypes");
  272. TerminalPushLiveConfigs = GetCollection<TerminalPushLiveConfigs>("TerminalPushLiveConfigs");
  273. Videos = GetCollection<Video>("Videos");
  274. UserGroups = GetCollection<UserGroup>("UserGroups");
  275. UltrasonicClasses = GetCollection<UltrasonicClass>("UltrasonicClasses");
  276. ReportTemplates = GetCollection<ReportTemplates>("ReportTemplates");
  277. CourseAvailabilityExtensions = GetCollection<CourseAvailabilityExtensions>("CourseAvailabilityExtensions");
  278. CustomLabels = GetCollection<CustomLabel>("CustomLabels");
  279. VideoCategories = GetCollection<VideoCategories>("VideoCategories");
  280. VideoSecoundCategories = GetCollection<VideoSecoundCategories>("VideoSecoundCategories");
  281. UserLinkVideos = GetCollection<UserLinkVideos>("UserLinkVideos");
  282. TeachingTerminalDatas = GetCollection<TeachingTerminalDatas>("TeachingTerminalDatas");
  283. Questionnaires = GetCollection<Questionnaires>("Questionnaires");
  284. ExamTemplates = GetCollection<ExamTemplates>("ExamTemplate");
  285. DistributionRecords = GetCollection<DistributionRecords>("DistributionRecords");
  286. AnswerSheets = GetCollection<AnswerSheets>("AnswerSheets");
  287. CloudFiles = GetCollection<CloudFiles>("CloudFiles");
  288. ReportInfoResultsInfo = GetCollection<ReportInfoResultsInfo>("ReportInfoResults");
  289. FollowUpVisitInfos = GetCollection<FollowUpVisitInfos>("FollowUpVisitInfos");
  290. TrainingBrowsedRecords = GetCollection<TrainingBrowsedRecords>("TrainingBrowsedRecords");
  291. PrinterDrives = GetCollection<PrinterDrives>("PrinterDrives");
  292. Patches = GetCollection<Patch>("Patches");
  293. Packages = GetCollection<Entities.Package>("Packages");
  294. }
  295. }
  296. internal class MongoDbClientSingle : Singleton<MongoDbClient>
  297. {
  298. private MongoDbClientSingle() { }
  299. }
  300. /// <summary>
  301. /// 统一单例构造类
  302. /// </summary>
  303. /// <typeparam name="T"></typeparam>
  304. public abstract class Singleton<T> where T : class, new()
  305. {
  306. /// <summary>
  307. /// 统一单例实例
  308. /// </summary>
  309. public static T Instance { get; set; } = new T();
  310. }
  311. }