@@ -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 "> "myAppName"</ 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 "Master" database</ span >
207+ < span class ="o "> .</ span > < span class ="na "> usingMaster </ span > < span class ="o "> ()</ span > < span class ="c1 "> // Use the "Master/Writer " database</ span >
162208 < span class ="o "> .</ span > < span class ="na "> findList</ span > < span class ="o "> ();</ span >
163209</ pre > </ div >
164210</ div >
0 commit comments