-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMySQLConnectionManager.cs
75 lines (64 loc) · 2.75 KB
/
MySQLConnectionManager.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MySQLLoadBalancer
{
public static class MySQLConnectionManager
{
private const string _server = "server";
private static Dictionary<string, DbLoadBalancer> _dbLoadBalancers = new Dictionary<string, DbLoadBalancer>();
static MySQLConnectionManager()
{
foreach (ConnectionStringSettings multiHostConnectionString in ConfigurationManager.ConnectionStrings)
{
DbConnectionStringBuilder dbConnectionStringBuilder = new DbConnectionStringBuilder();
var singleHostConnectionStrings = SplitMultiHostConnectionString(multiHostConnectionString.ConnectionString);
if (singleHostConnectionStrings.Count > 0)
{
_dbLoadBalancers.Add(multiHostConnectionString.Name, new DbLoadBalancer(singleHostConnectionStrings));
}
}
}
public static DbConnection GetLoadBalancedConnection(string connectionStringName)
{
if (_dbLoadBalancers.TryGetValue(connectionStringName, out DbLoadBalancer dbLoadBalancer))
{
return dbLoadBalancer.GetConnection();
}
throw new Exception($"Could not find any connection string with name = {connectionStringName}");
}
private static List<string> SplitMultiHostConnectionString(string connectionString)
{
List<string> singleHostConnectionString = new List<string>();
DbConnectionStringBuilder dbConnectionStringBuilder = null;
try
{
dbConnectionStringBuilder = new DbConnectionStringBuilder()
{
ConnectionString = connectionString
};
}
catch
{
return singleHostConnectionString;
}
if (dbConnectionStringBuilder.ContainsKey(_server))
{
string allServers = dbConnectionStringBuilder[_server] as string;
string[] allServersArray = allServers.Split(',');
foreach (string server in allServersArray)
{
DbConnectionStringBuilder builder = new DbConnectionStringBuilder
{
ConnectionString = dbConnectionStringBuilder.ConnectionString
};
builder[_server] = server.Trim();
singleHostConnectionString.Add(builder.ConnectionString);
}
}
return singleHostConnectionString;
}
}
}