1616
1717package com .example .spanner ;
1818
19- // [START transaction_import]
2019import static com .google .cloud .spanner .TransactionRunner .TransactionCallable ;
21- // [END transaction_import]
2220
2321import com .google .cloud .spanner .Database ;
2422import com .google .cloud .spanner .DatabaseAdminClient ;
2523import com .google .cloud .spanner .DatabaseClient ;
2624import com .google .cloud .spanner .DatabaseId ;
27- // [START transaction_import]
2825import com .google .cloud .spanner .Key ;
29- // [END transaction_import]
30- // [START read_import]
3126import com .google .cloud .spanner .KeySet ;
32- // [END read_import]
33- // [START write_import]
3427import com .google .cloud .spanner .Mutation ;
35- // [END write_import]
3628import com .google .cloud .spanner .Operation ;
37- // [START read_only_transaction_import]
3829import com .google .cloud .spanner .ReadOnlyTransaction ;
39- // [END read_only_transaction_import]
40- // [START query_import]
4130import com .google .cloud .spanner .ResultSet ;
42- // [END query_import]
4331import com .google .cloud .spanner .Spanner ;
4432import com .google .cloud .spanner .SpannerOptions ;
45- // [START query_import]
4633import com .google .cloud .spanner .Statement ;
47- // [END query_import]
48- // [START transaction_import]
4934import com .google .cloud .spanner .Struct ;
35+ import com .google .cloud .spanner .TimestampBound ;
5036import com .google .cloud .spanner .TransactionContext ;
51- // [END transaction_import]
5237import com .google .spanner .admin .database .v1 .CreateDatabaseMetadata ;
53-
54- // [START write_import]
55-
5638import java .util .ArrayList ;
57- // [END write_import]
5839import java .util .Arrays ;
5940import java .util .List ;
41+ import java .util .concurrent .TimeUnit ;
6042
6143/**
6244 * Example code for using the Cloud Spanner API. This example demonstrates all the common
6749 * <li> Writing data using a read-write transaction.
6850 * <li> Using an index to read and execute SQL queries over data.
6951 * </ul>
70- *
7152 */
7253public class SpannerSample {
73- /** Class to contain singer sample data. */
54+
55+ /**
56+ * Class to contain singer sample data.
57+ */
7458 static class Singer {
59+
7560 final long singerId ;
7661 final String firstName ;
7762 final String lastName ;
@@ -83,8 +68,11 @@ static class Singer {
8368 }
8469 }
8570
86- /** Class to contain album sample data. */
71+ /**
72+ * Class to contain album sample data.
73+ */
8774 static class Album {
75+
8876 final long singerId ;
8977 final long albumId ;
9078 final String albumTitle ;
@@ -116,22 +104,22 @@ static class Album {
116104
117105 static void createDatabase (DatabaseAdminClient dbAdminClient , DatabaseId id ) {
118106 Operation <Database , CreateDatabaseMetadata > op = dbAdminClient
119- .createDatabase (
120- id .getInstanceId ().getInstance (),
121- id .getDatabase (),
122- Arrays .asList (
123- "CREATE TABLE Singers (\n "
124- + " SingerId INT64 NOT NULL,\n "
125- + " FirstName STRING(1024),\n "
126- + " LastName STRING(1024),\n "
127- + " SingerInfo BYTES(MAX)\n "
128- + ") PRIMARY KEY (SingerId)" ,
129- "CREATE TABLE Albums (\n "
130- + " SingerId INT64 NOT NULL,\n "
131- + " AlbumId INT64 NOT NULL,\n "
132- + " AlbumTitle STRING(MAX)\n "
133- + ") PRIMARY KEY (SingerId, AlbumId),\n "
134- + " INTERLEAVE IN PARENT Singers ON DELETE CASCADE" ));
107+ .createDatabase (
108+ id .getInstanceId ().getInstance (),
109+ id .getDatabase (),
110+ Arrays .asList (
111+ "CREATE TABLE Singers (\n "
112+ + " SingerId INT64 NOT NULL,\n "
113+ + " FirstName STRING(1024),\n "
114+ + " LastName STRING(1024),\n "
115+ + " SingerInfo BYTES(MAX)\n "
116+ + ") PRIMARY KEY (SingerId)" ,
117+ "CREATE TABLE Albums (\n "
118+ + " SingerId INT64 NOT NULL,\n "
119+ + " AlbumId INT64 NOT NULL,\n "
120+ + " AlbumTitle STRING(MAX)\n "
121+ + ") PRIMARY KEY (SingerId, AlbumId),\n "
122+ + " INTERLEAVE IN PARENT Singers ON DELETE CASCADE" ));
135123 Database db = op .waitFor ().getResult ();
136124 System .out .println ("Created database [" + db .getId () + "]" );
137125 }
@@ -413,6 +401,22 @@ static void readOnlyTransaction(DatabaseClient dbClient) {
413401 }
414402 // [END read_only_transaction]
415403
404+ // [START read_stale_data]
405+ static void readStaleData (DatabaseClient dbClient ) {
406+ ResultSet resultSet =
407+ dbClient
408+ .singleUse (TimestampBound .ofExactStaleness (10 , TimeUnit .SECONDS ))
409+ .read ("Albums" ,
410+ KeySet .all (),
411+ Arrays .asList ("SingerId" , "AlbumId" , "MarketingBudget" ));
412+ while (resultSet .next ()) {
413+ System .out .printf (
414+ "%d %d %s\n " , resultSet .getLong (0 ), resultSet .getLong (1 ),
415+ resultSet .isNull (2 ) ? "NULL" : resultSet .getLong ("MarketingBudget" ));
416+ }
417+ }
418+ // [END read_stale_data]
419+
416420 static void run (DatabaseClient dbClient , DatabaseAdminClient dbAdminClient , String command ,
417421 DatabaseId database ) {
418422 switch (command ) {
@@ -458,6 +462,9 @@ static void run(DatabaseClient dbClient, DatabaseAdminClient dbAdminClient, Stri
458462 case "readonlytransaction" :
459463 readOnlyTransaction (dbClient );
460464 break ;
465+ case "readstaledata" :
466+ readStaleData (dbClient );
467+ break ;
461468 default :
462469 printUsageAndExit ();
463470 }
0 commit comments