ylbtech-Class:DbConnectionManipulator.cs
1.返回顶部
1、DbConnectionManipulator.cs
  1. using System;
  2. using System.Configuration;
  3. using System.Data;
  4. using System.Data.SqlClient;
  5. using System.Threading.Tasks;
  6.  
  7. namespace DS.JZB.Common {
  8. public abstract class DbConnectionManipulator {
  9. public static string DatabaseConnectionStringName = "DatabaseCs";
  10. public static string IndexDatabaseConnectionStringName = "DatabaseCs";
  11. public const int SplitDatabaseCount = ;
  12.  
  13. protected IDbConnection GetConnection() {
  14. return GetMainDatabaseConnection();
  15. }
  16.  
  17. protected void Run(Action<IDbConnection> work) {
  18. Run(GetConnection(), work);
  19. }
  20.  
  21. protected void Run(IDbConnection connection, Action<IDbConnection> work) {
  22. using (connection) {
  23. work(connection);
  24. }
  25. }
  26.  
  27. protected void RunInTransaction(Action<IDbConnection, IDbTransaction> work) {
  28. RunInTransaction(GetConnection(), work);
  29. }
  30.  
  31. protected void RunInTransaction(IDbConnection connection, Action<IDbConnection, IDbTransaction> work) {
  32. using (connection) {
  33. using (var transaction = connection.BeginTransaction()) {
  34. try {
  35. work(connection, transaction);
  36. transaction.Commit();
  37. }
  38. catch {
  39. transaction.Rollback();
  40. throw;
  41. }
  42. }
  43. }
  44. }
  45.  
  46. public static IDbConnection GetMainDatabaseConnection(string databaseCs = "") {
  47. //if (string.IsNullOrEmpty(databaseCs)) {
  48. // if (UserContext.CurrentUser != null && UserContext.CurrentUser.GlobalTeamId > 0) {
  49. // var teamId = UserContext.CurrentUser.GlobalTeamId;
  50. // DatabaseConnectionStringName = "DatabaseCs" + (teamId % SplitDatabaseCount + 1);
  51. // }
  52. // else {
  53. // DatabaseConnectionStringName = "DatabaseCs";
  54. // }
  55. //}
  56. //else {
  57. // DatabaseConnectionStringName = databaseCs;
  58. //}
  59.  
  60. var connection =
  61. new SqlConnection(ConfigurationManager.ConnectionStrings[DatabaseConnectionStringName].ConnectionString);
  62. connection.EnsureOpen();
  63. return connection;
  64. }
  65.  
  66. public static void RunMainDatabase(Action<IDbConnection> work, string databaseCs = "") {
  67. RunMainDatabase(GetMainDatabaseConnection(databaseCs), work);
  68. }
  69.  
  70. public static T RunMainDatabase<T>(Func<IDbConnection, T> work, string databaseCs = "") {
  71. return RunMainDatabase(GetMainDatabaseConnection(databaseCs), work);
  72. }
  73.  
  74. private static void RunMainDatabase(IDbConnection connection, Action<IDbConnection> work) {
  75. using (connection) {
  76. work(connection);
  77. }
  78. }
  79.  
  80. private static T RunMainDatabase<T>(IDbConnection connection, Func<IDbConnection, T> work) {
  81. using (connection) {
  82. return work(connection);
  83. }
  84. }
  85.  
  86. public static void RunMainDatabaseInTransaction(Action<IDbConnection, IDbTransaction> work,
  87. string databaseCs = "") {
  88. RunMainDatabaseInTransaction(GetMainDatabaseConnection(databaseCs), work);
  89. }
  90.  
  91. public static T RunMainDatabaseInTransaction<T>(Func<IDbConnection, IDbTransaction, T> work,
  92. string databaseCs = "") {
  93. return RunMainDatabaseInTransaction(GetMainDatabaseConnection(databaseCs), work);
  94. }
  95.  
  96. public static void RunMainDatabaseInTransaction(IDbConnection connection,
  97. Action<IDbConnection, IDbTransaction> work) {
  98. #if DEBUG
  99. //var guid = Guid.Empty;
  100. //if (HttpContext.Current.Items.Contains("DUUID")) {
  101. // guid = (Guid)HttpContext.Current.Items["DUUID"];
  102. //}
  103. //else {
  104. // guid = Guid.NewGuid();
  105. // HttpContext.Current.Items["DUUID"] = guid;
  106. //}
  107.  
  108. //var logger = typeof(DbConnectionManipulator).ObtainLog();
  109. //logger.Debug($"[{guid.ToString("n")}] get connection to execute db queries");
  110. #endif
  111.  
  112. using (connection) {
  113. using (var transaction = connection.BeginTransaction()) {
  114. try {
  115. work(connection, transaction);
  116. transaction.Commit();
  117. }
  118. catch(Exception ex) {
  119. transaction.Rollback();
  120. throw;
  121. }
  122. }
  123. }
  124.  
  125. #if DEBUG
  126. //logger.Debug($"[{guid.ToString("n")}] release connection to connection pool");
  127. #endif
  128. }
  129.  
  130. public static T RunMainDatabaseInTransaction<T>(IDbConnection connection,
  131. Func<IDbConnection, IDbTransaction, T> work) {
  132. #if DEBUG
  133. //var guid = Guid.Empty;
  134. //if (HttpContext.Current.Items.Contains("DUUID")) {
  135. // guid = (Guid)HttpContext.Current.Items["DUUID"];
  136. //}
  137. //else {
  138. // guid = Guid.NewGuid();
  139. // HttpContext.Current.Items["DUUID"] = guid;
  140. //}
  141.  
  142. //var logger = typeof(DbConnectionManipulator).ObtainLog();
  143. //logger.Debug($"[{guid.ToString("n")}] get connection to execute db queries");
  144. #endif
  145.  
  146. T result = default(T);
  147.  
  148. using (connection) {
  149. using (var transaction = connection.BeginTransaction()) {
  150. try {
  151. result = work(connection, transaction);
  152. transaction.Commit();
  153. }
  154. catch {
  155. transaction.Rollback();
  156. throw;
  157. }
  158. }
  159. }
  160.  
  161. #if DEBUG
  162. //logger.Debug($"[{guid.ToString("n")}] release connection to connection pool");
  163. #endif
  164.  
  165. return result;
  166. }
  167.  
  168. public static void RunAllSplitDatabase(Action<IDbConnection> work) {
  169. for (var i = ; i <= SplitDatabaseCount; i++) {
  170. RunMainDatabase(work, $"DatabaseCs{i}");
  171. }
  172. }
  173.  
  174. public static void ForEachSplitDatabase(Func<IDbConnection, bool> work) {
  175. for (var i = ; i <= SplitDatabaseCount; i++) {
  176. if (RunMainDatabase(work, $"DatabaseCs{i}")) {
  177. break;
  178. }
  179. }
  180. }
  181.  
  182. public static int GetTeamDatabaseIndex(int teamId) {
  183. return teamId % SplitDatabaseCount + ;
  184. }
  185.  
  186. public static string GetTeamDatabaseName(int teamId) {
  187. return $"DatabaseCs{(teamId % SplitDatabaseCount + 1)}";
  188. }
  189.  
  190. public static string GetIndexDatabaseName() {
  191. return "DatabaseCs";
  192. }
  193.  
  194. protected Task RunAsync(Func<IDbConnection, Task> work) {
  195. return RunAsync(GetConnection(), work);
  196. }
  197.  
  198. protected Task RunAsync(IDbConnection connection, Func<IDbConnection, Task> work) {
  199. #if DEBUG
  200. //var guid = Guid.Empty;
  201. //if (HttpContext.Current.Items.Contains("DUUID")) {
  202. // guid = (Guid)HttpContext.Current.Items["DUUID"];
  203. //}
  204. //else {
  205. // guid = Guid.NewGuid();
  206. // HttpContext.Current.Items["DUUID"] = guid;
  207. //}
  208.  
  209. //var logger = typeof(DbConnectionManipulator).ObtainLog();
  210. //logger.Debug($"[{guid.ToString("n")}] get connection to execute db queries");
  211. #endif
  212.  
  213. Task result = null;
  214.  
  215. using (connection) {
  216. result = work(connection);
  217. connection.Dispose();
  218. }
  219.  
  220. #if DEBUG
  221. //logger.Debug($"[{guid.ToString("n")}] release connection to connection pool");
  222. #endif
  223.  
  224. return result;
  225. }
  226.  
  227. public static Task RunMainDatabaseAsync(Func<IDbConnection, Task> work) {
  228. return RunMainDatabaseAsync(GetMainDatabaseConnection(), work);
  229. }
  230.  
  231. private static async Task RunMainDatabaseAsync(IDbConnection connection, Func<IDbConnection, Task> work) {
  232. #if DEBUG
  233. //var guid = Guid.Empty;
  234. //if (HttpContext.Current.Items.Contains("DUUID")) {
  235. // guid = (Guid) HttpContext.Current.Items["DUUID"];
  236. //}
  237. //else {
  238. // guid = Guid.NewGuid();
  239. // HttpContext.Current.Items["DUUID"] = guid;
  240. //}
  241.  
  242. //var logger = typeof(DbConnectionManipulator).ObtainLog();
  243. //logger.Debug($"[{guid.ToString("n")}] get connection to execute db queries");
  244. #endif
  245.  
  246. using (connection) {
  247. await work(connection);
  248. connection.Dispose();
  249. }
  250.  
  251. #if DEBUG
  252. //logger.Debug($"[{guid.ToString("n")}] release connection to connection pool");
  253. #endif
  254. }
  255. }
  256.  
  257. public static class DbConnectionExtension {
  258. public static void EnsureOpen(this IDbConnection @this) {
  259. if (@this.State == ConnectionState.Closed) {
  260. @this.Open();
  261. }
  262. }
  263. }
  264. }
