using Microsoft.Data.Sqlite; using Microsoft.Extensions.Configuration; using MySql.Data.MySqlClient; using Npgsql; using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Reflection; using Znyc.Recruitment.Admin.Commons.Encrypt; using Znyc.Recruitment.Admin.Commons.Enums; using Znyc.Recruitment.Admin.Commons.Extensions; namespace Znyc.Recruitment.Admin.Commons.Core.DataManager { /// /// 数据库服务提供者 /// public class DBServerProvider { /// /// 数据库配置名称 /// private static string dbConfigName = ""; /// /// 数据库连接 /// private static IDbConnection dbConnection; #region Dapper Context /// /// 获取默认数据库连接 /// /// public static string GetConnectionString() { return GetConnectionString(dbConfigName); } /// /// /// /// public static string GetConnectionString(string key) { return dbConfigName = key ?? dbConfigName; } /// /// 获取数据库连接 /// /// 是否访问主库,默认为是,否则访问从库即只读数据库 /// public static IDbConnection GetDBConnection(bool masterDb = true) { DbConnectionOptions connectionOptions = GeDbConnectionOptions(masterDb); string defaultSqlConnectionString = connectionOptions.ConnectionString; DatabaseType dbType = connectionOptions.DatabaseType; if (dbType == DatabaseType.SqlServer) { dbConnection = new SqlConnection(defaultSqlConnectionString); } else if (dbType == DatabaseType.MySql) { dbConnection = new MySqlConnection(defaultSqlConnectionString); } else if (dbType == DatabaseType.Oracle) { dbConnection = new OracleConnection(defaultSqlConnectionString); } else if (dbType == DatabaseType.SQLite) { dbConnection = new SqliteConnection(defaultSqlConnectionString); } else if (dbType == DatabaseType.Npgsql) { dbConnection = new NpgsqlConnection(defaultSqlConnectionString); } else { throw new NotSupportedException("The database is not supported"); } return dbConnection; } /// /// 获取数据库连接 /// /// 是否访问主库,默认为是,否则访问从库即只读数据库 /// public static IDbConnection GetDBConnection(bool masterDb = true) { DbConnectionOptions connectionOptions = GeDbConnectionOptions(masterDb); string defaultSqlConnectionString = connectionOptions.ConnectionString; DatabaseType dbType = connectionOptions.DatabaseType; if (dbType == DatabaseType.SqlServer) { dbConnection = new SqlConnection(defaultSqlConnectionString); } else if (dbType == DatabaseType.MySql) { dbConnection = new MySqlConnection(defaultSqlConnectionString); } else if (dbType == DatabaseType.Oracle) { dbConnection = new OracleConnection(defaultSqlConnectionString); } else if (dbType == DatabaseType.SQLite) { dbConnection = new SqliteConnection(defaultSqlConnectionString); } else if (dbType == DatabaseType.Npgsql) { dbConnection = new NpgsqlConnection(defaultSqlConnectionString); } else { throw new NotSupportedException("The database is not supported"); } return dbConnection; } /// /// 获取数据库连接连接配置 /// /// 数据实体 /// 是否访问主库,默认为是,否则访问从库即只读数据库 /// public static DbConnectionOptions GeDbConnectionOptions(bool masterDb = true) { dbConfigName = typeof(TEntity).GetCustomAttribute(false)?.DbConfigName ?? dbConfigName; bool conStringEncrypt = Configs.GetConfigurationValue("AppSetting", "ConStringEncrypt").ToBool(); if (string.IsNullOrEmpty(dbConfigName)) { dbConfigName = Configs.GetConfigurationValue("AppSetting", "DefaultDataBase"); } Dictionary dictRead = Configs.GetSection("DbConnections:" + dbConfigName + ":ReadDb") .Get>(); DbConnectionOptions dbConnectionOptions = new DbConnectionOptions(); bool isDBReadWriteSeparate = Configs.GetConfigurationValue("AppSetting", "IsDBReadWriteSeparate").ToBool(); if (masterDb || !isDBReadWriteSeparate) { dbConnectionOptions.ConnectionString = Configs.GetConfigurationValue("DbConnections:" + dbConfigName + ":MasterDB", "ConnectionString"); dbConnectionOptions.DatabaseType = (DatabaseType)Enum.Parse(typeof(DatabaseType), Configs.GetConfigurationValue("DbConnections:" + dbConfigName + ":MasterDB", "DatabaseType")); } else { dbConnectionOptions = GetReadConn(dictRead); } if (conStringEncrypt) { dbConnectionOptions.ConnectionString = DEncrypt.Decrypt(dbConnectionOptions.ConnectionString); } return dbConnectionOptions; } /// /// 获取数据库连接连接配置 /// /// 是否访问主库,默认为是,否则访问从库即只读数据库 /// public static DbConnectionOptions GeDbConnectionOptions(bool masterDb = true) { bool conStringEncrypt = Configs.GetConfigurationValue("AppSetting", "ConStringEncrypt").ToBool(); if (string.IsNullOrEmpty(dbConfigName)) { dbConfigName = Configs.GetConfigurationValue("AppSetting", "DefaultDataBase"); } Dictionary dictRead = Configs.GetSection("DbConnections:" + dbConfigName + ":ReadDb") .Get>(); DbConnectionOptions dbConnectionOptions = new DbConnectionOptions(); bool isDBReadWriteSeparate = Configs.GetConfigurationValue("AppSetting", "IsDBReadWriteSeparate").ToBool(); if (masterDb || !isDBReadWriteSeparate) { dbConnectionOptions.ConnectionString = Configs.GetConfigurationValue("DbConnections:" + dbConfigName + ":MasterDB", "ConnectionString"); dbConnectionOptions.DatabaseType = (DatabaseType)Enum.Parse(typeof(DatabaseType), Configs.GetConfigurationValue("DbConnections:" + dbConfigName + ":MasterDB", "DatabaseType")); } else { dbConnectionOptions = GetReadConn(dictRead); } if (conStringEncrypt) { dbConnectionOptions.ConnectionString = DEncrypt.Decrypt(dbConnectionOptions.ConnectionString); } return dbConnectionOptions; } /// /// 按从库数据库连接的策略进行返回连接对象,实现从库的负载均衡 /// /// /// private static DbConnectionOptions GetReadConn(Dictionary slaveData) { DbConnectionOptions connectionOptions = new DbConnectionOptions(); string queryDBStrategy = Configs.GetConfigurationValue("AppSetting", "QueryDBStrategy"); if (queryDBStrategy == "Random") //随机策略 { int index = new Random().Next(0, slaveData.Count - 1); connectionOptions = slaveData[index.ToString()]; } else if (queryDBStrategy == "Polling") //轮询策略 { } return connectionOptions; } #endregion Dapper Context } }