@@ -14,22 +14,23 @@ namespace PlatformBenchmarks
14
14
public sealed class RawDb
15
15
{
16
16
private readonly ConcurrentRandom _random ;
17
- private readonly string _connectionString ;
18
17
private readonly MemoryCache _cache = new (
19
18
new MemoryCacheOptions
20
19
{
21
20
ExpirationScanFrequency = TimeSpan . FromMinutes ( 60 )
22
21
} ) ;
23
22
23
+ private readonly NpgsqlDataSource _dataSource ;
24
+
24
25
public RawDb ( ConcurrentRandom random , AppSettings appSettings )
25
26
{
26
27
_random = random ;
27
- _connectionString = appSettings . ConnectionString ;
28
+ _dataSource = NpgsqlDataSource . Create ( appSettings . ConnectionString ) ;
28
29
}
29
30
30
31
public async Task < World > LoadSingleQueryRow ( )
31
32
{
32
- using var db = new NpgsqlConnection ( _connectionString ) ;
33
+ using var db = _dataSource . CreateConnection ( ) ;
33
34
await db . OpenAsync ( ) ;
34
35
35
36
var ( cmd , _) = CreateReadCommand ( db ) ;
@@ -39,20 +40,37 @@ public async Task<World> LoadSingleQueryRow()
39
40
40
41
public async Task < World [ ] > LoadMultipleQueriesRows ( int count )
41
42
{
42
- var result = new World [ count ] ;
43
+ var results = new World [ count ] ;
43
44
44
- using var db = new NpgsqlConnection ( _connectionString ) ;
45
- await db . OpenAsync ( ) ;
45
+ using var connection = await _dataSource . OpenConnectionAsync ( ) ;
46
46
47
- var ( cmd , idParameter ) = CreateReadCommand ( db ) ;
48
- using var command = cmd ;
49
- for ( int i = 0 ; i < result . Length ; i ++ )
47
+ using var batch = new NpgsqlBatch ( connection )
48
+ {
49
+ // Inserts a PG Sync message between each statement in the batch, required for compliance with
50
+ // TechEmpower general test requirement 7
51
+ // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview
52
+ EnableErrorBarriers = true
53
+ } ;
54
+
55
+ for ( var i = 0 ; i < count ; i ++ )
50
56
{
51
- result [ i ] = await ReadSingleRow ( cmd ) ;
52
- idParameter . TypedValue = _random . Next ( 1 , 10001 ) ;
57
+ batch . BatchCommands . Add ( new ( )
58
+ {
59
+ CommandText = "SELECT id, randomnumber FROM world WHERE id = $1" ,
60
+ Parameters = { new NpgsqlParameter < int > { TypedValue = _random . Next ( 1 , 10001 ) } }
61
+ } ) ;
53
62
}
54
63
55
- return result ;
64
+ using var reader = await batch . ExecuteReaderAsync ( ) ;
65
+
66
+ for ( var i = 0 ; i < count ; i ++ )
67
+ {
68
+ await reader . ReadAsync ( ) ;
69
+ results [ i ] = new World { Id = reader . GetInt32 ( 0 ) , RandomNumber = reader . GetInt32 ( 1 ) } ;
70
+ await reader . NextResultAsync ( ) ;
71
+ }
72
+
73
+ return results ;
56
74
}
57
75
58
76
public Task < CachedWorld [ ] > LoadCachedQueries ( int count )
@@ -79,7 +97,7 @@ public Task<CachedWorld[]> LoadCachedQueries(int count)
79
97
80
98
static async Task < CachedWorld [ ] > LoadUncachedQueries ( int id , int i , int count , RawDb rawdb , CachedWorld [ ] result )
81
99
{
82
- using var db = new NpgsqlConnection ( rawdb . _connectionString ) ;
100
+ using var db = rawdb . _dataSource . CreateConnection ( ) ;
83
101
await db . OpenAsync ( ) ;
84
102
85
103
var ( cmd , idParameter ) = rawdb . CreateReadCommand ( db ) ;
@@ -109,7 +127,7 @@ static async Task<CachedWorld[]> LoadUncachedQueries(int id, int i, int count, R
109
127
110
128
public async Task PopulateCache ( )
111
129
{
112
- using var db = new NpgsqlConnection ( _connectionString ) ;
130
+ using var db = _dataSource . CreateConnection ( ) ;
113
131
await db . OpenAsync ( ) ;
114
132
115
133
var ( cmd , idParameter ) = CreateReadCommand ( db ) ;
@@ -129,30 +147,43 @@ public async Task<World[]> LoadMultipleUpdatesRows(int count)
129
147
{
130
148
var results = new World [ count ] ;
131
149
132
- using var db = new NpgsqlConnection ( _connectionString ) ;
133
- await db . OpenAsync ( ) ;
150
+ using var connection = _dataSource . CreateConnection ( ) ;
151
+ await connection . OpenAsync ( ) ;
134
152
135
- var ( queryCmd , queryParameter ) = CreateReadCommand ( db ) ;
136
- using ( queryCmd )
153
+ using ( var batch = new NpgsqlBatch ( connection ) )
137
154
{
138
- for ( int i = 0 ; i < results . Length ; i ++ )
155
+ // Inserts a PG Sync message between each statement in the batch, required for compliance with
156
+ // TechEmpower general test requirement 7
157
+ // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview
158
+ batch . EnableErrorBarriers = true ;
159
+
160
+ for ( var i = 0 ; i < count ; i ++ )
139
161
{
140
- results [ i ] = await ReadSingleRow ( queryCmd ) ;
141
- queryParameter . TypedValue = _random . Next ( 1 , 10001 ) ;
162
+ batch . BatchCommands . Add ( new ( )
163
+ {
164
+ CommandText = "SELECT id, randomnumber FROM world WHERE id = $1" ,
165
+ Parameters = { new NpgsqlParameter < int > { TypedValue = _random . Next ( 1 , 10001 ) } }
166
+ } ) ;
167
+ }
168
+
169
+ using var reader = await batch . ExecuteReaderAsync ( ) ;
170
+
171
+ for ( var i = 0 ; i < count ; i ++ )
172
+ {
173
+ await reader . ReadAsync ( ) ;
174
+ results [ i ] = new World { Id = reader . GetInt32 ( 0 ) , RandomNumber = reader . GetInt32 ( 1 ) } ;
175
+ await reader . NextResultAsync ( ) ;
142
176
}
143
177
}
144
178
145
- using ( var updateCmd = new NpgsqlCommand ( BatchUpdateString . Query ( count ) , db ) )
179
+ using ( var updateCmd = new NpgsqlCommand ( BatchUpdateString . Query ( count ) , connection ) )
146
180
{
147
- var ids = BatchUpdateString . Ids ;
148
- var randoms = BatchUpdateString . Randoms ;
149
-
150
181
for ( int i = 0 ; i < results . Length ; i ++ )
151
182
{
152
183
var randomNumber = _random . Next ( 1 , 10001 ) ;
153
184
154
- updateCmd . Parameters . Add ( new NpgsqlParameter < int > ( parameterName : ids [ i ] , value : results [ i ] . Id ) ) ;
155
- updateCmd . Parameters . Add ( new NpgsqlParameter < int > ( parameterName : randoms [ i ] , value : randomNumber ) ) ;
185
+ updateCmd . Parameters . Add ( new NpgsqlParameter < int > { TypedValue = results [ i ] . Id } ) ;
186
+ updateCmd . Parameters . Add ( new NpgsqlParameter < int > { TypedValue = randomNumber } ) ;
156
187
157
188
results [ i ] . RandomNumber = randomNumber ;
158
189
}
@@ -167,7 +198,7 @@ public async Task<List<Fortune>> LoadFortunesRows()
167
198
{
168
199
var result = new List < Fortune > ( ) ;
169
200
170
- using ( var db = new NpgsqlConnection ( _connectionString ) )
201
+ using ( var db = _dataSource . CreateConnection ( ) )
171
202
{
172
203
await db . OpenAsync ( ) ;
173
204
0 commit comments