2、
2.返回顶部
 
3.返回顶部
 
4.返回顶部
 
5.返回顶部
 
 
6.返回顶部
 
作者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Class:DbConnectionManipulator.cs的更多相关文章

  1. ASP.NET MVC:UrlHelper.cs

    ylbtech-funcation-Utility: ASP.NET MVC:UrlHelper.cs 充当表示 ASP.NET Razor 页的类的基类. 1.UrlHelper 类返回顶部 1-1 ...

  2. ASP.NET MVC:WebPageBase.cs

    ylbtech-funcation-Utility: ASP.NET MVC:WebPageBase.cs 充当表示 ASP.NET Razor 页的类的基类. 1.A,WebPageBase 抽象类 ...

  3. ASP.NET MVC:WebPageRenderingBase.cs

    ylbtech-funcation-Utility: ASP.NET MVC:WebPageRenderingBase.cs 提供用于呈现使用 Razor 视图引擎的页的方法和属性. 1.A,WebP ...

  4. ASP.NET MVC:WebViewPage.cs

    ylbtech-funcation-Utility: ASP.NET MVC:WebViewPage.cs 表示呈现使用 ASP.NET Razor 语法的视图所需的属性和方法. 1.A,WebVie ...

  5. 基本教程篇--第一节:InitialSampleDemo.cs介绍

       第一节:InitialSampleDemo.cs介绍         为了讲解方便,我先附上源代码和效果图. 代码如下: using System; using System.Drawing; ...

  6. C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone

    C# Json反序列化   Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...

  7. .Net魔法堂:AssemblyInfo.cs文件详解

    一.前言 .net工程的Properties文件夹下自动生成一个名为AssemblyInfo.cs的文件,一般情况下我们很少直接改动该文件.但我们实际上通过另一个形式操作该文件.那就是通过在鼠标右键点 ...

  8. .NET Core 项目经验总结:Startup.cs 介绍(二)

    原文地址(个人博客):http://www.gitblogs.com/Blogs/Details?id=643c9664-dc4e-42cf-a15f-5368ebfcd7c9 第一次面对 Start ...

  9. 架构风格:万金油CS与分层

    计算机科学家David Wheele曾说过这么一句话: All problems in computer science can be solved by another level of indir ...

