מבוא ל- HikariCP

1. סקירה כללית

במאמר מבוא זה, נלמד על פרויקט מאגר החיבורים HikariCP JDBC. זוהי מסגרת איגום חיבורי JDBC קלה מאוד (בערך 130Kb) ומהירה פותח על ידי ברט וולדריג 'בסביבות 2012.

2. מבוא

ישנן מספר תוצאות ביצועים להשוואת הביצועים של HikariCP עם מסגרות איגום חיבורים אחרות כגון c3p0, dbcp2, tomcat, ו ויבר. לדוגמה, צוות HikariCP פרסם להלן מדדי המידה (תוצאות מקוריות זמינות כאן):

המסגרת מהירה כל כך מכיוון שהטכניקות הבאות יושמו:

  • הנדסה ברמת Bytecode - נעשתה הנדסה ברמת קוד-קוד קיצונית (כולל קידוד מקורי ברמת הרכבה)
  • מיקרו אופטימיזציות - למרות שאינם ניתנים למדידה, אופטימיזציות אלה משפרות את הביצועים הכוללים
  • שימוש מושכל במסגרת האוספים - ה רשימת מערך הוחלף בכיתה בהתאמה אישית FastList המבטל בדיקת טווח ומבצע סריקות הסרה מזנב לראש

3. תלות של Maven

בואו לבנות יישום לדוגמא כדי להדגיש את השימוש בו. HikariCP מגיע עם תמיכה בכל הגרסאות העיקריות של JVM. כל גרסה דורשת תלות שלה; עבור Java 8 עד 11 יש לנו:

 com.zaxxer HikariCP 3.4.5 

גרסאות JDK ישנות יותר כמו 6 ו -7 נתמכות גם כן. הגרסאות המתאימות ניתן למצוא כאן וכאן. כמו כן, אנו יכולים לבדוק את הגרסאות העדכניות ביותר במאגר Central Maven.

4. שימוש

בואו ניצור כעת אפליקציית הדגמה. שים לב שעלינו לכלול תלות מתאימה בכיתת הנהג של JDBC pom.xml. אם לא מסופקים תלות, היישום יזרוק א ClassNotFoundException.

4.1. ליצור מקור מידע

נשתמש ב- HikariCP מקור מידע כדי ליצור מופע יחיד של מקור נתונים ליישום שלנו:

מחלקה ציבורית DataSource {private static HikariConfig config = HikariConfig new (); פרטי HikariDataSource סטטיים פרטיים; סטטי {config.setJdbcUrl ("jdbc_url"); config.setUsername ("שם_סיסים"); config.setPassword ("בסיסמת_סיסמה"); config.addDataSourceProperty ("cachePrepStmts", "true"); config.addDataSourceProperty ("prepStmtCacheSize", "250"); config.addDataSourceProperty ("prepStmtCacheSqlLimit", "2048"); ds = HikariDataSource חדש (config); } DataSource פרטי () {} חיבור סטטי ציבורי getConnection () זורק SQLException {החזר ds.getConnection (); }}

נקודה לציון כאן היא האתחול ב- סטָטִי לַחסוֹם.

HikariConfig הוא מחלקת התצורה המשמשת לאתחול מקור נתונים. זה מגיע עם ארבעה פרמטרים מוכרים שחובה להשתמש בהם שם משתמש, סיסמה, jdbcUrl, dataSourceClassName.

מִתוֹך jdbcUrl ו dataSourceClassName, כל אחד מהם ישמש בכל פעם. עם זאת, בעת שימוש במאפיין זה עם מנהלי התקנים ישנים יותר, ייתכן שנצטרך להגדיר את שני המאפיינים.

בנוסף למאפיינים אלה, ישנם מספר מאפיינים זמינים אחרים שאולי לא כולם מוצעים על ידי מסגרות בריכה אחרות:

  • התחייבות אוטומטית
  • connectionTimeout
  • idleTimeout
  • maxLifetime
  • connectionTestQuery
  • connectionInitSql
  • validationTimeout
  • maximumPoolSize
  • poolName
  • allowPoolSuspension
  • לקריאה בלבד
  • transactionIsolation
  • leakDetectionTreshold

HikariCP בולט בגלל מאפייני מסדי נתונים אלה. הוא מתקדם מספיק בכדי לאתר אפילו דליפות חיבור בפני עצמו!

תיאור מפורט של נכסים אלה ניתן למצוא כאן.

אנחנו יכולים לאתחל HikariConfig עם קובץ מאפיינים הממוקם ב- אֶמְצָעִי מַדרִיך:

פרטי HikariConfig סטטיים פרטיים = HikariConfig חדש ("datasource.properties");

קובץ המאפיינים אמור להיראות כך:

dataSourceClassName = // TBD dataSource.user = // TBD // שם מאפיינים אחרים צריך להתחיל ב- dataSource כפי שמוצג לעיל

