מטרות
במדריך הזה נסביר איך לבצע את הפעולות הבאות באמצעות מנהל ההתקן של 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 או Rust)
עיון בקבצים לדוגמה
מאגר הדוגמאות מכיל דוגמה שמראה איך להשתמש ב-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 משתמש במשאבים, ולכן מומלץ לסגור את החיבורים כשכבר לא צריך אותם, או להשתמש במאגר חיבורים כדי להשתמש שוב בחיבורים באפליקציה.
מידע נוסף זמין במאמר העזר בנושא Connection Javadoc.
חיבור מנהל ההתקן של JDBC לאמולטור
אפשר לחבר את מנהל ההתקן של JDBC לאמולטור של Spanner בשתי דרכים:
- מגדירים את משתנה הסביבה
SPANNER_EMULATOR_HOST: הפעולה הזו מורה למנהל ההתקן של JDBC להתחבר לאמולטור. מכונת Spanner ומסד הנתונים בכתובת ה-URL של החיבור ל-JDBC כבר צריכים להיות קיימים באמולטור. - מוסיפים את
autoConfigEmulator=trueלכתובת ה-URL של החיבור: הפעולה הזו מורה למנהל ההתקן של JDBC להתחבר לאמולטור, וליצור באופן אוטומטי את המכונה ומסד הנתונים של Spanner בכתובת ה-URL של החיבור ל-JDBC, אם הם לא קיימים.
בדוגמה הזו מוסבר איך להשתמש באפשרות autoConfigEmulator=true של כתובת ה-URL לחיבור.
GoogleSQL
PostgreSQL
כתיבת נתונים באמצעות DML
אפשר להוסיף נתונים באמצעות שפת טיפול בנתונים (DML) בטרנזקציית קריאה-כתיבה.
משתמשים ב-method PreparedStatement.executeUpdate() כדי להריץ פקודת 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() methods כדי להריץ כמה פקודות 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, שמוסיפה שורה חדשה בטבלה. אם השורה כבר קיימת, הכתיבה נכשלת. לחלופין, אתם יכולים להשתמש ב-method newInsertOrUpdateBuilder כדי ליצור מוטציה של INSERT_OR_UPDATE, שמעדכנת את ערכי העמודות אם השורה כבר קיימת.
write() בממשק CloudSpannerJdbcConnection. כל השינויים באצווה אחת מוחלים באופן אטומי.
אפשר לבטל את העטיפה של הממשק CloudSpannerJdbcConnection מ-Connection של Spanner JDBC.
הקוד הזה מראה איך לכתוב את הנתונים באמצעות מוטציות:
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'
תחביר Pipe ב-GoogleSQL
gcloud spanner databases execute-sql example-db --instance=test-instance \
--sql='FROM Albums |> SELECT SingerId, AlbumId, AlbumTitle'
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
בנוסף להרצת הצהרת SQL בשורת הפקודה, אתם יכולים להנפיק את אותה הצהרת SQL באופן פרוגרמטי באמצעות מנהל ההתקן של Spanner JDBC.
ה-methods והמחלקות הבאות משמשות להרצת שאילתת ה-SQL:- ה-method
createStatement()בממשקConnection: משמשת ליצירת אובייקט הצהרה חדש להרצת הצהרת SQL. - ה-method
executeQuery(String)של המחלקהStatement: משתמשים ב-method הזו כדי להריץ שאילתה במסד נתונים. - המחלקה
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.
בשורת הפקודה
משתמשים בפקודה הבאה של 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
כדי לשנות את הסכימה, משתמשים ב-methodexecute(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
מומלץ לבצע כמה שינויים בסכימה באצווה אחת. משתמשים ב-method 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
אחזור נתונים באמצעות עסקאות לקריאה בלבד
נניח שאתם רוצים לבצע יותר מקריאה אחת באותה חותמת זמן. עסקאות לקריאה בלבד צופות בתחילית עקבית של היסטוריית ה-commit של העסקה, כך שהאפליקציה תמיד מקבלת נתונים עקביים.
כדי לבצע עסקה לקריאה בלבד, מגדירים את 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
partitionQuery API מחלק שאילתה לחלקים קטנים יותר, או למחיצות, ומשתמש במספר מכונות כדי לאחזר את המחיצות במקביל. כל מחיצה מזוהה באמצעות אסימון מחיצה. ל-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
DML מחולק למחיצות
שפת הטיפול בנתונים (DML) מחולקים למחיצות מיועדת לסוגים הבאים של עדכונים ומחיקות בכמות גדולה:
- ניקיון תקופתי ואיסוף אשפה.
- מילוי עמודות חדשות בערכי ברירת מחדל.
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 .
לוחצים על המופע.
לוחצים על מסד הנתונים שרוצים למחוק.
בדף Database details, לוחצים על Delete.
מאשרים שרוצים למחוק את מסד הנתונים ולוחצים על מחיקה.
מחיקת המכונה
מחיקת מכונה גורמת להסרה אוטומטית של כל מסדי הנתונים שנוצרו בה.
בשורת הפקודה
gcloud spanner instances delete test-instance
באמצעות מסוף Google Cloud
נכנסים לדף Spanner Instances במסוף Google Cloud .
לוחצים על המכונה.
לוחצים על Delete.
מאשרים שרוצים למחוק את המכונה ולוחצים על Delete.
המאמרים הבאים
- איך משלבים את Spanner עם Spring Data JPA (ניב GoogleSQL)
- איך משלבים את Spanner עם Spring Data JPA (ניב PostgreSQL)
- איך משלבים את Spanner עם Hibernate ORM (ניב GoogleSQL)
- איך משלבים את Spanner עם Hibernate ORM (ניב PostgreSQL)
- מידע נוסף על פקודות לניהול סשנים של JDBC (GoogleSQL)
- מידע נוסף על פקודות לניהול סשנים של JDBC (PostgreSQL)
במאמר אימות לשירותי Cloud באמצעות ספריות לקוח תוכלו לקרוא מידע נוסף על פרטי כניסה לאימות ולהרשאה.