随机推荐

  1. 通过impala更改Kudu表属性

    开发人员可以通过更改表的属性来更改 Impala 与给定 Kudu 表相关的元数据.这些属性包括表名, Kudu 主地址列表,以及表是否由 Impala (内部)或外部管理. Rename an Im ...

  2. UOJ#30/Codeforces 487E Tourists 点双连通分量,Tarjan,圆方树,树链剖分,线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ30.html 题目传送门 - UOJ#30 题意 uoj写的很简洁.清晰,这里就不抄一遍了. 题解 首先建 ...

  3. UOJ#310 【UNR #2】黎明前的巧克力 FWT 多项式

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ310.html 题目传送门 - UOJ#310 题意 给定 $n$ 个数 ,请你选出两个不相交的集合(两个 ...

  4. Oozie

    Oozie的功能模块 workflow 由多个工作单元组成 工作单元之间有依赖关系 MR1->MR2->MR3->result hadoop jar:提交1个MR oozie:监控当 ...

  5. 记Ubuntu Mongodb 和 Mysql的安装与使用

    安装mongodb 参考链接 https://www.cnblogs.com/shileima/p/7823434.html https://blog.csdn.net/xlengji/article ...

  6. maven聚合工程无法install

    对于maven聚合工程,有时候执行maven命令进行mvn clean install时会出一些莫名奇妙的错误: 一直报告找不到符号,仔细看了项目源代码也不知道是什么原因.首先确保项目所在路径为英文路 ...

  7. Team Queue POJ - 2259 (队列)

    Queues and Priority Queues are data structures which are known to most computer scientists. The Team ...

  8. HDU 5178 pairs【二分】||【尺取】

    <题目链接> 题目大意: 给定一个整数序列,求出绝对值小于等于k的有序对个数. 解题分析: $O(nlong(n))$的二分很好写,这里就不解释了.本题尺取$O(n)$也能做,并且效率很不 ...

  9. HDU 2289 Cup【二分】

    <题目链接> 题目大意: 一个圆台型的杯子,它的上底半径和下底半径已经给出,并且给出它的高度,问你,体积为V的水倒入这个杯子中,高度为多少. 解题分析: 就是简单的二分答案,二分枚举杯中水 ...

  10. lvs负载均衡概述