Skip to content

Commit 040c8d5

Browse files
committed
Update read replicas page
1 parent 0c94e07 commit 040c8d5

File tree

3 files changed

+57
-9
lines changed

3 files changed

+57
-9
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
*.iml
22
.idea
3+
.DS_Store
4+

docs/read-replicas/index.html

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,23 +119,69 @@ <h1 id="breadcrumb">
119119

120120
<h2 id="transactional">Read Replicas</h2>
121121
<p>
122-
Ebean supports configuring a second DataSource [connect pool] that points to
122+
Ebean supports configuring a second DataSource [connection pool] that points to
123123
a "Read replica". The DataSource is <em>readOnly = true</em> and <em>autoCommit=true</em>.
124124
</p>
125-
<div class="syntax java"><div class="highlight"><pre><span></span>
125+
126+
<h2>DataSourceBuilder readOnlyUrl</h2>
127+
<p>
128+
When using DataSourceBuilder we can specify an additional <code>readOnlyUrl</code> which
129+
can point to a read replica (e.g. AWS Aurora reader endpoint).
130+
</p>
131+
<p>
132+
Ebean DataSourceBuilder can support configuration for both a "Master/Writer" DataSource and a
133+
"Read Only" DataSource where the difference between these is the connection url. This is
134+
the case for AWS Aurora where there are 2 endpoints available (Writer and Reader endpoints).
135+
</p>
136+
<div class="syntax java"><div class="highlight"><pre><span></span><span class="k">var</span> <span class="n">dataSourceBuilder</span> <span class="o">=</span>
137+
<span class="n">DataSourceBuilder</span><span class="o">.</span><span class="na">create</span><span class="o">()</span>
138+
<span class="o">.</span><span class="na">username</span><span class="o">(...)</span>
139+
<span class="o">.</span><span class="na">password</span><span class="o">(...)</span>
140+
<span class="o">.</span><span class="na">url</span><span class="o">(</span><span class="n">configuration</span><span class="o">.</span><span class="na">getJdbcUrl</span><span class="o">())</span> <span class="c1">// Writer Endpoint</span>
141+
<span class="o">.</span><span class="na">readOnlyUrl</span><span class="o">(</span><span class="n">configuration</span><span class="o">.</span><span class="na">getReadOnlyJdbcUrl</span><span class="o">())</span> <span class="c1">// Reader Endpoint</span>
142+
<span class="o">.</span><span class="na">applicationName</span><span class="o">(</span><span class="s">&quot;myAppName&quot;</span><span class="o">);</span>
126143
</pre></div>
127144
</div>
128145

129-
<h2 id="aurora">Amazon AWS Aurora</h2>
146+
<h2>DatabaseBuilder readOnlyDataSource</h2>
130147
<p>
131-
Amazon AWS Aurora provides 2 connection endpoints with one endpoint for the "Master" [writer] and
132-
a second endpoint for the "Read replica" [read only] instance(s).
148+
If we are not using DataSourceBuilder, we can instead specify a "Read Only" DataSource
149+
to use. We can create a DataSource (using say Hikari) and specify it as the <em>readOnlyDataSource</em>.
133150
</p>
134-
<div class="syntax java"><div class="highlight"><pre><span></span>
151+
<div class="syntax java"><div class="highlight"><pre><span></span><span class="n">DataSource</span> <span class="n">writerDataSource</span> <span class="o">=</span> <span class="o">...;</span>
152+
<span class="c1">// should be readOnly=true autoCommit=true</span>
153+
<span class="n">DataSource</span> <span class="n">readOnlyDataSource</span> <span class="o">=</span> <span class="o">...;</span>
154+
155+
<span class="n">Database</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
156+
<span class="o">...</span>
157+
<span class="o">.</span><span class="na">dataSource</span><span class="o">(</span><span class="n">writerDataSource</span><span class="o">)</span> <span class="c1">// Writer Endpoint</span>
158+
<span class="o">.</span><span class="na">readOnlyDataSource</span><span class="o">(</span><span class="n">readOnlyDataSource</span><span class="o">)</span> <span class="c1">// Reader Endpoint</span>
159+
<span class="o">.</span><span class="na">build</span><span class="o">()</span>
135160
</pre></div>
136161
</div>
137162

138163

164+
<h2 id="aurora">Amazon AWS Aurora</h2>
165+
<p>
166+
Amazon AWS Aurora provides 2 connection endpoints, a <em>Writer</em> and
167+
a <em>Reader</em>
168+
</p>
169+
<p>
170+
The Writer (also known as "Master") endpoint is used for making changes to the
171+
database (DML and DDL). The Reader endpoint points to "Read Replica" instances
172+
that only support reading data.
173+
</p>
174+
<ul>
175+
<li><b>Writer</b>: Use the writer endpoint for <b><code>url</code></b></li>
176+
<li><b>Reader</b>: Use the reader endpoint for <b><code>readOnlyUrl</code></b></li>
177+
</ul>
178+
<img alt="AWS Aurora Endpoints" src="/images/aws-aurora-endpoints.png" class="img-responsive" style="max-width: 700px">
179+
180+
<p>
181+
182+
</p>
183+
184+
139185
<h2 id="usingMaster">Using the "Master"</h2>
140186
<p>
141187
When we have an explicit transaction via <em>@Transactional</em> on a method or using
@@ -147,18 +193,18 @@ <h2 id="usingMaster">Using the "Master"</h2>
147193
used implicitly and this will use the "Master".
148194
</p>
149195

150-
<h2 id="queryUseMaster">Query.useMaster()</h2>
196+
<h2 id="queryUseMaster">Query.usingMaster()</h2>
151197
<p>
152198
If we have a query that is executed outside any explicit transaction, and it will fetch data
153199
(not a bulk update query or bulk delete query) then by default it will use the "Read Replica".
154200
</p>
155201
<p>
156-
To force a query to use the "Master" we use <code>Query.useMaster()</code> like:
202+
To force a query to use the "Master/Writer" we use <code>Query.usingMaster()</code> like:
157203
</p>
158204
<div class="syntax java"><div class="highlight"><pre><span></span><span class="k">var</span> <span class="n">customers</span> <span class="o">=</span>
159205
<span class="k">new</span> <span class="n">QCustomer</span><span class="o">()</span>
160206
<span class="o">.</span><span class="na field">status</span><span class="o">.</span><span class="na">eq</span><span class="o">(</span><span class="n">Status</span><span class="o">.</span><span class="na">NEW</span><span class="o">)</span>
161-
<span class="o">.</span><span class="na">useMaster</span><span class="o">()</span> <span class="c1">// Use the &quot;Master&quot; database</span>
207+
<span class="o">.</span><span class="na">usingMaster</span><span class="o">()</span> <span class="c1">// Use the &quot;Master/Writer&quot; database</span>
162208
<span class="o">.</span><span class="na">findList</span><span class="o">();</span>
163209
</pre></div>
164210
</div>

images/aws-aurora-endpoints.png

84.6 KB
Loading

0 commit comments

Comments
 (0)