Skip to content

Commit ad26c2b

Browse files
fix: sqlite setup logic refactoring
1 parent 8630e71 commit ad26c2b

23 files changed

Lines changed: 221 additions & 265 deletions

.env

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
SOURCE_WASM_FILE_UBUNTU="WasmRunner/obj/release/net8.0/wasi-wasm/wasm/for-publish/WasmRunner.wasm"
22
SOURCE_WASM_FILE="WasmRunner/bin/Release/net8.0/wasi-wasm/AppBundle/WasmRunner.wasm"
33

4-
SQLITE_CONNECTION_STRING="Data Source=tests.db;Mode=ReadWriteCreate"
4+
SQLITE_CONNECTION_STRING="Data Source=tests.db;Mode=ReadWrite"
55
MYSQL_CONNECTION_STRING="server=localhost;database=tests;user=root;AllowLoadLocalInfile=true;ConvertZeroDateTime=True"
66
POSTGRES_CONNECTION_STRING="host=localhost;database=tests;username=postgres;password=pass;IncludeErrorDetail=true"
77

8-
SQLITE_BENCHMARK_CONNECTION_STRING="Data Source=sales.db;Mode=ReadWriteCreate"
8+
SQLITE_BENCHMARK_CONNECTION_STRING="Data Source=benchmark.db;Mode=ReadWrite"
99
MYSQL_BENCHMARK_CONNECTION_STRING="server=localhost;database=sales;user=root;AllowLoadLocalInfile=true;ConvertZeroDateTime=True"
1010
POSTGRES_BENCHMARK_CONNECTION_STRING="host=localhost;database=tests;username=postgres;password=pass;IncludeErrorDetail=true"
1111

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,5 @@ output/*
138138
docker-upload/*
139139

140140
plugin.wasm
141-
sales.db
141+
.sqlite/*
142+
.env.bak

benchmark/BenchmarkRunner/BenchmarkRunner.csproj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11+
<ProjectReference Include="..\..\end2end\EndToEndCommon\EndToEndCommon.csproj" />
1112
<ProjectReference Include="..\PostgresqlSqlcImpl\PostgresqlSqlcImpl.csproj" />
1213
<ProjectReference Include="..\PostgresqlEFCoreImpl\PostgresqlEFCoreImpl.csproj" />
1314
<ProjectReference Include="..\SqliteSqlcImpl\SqliteSqlcImpl.csproj" />
@@ -21,15 +22,15 @@
2122
<PackageReference Include="Npgsql" Version="8.0.6" />
2223
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0" />
2324
<PackageReference Include="MySqlConnector" Version="2.4.0" />
24-
<PackageReference Include="dotenv.net" Version="3.1.3" />
25+
<PackageReference Include="dotenv.net" Version="3.2.1" />
2526
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
2627
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
2728
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.2" />
2829
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
2930
</ItemGroup>
3031

3132
<ItemGroup>
32-
<Content Include="..\..\examples\config\sqlite\benchmark\schema.sql">
33+
<Content Include="..\..\examples\config\sqlite\benchmark\schema.sql" TargetPath="sqlite.schema.sql">
3334
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
3435
</Content>
3536
<Content Include="..\..\.env">

benchmark/BenchmarkRunner/Benchmarks/MysqlReadBenchmark.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ public static Func<Task> GetSeedMethod()
7070
{
7171
return async () =>
7272
{
73-
await MysqlDatabaseHelper.CleanupDatabaseAsync(_connectionString);
7473
var seeder = new MysqlDatabaseSeeder(_connectionString);
7574
await seeder.SeedAsync(
7675
customerCount: 500, // selectivity: 1/500 of the table returned

benchmark/BenchmarkRunner/Benchmarks/MysqlWriteBenchmark.cs

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,27 +27,6 @@ public class MysqlWriteBenchmark : BaseWriteBenchmark
2727
[Params(200, 1000, 5000)]
2828
public int BatchSize { get; set; }
2929

30-
[GlobalSetup]
31-
public async Task GlobalSetup()
32-
{
33-
var orderIds = await _sqlcImpl.GetOrderIdsAsync(new QuerySql.GetOrderIdsArgs(Limit: 1000));
34-
var productIds = await _sqlcImpl.GetProductIdsAsync(new QuerySql.GetProductIdsArgs(Limit: 1000));
35-
36-
_testOrderItems = [.. Enumerable.Range(0, TotalRecords).Select(i => new QuerySql.AddOrderItemsArgs(
37-
OrderId: orderIds[i % orderIds.Count].OrderId,
38-
ProductId: productIds[i % productIds.Count].ProductId,
39-
Quantity: Random.Shared.Next(1, 10),
40-
UnitPrice: (decimal)(Random.Shared.NextDouble() * 100 + 5)
41-
))];
42-
}
43-
44-
[IterationSetup]
45-
public static void IterationSetup()
46-
{
47-
MysqlDatabaseHelper.CleanupWriteTableAsync(_connectionString).GetAwaiter().GetResult();
48-
Helpers.InvokeGarbageCollection();
49-
}
50-
5130
[BenchmarkCategory("Write")]
5231
[Benchmark(Baseline = true, Description = "SQLC - AddOrderItems")]
5332
public override async Task Sqlc_AddOrderItems()
@@ -69,7 +48,6 @@ public static Func<Task> GetSeedMethod()
6948
{
7049
return async () =>
7150
{
72-
await MysqlDatabaseHelper.CleanupDatabaseAsync(_connectionString);
7351
var seeder = new MysqlDatabaseSeeder(_connectionString);
7452
await seeder.SeedAsync(
7553
customerCount: 10,
@@ -79,4 +57,25 @@ await seeder.SeedAsync(
7957
);
8058
};
8159
}
60+
61+
[GlobalSetup]
62+
public async Task GlobalSetup()
63+
{
64+
var orderIds = await _sqlcImpl.GetOrderIdsAsync(new QuerySql.GetOrderIdsArgs(Limit: 1000));
65+
var productIds = await _sqlcImpl.GetProductIdsAsync(new QuerySql.GetProductIdsArgs(Limit: 1000));
66+
67+
_testOrderItems = [.. Enumerable.Range(0, TotalRecords).Select(i => new QuerySql.AddOrderItemsArgs(
68+
OrderId: orderIds[i % orderIds.Count].OrderId,
69+
ProductId: productIds[i % productIds.Count].ProductId,
70+
Quantity: Random.Shared.Next(1, 10),
71+
UnitPrice: (decimal)(Random.Shared.NextDouble() * 100 + 5)
72+
))];
73+
}
74+
75+
[IterationSetup]
76+
public static void IterationSetup()
77+
{
78+
MysqlDatabaseHelper.CleanupWriteTableAsync(_connectionString).GetAwaiter().GetResult();
79+
Helpers.InvokeGarbageCollection();
80+
}
8281
}

benchmark/BenchmarkRunner/Benchmarks/PostgresqlReadBenchmark.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ public static Func<Task> GetSeedMethod()
7070
{
7171
return async () =>
7272
{
73-
await PostgresqlDatabaseHelper.CleanupDatabaseAsync(_connectionString);
7473
var seeder = new PostgresqlDatabaseSeeder(_connectionString);
7574
await seeder.SeedAsync(
7675
customerCount: 500, // with customer_id filter, this is 1/500 of the table returned

benchmark/BenchmarkRunner/Benchmarks/PostgresqlWriteBenchmark.cs

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,27 +25,6 @@ public class PostgresqlWriteBenchmark : BaseWriteBenchmark
2525
[Params(200, 500, 1000)]
2626
public int BatchSize { get; set; }
2727

28-
[GlobalSetup]
29-
public async Task GlobalSetup()
30-
{
31-
var orderIds = await _sqlcImpl.GetOrderIdsAsync(new QuerySql.GetOrderIdsArgs(Limit: 1000));
32-
var productIds = await _sqlcImpl.GetProductIdsAsync(new QuerySql.GetProductIdsArgs(Limit: 1000));
33-
34-
_testOrderItems = [.. Enumerable.Range(0, TotalRecords).Select(i => new QuerySql.AddOrderItemsArgs(
35-
OrderId: orderIds[i % orderIds.Count].OrderId,
36-
ProductId: productIds[i % productIds.Count].ProductId,
37-
Quantity: Random.Shared.Next(1, 10),
38-
UnitPrice: (decimal)(Random.Shared.NextDouble() * 100 + 5)
39-
))];
40-
}
41-
42-
[IterationSetup]
43-
public static void IterationSetup()
44-
{
45-
PostgresqlDatabaseHelper.CleanupWriteTableAsync(_connectionString).GetAwaiter().GetResult();
46-
Helpers.InvokeGarbageCollection();
47-
}
48-
4928
[BenchmarkCategory("Write")]
5029
[Benchmark(Baseline = true, Description = "SQLC - AddOrderItems")]
5130
public override async Task Sqlc_AddOrderItems()
@@ -67,7 +46,6 @@ public static Func<Task> GetSeedMethod()
6746
{
6847
return async () =>
6948
{
70-
PostgresqlDatabaseHelper.CleanupDatabaseAsync(_connectionString).GetAwaiter().GetResult();
7149
var seeder = new PostgresqlDatabaseSeeder(_connectionString);
7250
await seeder.SeedAsync(
7351
customerCount: 10,
@@ -77,4 +55,25 @@ await seeder.SeedAsync(
7755
);
7856
};
7957
}
58+
59+
[GlobalSetup]
60+
public async Task GlobalSetup()
61+
{
62+
var orderIds = await _sqlcImpl.GetOrderIdsAsync(new QuerySql.GetOrderIdsArgs(Limit: 1000));
63+
var productIds = await _sqlcImpl.GetProductIdsAsync(new QuerySql.GetProductIdsArgs(Limit: 1000));
64+
65+
_testOrderItems = [.. Enumerable.Range(0, TotalRecords).Select(i => new QuerySql.AddOrderItemsArgs(
66+
OrderId: orderIds[i % orderIds.Count].OrderId,
67+
ProductId: productIds[i % productIds.Count].ProductId,
68+
Quantity: Random.Shared.Next(1, 10),
69+
UnitPrice: (decimal)(Random.Shared.NextDouble() * 100 + 5)
70+
))];
71+
}
72+
73+
[IterationSetup]
74+
public static void IterationSetup()
75+
{
76+
PostgresqlDatabaseHelper.CleanupWriteTableAsync(_connectionString).GetAwaiter().GetResult();
77+
Helpers.InvokeGarbageCollection();
78+
}
8079
}

benchmark/BenchmarkRunner/Benchmarks/SqliteReadBenchmark.cs

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using BenchmarkDotNet.Configs;
33
using BenchmarkDotNet.Jobs;
44
using BenchmarkRunner.Utils;
5+
using EndToEndTests;
6+
using Microsoft.Data.Sqlite;
57
using SqliteEFCoreImpl;
68
using SqliteSqlcImpl;
79

@@ -43,13 +45,20 @@ public override async Task EFCore_NoTracking_GetCustomerOrders()
4345
{
4446
await ExecuteConcurrentlyAsync(QueriesToRun, ConcurrentQueries, async _ =>
4547
{
46-
await using var dbContext = new SalesDbContext(_connectionString);
47-
var queries = new Queries(dbContext, useTracking: false);
48-
return await queries.GetCustomerOrders(new Queries.GetCustomerOrdersArgs(
49-
CustomerId: Random.Shared.Next(1, CustomerCount),
50-
Offset: 0,
51-
Limit: Limit
52-
));
48+
try
49+
{
50+
await using var dbContext = new SalesDbContext(_connectionString);
51+
var queries = new Queries(dbContext, useTracking: false);
52+
return await queries.GetCustomerOrders(new Queries.GetCustomerOrdersArgs(
53+
CustomerId: Random.Shared.Next(1, CustomerCount),
54+
Offset: 0,
55+
Limit: Limit
56+
));
57+
}
58+
catch (SqliteException e)
59+
{
60+
throw new Exception($"Sqlite connection string: {_connectionString}, error: {e.Message}", e);
61+
}
5362
});
5463
}
5564

@@ -59,22 +68,28 @@ public override async Task EFCore_WithTracking_GetCustomerOrders()
5968
{
6069
await ExecuteConcurrentlyAsync(QueriesToRun, ConcurrentQueries, async _ =>
6170
{
62-
await using var dbContext = new SalesDbContext(_connectionString);
63-
var queries = new Queries(dbContext, useTracking: true);
64-
return await queries.GetCustomerOrders(new Queries.GetCustomerOrdersArgs(
65-
CustomerId: Random.Shared.Next(1, CustomerCount),
66-
Offset: 0,
67-
Limit: Limit
68-
));
71+
try
72+
{
73+
await using var dbContext = new SalesDbContext(_connectionString);
74+
var queries = new Queries(dbContext, useTracking: true);
75+
return await queries.GetCustomerOrders(new Queries.GetCustomerOrdersArgs(
76+
CustomerId: Random.Shared.Next(1, CustomerCount),
77+
Offset: 0,
78+
Limit: Limit
79+
));
80+
}
81+
catch (SqliteException e)
82+
{
83+
throw new Exception($"Sqlite connection string: {_connectionString}, error: {e.Message}", e);
84+
}
6985
});
7086
}
7187

7288
public static Func<Task> GetSeedMethod()
7389
{
7490
return async () =>
7591
{
76-
SqliteDatabaseHelper.CleanupDatabase(_connectionString);
77-
await SqliteDatabaseHelper.InitializeDatabaseAsync(_connectionString);
92+
EndToEndCommon.SetupBenchmarkSqliteDb();
7893
var seeder = new SqliteDatabaseSeeder(_connectionString);
7994
await seeder.SeedAsync(
8095
customerCount: 500, // with customer_id filter, this is 1/500 of the table returned

benchmark/BenchmarkRunner/Benchmarks/SqliteWriteBenchmark.cs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using BenchmarkDotNet.Configs;
33
using BenchmarkDotNet.Jobs;
44
using BenchmarkRunner.Utils;
5+
using EndToEndTests;
56
using SqliteEFCoreImpl;
67
using SqliteSqlcImpl;
78

@@ -27,27 +28,6 @@ public class SqliteWriteBenchmark : BaseWriteBenchmark
2728
[Params(50, 100, 200)]
2829
public int BatchSize { get; set; }
2930

30-
[GlobalSetup]
31-
public async Task GlobalSetup()
32-
{
33-
var orderIds = await _sqlcImpl.GetOrderIdsAsync(new QuerySql.GetOrderIdsArgs(Limit: 1000));
34-
var productIds = await _sqlcImpl.GetProductIdsAsync(new QuerySql.GetProductIdsArgs(Limit: 1000));
35-
36-
_testOrderItems = [.. Enumerable.Range(0, TotalRecords).Select(i => new QuerySql.AddOrderItemsArgs(
37-
OrderId: orderIds[i % orderIds.Count].OrderId,
38-
ProductId: productIds[i % productIds.Count].ProductId,
39-
Quantity: Random.Shared.Next(1, 10),
40-
UnitPrice: (decimal)(Random.Shared.NextDouble() * 100 + 5)
41-
))];
42-
}
43-
44-
[IterationSetup]
45-
public static void IterationSetup()
46-
{
47-
SqliteDatabaseHelper.CleanupWriteTableAsync(_connectionString).GetAwaiter().GetResult();
48-
Helpers.InvokeGarbageCollection();
49-
}
50-
5131
[BenchmarkCategory("Write")]
5232
[Benchmark(Baseline = true, Description = "SQLC - AddOrderItems")]
5333
public override async Task Sqlc_AddOrderItems()
@@ -69,8 +49,7 @@ public static Func<Task> GetSeedMethod()
6949
{
7050
return async () =>
7151
{
72-
SqliteDatabaseHelper.CleanupDatabase(_connectionString);
73-
await SqliteDatabaseHelper.InitializeDatabaseAsync(_connectionString);
52+
EndToEndCommon.SetupBenchmarkSqliteDb();
7453
var seeder = new SqliteDatabaseSeeder(_connectionString);
7554
await seeder.SeedAsync(
7655
customerCount: 10,
@@ -80,4 +59,25 @@ await seeder.SeedAsync(
8059
);
8160
};
8261
}
62+
63+
[GlobalSetup]
64+
public async Task GlobalSetup()
65+
{
66+
var orderIds = await _sqlcImpl.GetOrderIdsAsync(new QuerySql.GetOrderIdsArgs(Limit: 1000));
67+
var productIds = await _sqlcImpl.GetProductIdsAsync(new QuerySql.GetProductIdsArgs(Limit: 1000));
68+
69+
_testOrderItems = [.. Enumerable.Range(0, TotalRecords).Select(i => new QuerySql.AddOrderItemsArgs(
70+
OrderId: orderIds[i % orderIds.Count].OrderId,
71+
ProductId: productIds[i % productIds.Count].ProductId,
72+
Quantity: Random.Shared.Next(1, 10),
73+
UnitPrice: (decimal)(Random.Shared.NextDouble() * 100 + 5)
74+
))];
75+
}
76+
77+
[IterationSetup]
78+
public void IterationSetup()
79+
{
80+
SqliteDatabaseHelper.CleanupWriteTableAsync(_connectionString).GetAwaiter().GetResult();
81+
Helpers.InvokeGarbageCollection();
82+
}
8383
}

benchmark/BenchmarkRunner/Config.cs

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace BenchmarkRunner;
44

5-
public static class Config
5+
public static partial class Config
66
{
77
static Config()
88
{
@@ -15,38 +15,32 @@ public static string GetPostgresConnectionString()
1515
{
1616
var connectionString = Environment.GetEnvironmentVariable("POSTGRES_BENCHMARK_CONNECTION_STRING");
1717
if (string.IsNullOrWhiteSpace(connectionString))
18-
{
1918
throw new InvalidOperationException(
20-
"POSTGRES_CONNECTION_STRING environment variable is not set. " +
19+
"POSTGRES_BENCHMARK_CONNECTION_STRING environment variable is not set. " +
2120
"Please set it to your PostgreSQL connection string (e.g., " +
2221
"Host=localhost;Port=5432;Database=sales;Username=postgres;Password=postgres)");
23-
}
2422
return connectionString;
2523
}
2624

2725
public static string GetSqliteConnectionString()
2826
{
2927
var connectionString = Environment.GetEnvironmentVariable("SQLITE_BENCHMARK_CONNECTION_STRING");
3028
if (string.IsNullOrWhiteSpace(connectionString))
31-
{
32-
// Default to file-based database with WAL mode for benchmarks
33-
// WAL mode enables better concurrency (readers don't block writers)
34-
// Using shared cache allows multiple connections to access the same database
35-
return "Data Source=benchmark.db;Cache=Shared;Journal Mode=WAL";
36-
}
29+
throw new InvalidOperationException(
30+
"SQLITE_BENCHMARK_CONNECTION_STRING environment variable is not set. " +
31+
"Please set it to your SQLite connection string (e.g., " +
32+
"Data Source=benchmark.db;Mode=ReadWriteCreate)");
3733
return connectionString;
3834
}
3935

4036
public static string GetMysqlConnectionString()
4137
{
4238
var connectionString = Environment.GetEnvironmentVariable("MYSQL_BENCHMARK_CONNECTION_STRING");
4339
if (string.IsNullOrWhiteSpace(connectionString))
44-
{
4540
throw new InvalidOperationException(
46-
"MYSQL_CONNECTION_STRING environment variable is not set. " +
41+
"MYSQL_BENCHMARK_CONNECTION_STRING environment variable is not set. " +
4742
"Please set it to your MySQL connection string (e.g., " +
4843
"Server=localhost;Port=3306;Database=sales;User=root;Password=)");
49-
}
5044
return connectionString;
5145
}
5246
}

0 commit comments

Comments
 (0)