מטרות
במדריך הזה מוסבר איך לבצע את השלבים הבאים באמצעות מנהל ההתקן Spanner JDBC:
- יוצרים מכונה ומסד נתונים ב-Spanner.
- לכתוב, לקרוא ולהריץ שאילתות SQL על נתונים במסד הנתונים.
- מעדכנים את הסכימה של מסד הנתונים.
- עדכון נתונים באמצעות טרנזקציה של קריאה וכתיבה.
- מוסיפים אינדקס משני למסד הנתונים.
- השימוש באינדקס מאפשר לקרוא ולהריץ שאילתות SQL על נתונים.
- אחזור נתונים באמצעות טרנזקציה לקריאה בלבד.
עלויות
במדריך הזה נעשה שימוש ב-Spanner, שהוא רכיב בתשלום שלGoogle Cloud. מידע על עלות השימוש ב-Spanner מופיע בקטע תמחור.
לפני שמתחילים
צריך לבצע את השלבים שמפורטים במאמר הגדרה, שכוללים יצירה והגדרה של פרויקט ברירת מחדל Google Cloud , הפעלת החיוב, הפעלת Cloud Spanner API והגדרת OAuth 2.0 כדי לקבל אישורי אימות לשימוש ב-Cloud Spanner API.
בפרט, חשוב להריץ את הפקודה gcloud auth
application-default login כדי להגדיר את סביבת הפיתוח המקומית עם פרטי אימות.
הכנת סביבת JDBC מקומית
אם הפריטים הבאים לא מותקנים במחשב הפיתוח, צריך להתקין אותם:
משכפלים את מאגר האפליקציה לדוגמה ומעבירים אותו למכונה המקומית:
git clone https://github.com/googleapis/java-spanner-jdbc.gitעוברים לספרייה שמכילה את הקוד לדוגמה של Spanner:
cd java-spanner-jdbc/samples/snippets
יצירת מופע
בפעם הראשונה שמשתמשים ב-Spanner, צריך ליצור מופע, שהוא הקצאה של משאבים שמשמשים מסדי נתונים של Spanner. כשיוצרים מופע, בוחרים הגדרת מופע, שקובעת איפה הנתונים מאוחסנים, וגם את מספר הצמתים לשימוש, שקובע את כמות משאבי ההגשה והאחסון במופע.
במאמר יצירת מכונה מוסבר איך ליצור מכונת Spanner באמצעות אחת מהשיטות הבאות. אפשר לתת למופע שם test-instance כדי להשתמש בו עם נושאים אחרים במסמך הזה שמפנים למופע בשם test-instance.
- Google Cloud CLI
- מסוף Google Cloud
- ספריית לקוח (C++, C#, Go, Java, Node.js, PHP, Python או Ruby)
עיון בקבצים לדוגמה
מאגר הדוגמאות מכיל דוגמה שמראה איך להשתמש ב-Spanner עם JDBC.
הפקודהpom.xml מוסיפה את מנהל ההתקנים של Spanner JDBC לתלות של הפרויקט ומגדירה את תוסף ההרכבה כדי ליצור קובץ JAR שניתן להפעלה עם מחלקת Java שמוגדרת במדריך הזה.
יוצרים את הדוגמה מתוך הספרייה samples/snippets:
mvn package -DskipTests
יצירת מסד נתונים
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
createdatabase test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
createpgdatabase test-instance example-db
הפרטים שמוצגים הם:
Created database [projects/my-project/instances/test-instance/databases/example-db]
GoogleSQL
PostgreSQL
השלב הבא הוא כתיבת נתונים למסד הנתונים.
יצירת חיבור JDBC
כדי לבצע פעולות קריאה או כתיבה, צריך ליצורConnection. כל האינטראקציות עם Spanner חייבות לעבור דרך Connection. שם מסד הנתונים ומאפיינים אחרים מצוינים בכתובת ה-URL של חיבור JDBC ובקבוצה java.util.Properties.
GoogleSQL
PostgreSQL
רשימה מלאה של הנכסים הנתמכים מופיעה במאמר בנושא מאפייני כתובת URL של חיבור.
כל Connection משתמש במשאבים, ולכן מומלץ לסגור חיבורים כשאין בהם יותר צורך, או להשתמש במאגר חיבורים כדי לעשות שימוש חוזר בחיבורים באפליקציה.
מידע נוסף זמין בהפניה ל-Javadoc Connection.
חיבור מנהל התקן JDBC לאמולטור
יש שתי דרכים לחבר את מנהל ההתקן של JDBC לאמולטור Spanner:
- מגדירים את משתנה הסביבה
SPANNER_EMULATOR_HOST: ההגדרה הזו מורה למנהל התקן של JDBC להתחבר לאמולטור. מופע Spanner ומסד הנתונים בכתובת ה-URL של חיבור ה-JDBC כבר צריכים להתקיים באמולטור. - מוסיפים
autoConfigEmulator=trueלכתובת ה-URL של החיבור: הפעולה הזו מורה למנהל ההתקן של JDBC להתחבר לאמולטור, וליצור באופן אוטומטי את מופע Spanner ואת מסד הנתונים בכתובת ה-URL של חיבור JDBC אם הם לא קיימים.
בדוגמה הזו מוסבר איך להשתמש באפשרות autoConfigEmulator=true של כתובת ה-URL לחיבור.
GoogleSQL
PostgreSQL
כתיבת נתונים באמצעות DML
אפשר להוסיף נתונים באמצעות שפת טיפול בנתונים (DML) בעסקת קריאה-כתיבה.
משתמשים ב-PreparedStatement.executeUpdate() method כדי להריץ הצהרת DML.
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writeusingdml test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writeusingdmlpg test-instance example-db
הפרטים שמוצגים הם:
4 records inserted.
כתיבת נתונים באמצעות חבילת DML
משתמשים בשיטותPreparedStatement#addBatch() ו-PreparedStatement#executeBatch() כדי להריץ כמה הצהרות DML באותו אצווה.
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writeusingdmlbatch test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writeusingdmlbatchpg test-instance example-db
הפרטים שמוצגים הם:
3 records inserted.
כתיבת נתונים באמצעות מוטציות
אפשר גם להוסיף נתונים באמצעות מוטציות.
אפשר לכתוב נתונים באמצעות אובייקט Mutation.
אובייקט Mutation הוא מאגר לפעולות שינוי. Mutation
מייצג רצף של פעולות הוספה, עדכון ומחיקה שמערכת Spanner
מבצעת באופן אטומי בשורות ובטבלאות שונות במסד נתונים של Spanner.
ה-method newInsertBuilder() במחלקה Mutation יוצר מוטציה מסוג INSERT, שמוסיפה שורה חדשה לטבלה. אם השורה כבר קיימת, הכתיבה נכשלת. לחלופין, אפשר להשתמש בשיטה newInsertOrUpdateBuilder כדי ליצור מוטציה של INSERT_OR_UPDATE, שמעדכנת את ערכי העמודות אם השורה כבר קיימת.
write() בממשק CloudSpannerJdbcConnection כותבת את השינויים. כל השינויים בחבילה אחת מוחלים באופן אטומי.
אפשר לבטל את העטיפה של הממשק CloudSpannerJdbcConnection מ-Spanner
JDBC Connection.
בדוגמה הבאה אפשר לראות איך לכתוב את הנתונים באמצעות מוטציות:
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
write test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writepg test-instance example-db
הפרטים שמוצגים הם:
Inserted 10 rows.
הרצת שאילתות על נתונים באמצעות SQL
Spanner תומך בממשק SQL לקריאת נתונים, שאפשר לגשת אליו בשורת הפקודה באמצעות Google Cloud CLI או באופן פרוגרמטי באמצעות מנהל ההתקן Spanner JDBC.
בשורת הפקודה
מריצים את הצהרת ה-SQL הבאה כדי לקרוא את הערכים של כל העמודות מהטבלה Albums:
GoogleSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT SingerId, AlbumId, AlbumTitle FROM Albums'
PostgreSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='SELECT singer_id, album_id, album_title FROM albums'
התוצאה:
SingerId AlbumId AlbumTitle
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
שימוש ב-Spanner JDBC driver
בנוסף להרצת הצהרת SQL בשורת הפקודה, אפשר להנפיק את אותה הצהרת SQL באופן פרוגרמטי באמצעות מנהל ההתקן Spanner JDBC.
ה-methods והמחלקות הבאות משמשות להרצת שאילתת ה-SQL:- השיטה
createStatement()בממשקConnection: משתמשים בה כדי ליצור אובייקט הצהרה חדש להרצת הצהרת SQL. - השיטה
executeQuery(String)של המחלקהStatement: משתמשים בשיטה הזו כדי להריץ שאילתה על מסד נתונים. - המחלקות
Statement: משתמשים בהן כדי להריץ מחרוזת SQL. - המחלקות
ResultSet: משמשות לגישה לנתונים שמוחזרים על ידי הצהרת SQL.
כך מריצים את השאילתה וניגשים לנתונים:
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
query test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
querypg test-instance example-db
אמורה להתקבל התוצאה הבאה:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
שאילתה באמצעות פרמטר SQL
אם באפליקציה יש שאילתה שמופעלת לעיתים קרובות, אפשר לשפר את הביצועים שלה על ידי שימוש בפרמטרים. אפשר לשמור במטמון את השאילתה הפרמטרית שמתקבלת ולעשות בה שימוש חוזר, וכך להפחית את עלויות הקומפילציה. מידע נוסף זמין במאמר שימוש בפרמטרים של שאילתות כדי להריץ במהירות שאילתות שמופעלות לעיתים קרובות.
הנה דוגמה לשימוש בפרמטר בקטע WHERE כדי לשלוח שאילתה לגבי רשומות שמכילות ערך ספציפי של LastName.
משתמשים ב-java.sql.PreparedStatement כדי להריץ שאילתה עם פרמטר.
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
querywithparameter test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
querywithparameterpg test-instance example-db
אמורה להתקבל התוצאה הבאה:
12 Melissa Garcia
עדכון הסכימה של מסד הנתונים
נניח שאתם רוצים להוסיף עמודה חדשה בשם MarketingBudget לטבלה Albums. כדי להוסיף עמודה חדשה לטבלה קיימת, צריך לעדכן את סכימת מסד הנתונים. מערכת Spanner תומכת בעדכוני סכימה במסד נתונים בזמן שמסד הנתונים ממשיך לשרת תנועה. עדכוני סכימה לא מחייבים להעביר את מסד הנתונים למצב אופליין, והם לא נועלים טבלאות או עמודות שלמות. אתם יכולים להמשיך לכתוב נתונים למסד הנתונים במהלך עדכון הסכימה. מידע נוסף על עדכוני סכימה נתמכים ועל ביצועים של שינויים בסכימה זמין במאמר ביצוע עדכונים בסכימה.
הוספת עמודה
אפשר להוסיף עמודה בשורת הפקודה באמצעות Google Cloud CLI או באופן פרוגרמטי באמצעות Spanner JDBC driver.
בשורת הפקודה
כדי להוסיף את העמודה החדשה לטבלה, משתמשים בפקודה ALTER TABLE הבאה:
GoogleSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE Albums ADD COLUMN MarketingBudget INT64'
PostgreSQL
gcloud spanner databases ddl update example-db --instance=test-instance \
--ddl='ALTER TABLE albums ADD COLUMN marketing_budget BIGINT'
הפרטים שמוצגים הם:
Schema updating...done.
שימוש ב-Spanner JDBC driver
משתמשים בשיטהexecute(String) של המחלקה java.sql.Statement כדי לשנות את הסכימה:
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
addmarketingbudget test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
addmarketingbudgetpg test-instance example-db
הפרטים שמוצגים הם:
Added MarketingBudget column.
ביצוע של אצווה של DDL
מומלץ לבצע כמה שינויים בסכימה באצווה אחת. משתמשים בשיטה addBatch(String) של java.sql.Statement כדי להוסיף כמה הצהרות DDL לאצווה.
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
ddlbatch test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
ddlbatchpg test-instance example-db
הפרטים שמוצגים הם:
Added Venues and Concerts tables.
כתיבת נתונים בעמודה החדשה
הקוד הבא כותב נתונים בעמודה החדשה. הפונקציה מגדירה את MarketingBudget ל-100000 בשורה עם מפתח Albums(1, 1), ול-500000 בשורה עם מפתח Albums(2, 2).
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
update test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
updatepg test-instance example-db
הפלט אמור להיראות כך:
Updated albums
אפשר גם להריץ שאילתת SQL או קריאת נתונים כדי לאחזר את הערכים שזה עתה כתבתם.
הנה הקוד להרצת השאילתה:
GoogleSQL
PostgreSQL
כדי להריץ את השאילתה הזו, מריצים את הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
querymarketingbudget test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
querymarketingbudgetpg test-instance example-db
התוצאה:
1 1 100000
1 2 null
2 1 null
2 2 500000
2 3 null
עדכון נתונים
אפשר לעדכן נתונים באמצעות DML בעסקת קריאה-כתיבה.
הגדרת AutoCommit=false לביצוע עסקאות קריאה וכתיבה ב-JDBC.
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writewithtransactionusingdml test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
writewithtransactionusingdmlpg test-instance example-db
תגי טרנזקציות ותגי בקשות
כדי לפתור בעיות בטרנזקציות ובשאילתות ב-Spanner, אפשר להשתמש בתגי טרנזקציות ובתגי בקשות. אפשר להגדיר תגי עסקאות ותגי בקשות ב-JDBC באמצעות משתני הסשן TRANSACTION_TAGו-STATEMENT_TAG.
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
tags test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
tagspg test-instance example-db
אחזור נתונים באמצעות טרנזקציות לקריאה בלבד
נניח שרוצים לבצע יותר מקריאה אחת באותה חותמת זמן. עסקאות לקריאה בלבד מתבססות על קידומת עקבית של היסטוריית אישור העסקאות, כך שהאפליקציה תמיד מקבלת נתונים עקביים.
כדי להריץ טרנזקציה לקריאה בלבד, מגדירים את ReadOnly=true ו-AutoCommit=false ב-java.sql.Connection, או משתמשים בהצהרת ה-SQL SET TRANSACTION READ ONLY.
בדוגמה הבאה מוצג איך להריץ שאילתה ולבצע קריאה באותה טרנזקציה לקריאה בלבד:
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
readonlytransaction test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
readonlytransactionpg test-instance example-db
הפלט אמור להיראות כך:
1 1 Total Junk
1 2 Go, Go, Go
2 1 Green
2 2 Forever Hold Your Peace
2 3 Terrified
2 2 Forever Hold Your Peace
1 2 Go, Go, Go
2 1 Green
2 3 Terrified
1 1 Total Junk
שאילתות עם חלוקה למחיצות ו-Data Boost
ממשק ה-API partitionQuery מחלק שאילתה לחלקים קטנים יותר, או למחיצות, ומשתמש בכמה מכונות כדי לאחזר את המחיצות במקביל. כל מחיצה מזוהה באמצעות אסימון מחיצה. החביון של PartitionQuery API גבוה יותר מזה של API רגיל לשאילתות, כי הוא מיועד רק לפעולות בכמות גדולה, כמו ייצוא או סריקה של כל מסד הנתונים.
Data Boost מאפשר לכם להריץ שאילתות ניתוח ולייצא נתונים כמעט ללא השפעה על עומסי העבודה הקיימים במופע Spanner שהוקצה. Data Boost תומך רק בשאילתות עם חלוקה למחיצות.
GoogleSQL
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
databoost test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
databoostpg test-instance example-db
מידע נוסף על הרצת שאילתות עם חלוקה למחיצות ועל שימוש ב-Data Boost עם מנהל התקן JDBC זמין במאמרים הבאים:
- GoogleSQL: Data Boost והצהרות שאילתה עם חלוקה למחיצות
- PostgreSQL: Data Boost ומשפטי שאילתה עם חלוקה למחיצות
Partitioned DML
שפת טיפול בנתונים (DML) עם חלוקה למחיצות מיועדת לסוגים הבאים של עדכונים ומחיקות בכמות גדולה:
- ניקוי תקופתי ו-garbage collection.
- מילוי חוזר של עמודות חדשות בערכי ברירת מחדל.
PostgreSQL
מריצים את הדוגמה באמצעות הפקודה הבאה:
GoogleSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
pdml test-instance example-db
PostgreSQL
java -jar target/jdbc-snippets/jdbc-samples.jar \
pdmlpg test-instance example-db
מידע נוסף על AUTOCOMMIT_DML_MODE זמין כאן:
הסרת המשאבים
כדי להימנע מחיובים נוספים בחשבון לחיוב ב-Cloud על המשאבים שבהם השתמשתם במדריך הזה, צריך להשליך את מסד הנתונים ולמחוק את המופע שיצרתם.
מחיקת מסד הנתונים
אם מוחקים מופע, כל מסדי הנתונים שבו נמחקים אוטומטית. בשלב הזה נסביר איך למחוק מסד נתונים בלי למחוק את המופע (עדיין תחויבו על המופע).
בשורת הפקודה
gcloud spanner databases delete example-db --instance=test-instance
שימוש במסוף Google Cloud
נכנסים לדף Spanner Instances במסוף Google Cloud .
לוחצים על המופע.
לוחצים על מסד הנתונים שרוצים למחוק.
בדף פרטי מסד הנתונים, לוחצים על מחיקה.
מאשרים שרוצים למחוק את מסד הנתונים ולוחצים על מחיקה.
מחיקת המכונה
מחיקת מופע תגרום להסרה אוטומטית של כל מסדי הנתונים שנוצרו במופע הזה.
בשורת הפקודה
gcloud spanner instances delete test-instance
שימוש במסוף Google Cloud
נכנסים לדף Spanner Instances במסוף Google Cloud .
לוחצים על המופע.
לוחצים על Delete.
מאשרים שרוצים למחוק את המופע ולוחצים על מחיקה.
המאמרים הבאים
- הדרכה: שילוב Spanner עם Spring Data JPA (ניב GoogleSQL)
- הדרכה: שילוב Spanner עם Spring Data JPA (דיאלקט PostgreSQL)
- הדרכה: שילוב Spanner עם Hibernate ORM (דיאלקט GoogleSQL)
- הדרכה: שילוב Spanner עם Hibernate ORM (דיאלקט PostgreSQL)
- מידע נוסף על פקודות לניהול סשנים ב-JDBC (GoogleSQL)
- מידע נוסף על פקודות לניהול סשנים ב-JDBC (PostgreSQL)
במאמר אימות לשירותי Cloud באמצעות ספריות לקוח מוסבר על הרשאות ופרטי אימות.