IConfiguration vs IOptions NET
Synchronous and Asynchronous in .NET Core
Model Binding and Validation in ASP.NET Core
ControllerBase vs Controller in ASP.NET Core
ConfigureServices and Configure methods
IHostedService interface in .NET Core
ASP.NET Core request processing
| Test-Driven Development (TDD) :👈 | 👉:Scalable API Architecture |
Database Synchronization |
Synchronizing or communicating data between two different databases can be approached in several ways, depending on your requirements for real-time sync, consistency, performance, and technology stack. Here are the main strategies:
| Requirement | Best Approach |
|---|---|
| Real-time sync | CDC or Message Queue |
| Batch sync (nightly, hourly) | ETL |
| Cross-database queries only | Linked Servers |
| High availability / failover | Replication |
| Different DB technologies (SQL ↔ NoSQL) | API-based or CDC with connectors |
💡 Tip: If you’re working in .NET C#, you can use Entity Framework Core with multiple database providers, or libraries like Dapper combined with a message queue (Kafka, RabbitMQ) to orchestrate synchronization logic.
CDC tracks inserts, updates, and deletes.
sqlsvg
-- Enable CDC at database level
EXEC sys.sp_cdc_enable_db;
-- Enable CDC on a specific table
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'Customers',
@role_name = NULL;
This creates CDC system tables that log changes.
Debezium is a connector that streams CDC changes into Kafka topics.
Use a Kafka client library (e.g., Confluent.Kafka) in your .NET app.
using Confluent.Kafka;
using MySql.Data.MySqlClient;
class Program
{
static void Main()
{
var config = new ConsumerConfig
{
BootstrapServers = "localhost:9092",
GroupId = "sync-group",
AutoOffsetReset = AutoOffsetReset.Earliest
};
using var consumer = new ConsumerBuilder<Ignore, string>(config).Build();
consumer.Subscribe("dbo.Customers"); // Kafka topic created by Debezium
while (true)
{
var cr = consumer.Consume();
var changeEvent = cr.Message.Value;
// Parse JSON event (Debezium format)
dynamic evt = Newtonsoft.Json.JsonConvert.DeserializeObject(changeEvent);
string op = evt.op; // c = create, u = update, d = delete
dynamic data = evt.after;
using var conn = new MySqlConnection("server=localhost;user=root;database=test;");
conn.Open();
if (op == "c") // Insert
{
var cmd = new MySqlCommand("INSERT INTO Customers (Id, Name) VALUES (@Id, @Name)", conn);
cmd.Parameters.AddWithValue("@Id", data.Id);
cmd.Parameters.AddWithValue("@Name", data.Name);
cmd.ExecuteNonQuery();
}
else if (op == "u") // Update
{
var cmd = new MySqlCommand("UPDATE Customers SET Name=@Name WHERE Id=@Id", conn);
cmd.Parameters.AddWithValue("@Id", data.Id);
cmd.Parameters.AddWithValue("@Name", data.Name);
cmd.ExecuteNonQuery();
}
else if (op == "d") // Delete
{
var cmd = new MySqlCommand("DELETE FROM Customers WHERE Id=@Id", conn);
cmd.Parameters.AddWithValue("@Id", evt.before.Id);
cmd.ExecuteNonQuery();
}
}
}
}
Customers table is captured by CDC.Use SqlConnection and SqlCommand to pull data.
using System.Data.SqlClient;
string sqlConnStr = "Server=localhost;Database=SourceDB;User Id=sa;Password=yourpassword;";
using var sqlConn = new SqlConnection(sqlConnStr);
sqlConn.Open();
string query = "SELECT Id, Name, Email FROM Customers WHERE LastUpdated > @LastSync";
using var cmd = new SqlCommand(query, sqlConn);
cmd.Parameters.AddWithValue("@LastSync", lastSyncTime);
using var reader = cmd.ExecuteReader();
Apply business rules, mappings, or format conversions in C# before loading.
var customers = new List<Customer>();
while (reader.Read())
{
customers.Add(new Customer
{
Id = reader.GetInt32(0),
Name = reader.GetString(1).Trim(),
Email = reader.GetString(2).ToLower()
});
}
Insert or update into MySQL using MySqlConnection.
using MySql.Data.MySqlClient;
string mysqlConnStr = "Server=localhost;Database=TargetDB;User=root;Password=yourpassword;";
using var mysqlConn = new MySqlConnection(mysqlConnStr);
mysqlConn.Open();
foreach (var cust in customers)
{
var cmd = new MySqlCommand(
"INSERT INTO Customers (Id, Name, Email) VALUES (@Id, @Name, @Email) " +
"ON DUPLICATE KEY UPDATE Name=@Name, Email=@Email", mysqlConn);
cmd.Parameters.AddWithValue("@Id", cust.Id);
cmd.Parameters.AddWithValue("@Name", cust.Name);
cmd.Parameters.AddWithValue("@Email", cust.Email);
cmd.ExecuteNonQuery();
}
✨ With this approach, you can keep two databases in sync without heavy infrastructure. It’s especially useful for reporting, backups, or hybrid systems where one DB is transactional and the other is analytical.
| Test-Driven Development (TDD) :👈 | 👉:Scalable API Architecture |