אנחנו יכולים להשתמש java.util.Properties-תצורה מבוססת גם כן:

אביזרי מאפיינים = מאפיינים חדשים (); props.setProperty ("dataSourceClassName", // TBD); props.setProperty ("dataSource.user", // TBD); // מגדיר עבור מאפיינים נדרשים אחרים סטטי פרטי HikariConfig config = HikariConfig חדש (אביזרים);

לחלופין, אנו יכולים לאתחל ישירות מקור נתונים:

ds.setJdbcUrl (// TBD); ds.setUsername (// TBD); ds.setPassword (// TBD);

4.2. שימוש במקור נתונים

כעת, לאחר שהגדרנו את מקור הנתונים, נוכל להשתמש בו בכדי להשיג חיבור ממאגר החיבורים המוגדר ולבצע פעולות הקשורות ל- JDBC.

נניח שיש לנו שני טבלאות בשם מחלקה ו אמפ לדמות מקרה שימוש במחלקת עובדים. אנו נכתוב שיעור בכדי להביא פרטים אלה ממאגר המידע באמצעות HikariCP.

להלן נפרט את הצהרות ה- SQL הדרושות ליצירת נתוני הדוגמה:

ליצור מחלקה לטבלה (מספר מסחרי, שם שם Varchar (14), Loc Varchar (13), מגבלה pk_dept מפתח ראשי (מחלקה)); צור טבלה אמפ (empno מספרי, ename varchar (10), job varchar (9), mgr numeric, שכר שכירה, sal numeric, comm numeric, deptno numeric, constraint pk_emp מפתח ראשי (empno), constraint fk_deptno מפתח זר (deptno) הפניות מחלקה (מחלקה)); הכנס לערכי מחלקה (10, 'חשבונאות', 'ניו יורק'); הכנס לערכי מחלקה (20, 'מחקר', 'דאלאס'); הכנס לערכי מחלקה (30, 'SALES', 'CHICAGO'); הכנס לערכי מחלקה (40, 'OPERATIONS', 'BOSTON'); הכנס לערכי emp (7839, 'KING', 'PRESIDENT', null, to_date ('17 -11-1981 ',' dd-mm-yyyy '), 7698, null, 10); הכנס לערכי אמפ (7698, 'BLAKE', 'MANAGER', 7839, to_date ('1-5-1981', 'dd-mm-yyyy'), 7782, null, 20); הכנס לערכי emp (7782, 'CLARK', 'MANAGER', 7839, to_date ('9-6-1981', 'dd-mm-yyyy'), 7566, null, 30); הכנס לערכי אמפ (7566, 'JONES', 'MANAGER', 7839, to_date ('2-4-1981', 'dd-mm-yyyy'), 7839, null, 40);

שים לב אם אנו משתמשים במסד נתונים בזיכרון כגון H2, עלינו לטעון באופן אוטומטי את סקריפט מסד הנתונים לפני הפעלת הקוד בפועל כדי להביא את הנתונים. למרבה המזל, H2 מגיע עם INIT פרמטר שיכול לטעון את סקריפט מסד הנתונים משביל הכיתה בזמן הריצה. כתובת ה- JDBC צריכה להיראות כך:

jdbc: h2: mem: test; DB_CLOSE_DELAY = -1; INIT = runcript מ- 'classpath: /db.sql'

עלינו ליצור שיטה לאסוף נתונים אלה ממסד הנתונים:

רשימה סטטית ציבורית fetchData () זורק SQLException {String SQL_QUERY = "בחר * מ- emp"; עובדים ברשימה = null; נסה (Connection con = DataSource.getConnection (); PreparedStatement pst = con.prepareStatement (SQL_QUERY); ResultSet rs = pst.executeQuery ();) {עובדים = ArrayList חדש (); עובד שכיר; ואילו (rs.next ()) {עובד = עובד חדש (); employee.setEmpNo (rs.getInt ("empno")); employee.setEname (rs.getString ("ename")); employee.setJob (rs.getString ("עבודה")); employee.setMgr (rs.getInt ("mgr")); employee.setHiredate (rs.getDate ("שכיר")); employee.setSal (rs.getInt ("sal")); employee.setComm (rs.getInt ("comm")); employee.setDeptno (rs.getInt ("מחלקה")); עובדים. להוסיף (עובד); }} להחזיר עובדים; }

כעת עלינו ליצור שיטת JUnit כדי לבדוק אותה. מכיוון שאנו יודעים את מספר השורות בטבלה אמפ, אנו יכולים לצפות שגודל הרשימה שהוחזרה צריך להיות שווה למספר השורות:

@Test ציבורי בטל givenConnection_thenFetchDbData () זורק SQLException {HikariCPDemo.fetchData (); assertEquals (4, עובדים.גודל ()); }

5. מסקנה

במדריך מהיר זה למדנו על היתרונות של השימוש ב- HikariCP ותצורתו.

כמו תמיד, קוד המקור המלא זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found