รวดเร็ว ง่ายดาย เชื่อถือได้ HikariCP คือพูลการเชื่อมต่อ JDBC ที่พร้อมสำหรับการผลิตแบบ "ไม่มีค่าใช้จ่าย" ด้วยขนาดประมาณ 165Kb ไลบรารีจึงมีน้ำหนักเบามาก อ่านเกี่ยวกับวิธีการที่เราดำเนินการได้ที่นี่
"ความเรียบง่ายเป็นสิ่งที่จำเป็นสำหรับความน่าเชื่อถือ"
- ดร.เอ็ดส์เกอร์ ไดจค์สตรา
สำคัญ
เพื่อหลีกเลี่ยงสภาวะที่เกิดขึ้นได้ยากซึ่งพูลกลายเป็นศูนย์และไม่สามารถกู้คืนได้ จำเป็นต้องกำหนดค่า TCP Keepalive ไดรเวอร์ JDBC บางตัวรองรับสิ่งนี้ผ่านคุณสมบัติ เช่น tcpKeepAlive=true
บน PostgreSQL แต่ไม่ว่าในกรณีใด ก็สามารถกำหนดค่าที่ระดับ OS ได้เช่นกัน ดูการตั้งค่า OS TCP Keepalive และ/หรือ TCP Keepalive เพื่อประสบการณ์ PostgreSQL ที่ดียิ่งขึ้น
สิ่งประดิษฐ์ Java 11+ Maven:
< dependency >
< groupId >com.zaxxer</ groupId >
< artifactId >HikariCP</ artifactId >
< version >6.2.1</ version >
</ dependency >
สิ่งประดิษฐ์ Java 8 maven ( โหมดการบำรุงรักษา ):
< dependency >
< groupId >com.zaxxer</ groupId >
< artifactId >HikariCP</ artifactId >
< version >4.0.3</ version >
</ dependency >
สิ่งประดิษฐ์ Java 7 maven ( โหมดการบำรุงรักษา ):
< dependency >
< groupId >com.zaxxer</ groupId >
< artifactId >HikariCP-java7</ artifactId >
< version >2.4.13</ version >
</ dependency >
สิ่งประดิษฐ์ Java 6 maven ( โหมดการบำรุงรักษา ):
< dependency >
< groupId >com.zaxxer</ groupId >
< artifactId >HikariCP-java6</ artifactId >
< version >2.3.13</ version >
</ dependency >
หรือดาวน์โหลดได้จากที่นี่
ไมโครเบนช์มาร์กถูกสร้างขึ้นเพื่อแยกและวัดค่าโสหุ้ยของพูลโดยใช้เฟรมเวิร์กไมโครเบนช์มาร์กของ JMH คุณสามารถตรวจสอบโครงการการวัดประสิทธิภาพ HikariCP เพื่อดูรายละเอียด และตรวจสอบ/ดำเนินการวัดประสิทธิภาพได้ด้วยตัวเอง
DataSource.getConnection()
/ Connection.close()
เดียวConnection.prepareStatement()
, Statement.execute()
, Statement.close()
เดียวการวิเคราะห์ HikariCP v2.6 เมื่อเปรียบเทียบกับพูลอื่นๆ โดยสัมพันธ์กับโหลด "ความต้องการที่เพิ่มขึ้นอย่างรวดเร็ว" ที่ไม่ซ้ำกัน
สภาพแวดล้อมของลูกค้ากำหนดให้มีต้นทุนสูงในการจัดหาการเชื่อมต่อใหม่ และเป็นข้อกำหนดสำหรับพูลที่มีขนาดไดนามิก แต่ยังต้องมีการตอบสนองเพื่อร้องขอที่เพิ่มขึ้นอย่างรวดเร็ว อ่านเกี่ยวกับการจัดการความต้องการที่เพิ่มขึ้นอย่างรวดเร็วที่นี่
AKA "สิ่งที่คุณอาจไม่รู้เกี่ยวกับการปรับขนาดพูลการเชื่อมต่อ" ชมวิดีโอจากกลุ่ม Oracle Real-world Performance และเรียนรู้ว่าเหตุใดการเชื่อมต่อฐานข้อมูลจึงไม่จำเป็นต้องมีจำนวนมากอย่างที่มักจะเป็น ในความเป็นจริง การเชื่อมต่อมากเกินไปมีผลกระทบ เชิงลบต่อ ประสิทธิภาพที่ชัดเจนและพิสูจน์ได้ ความแตกต่าง 50 เท่าในกรณีของการสาธิตของ Oracle อ่านต่อเพื่อหาคำตอบ
เราขอขอบคุณทีมงาน WIX สำหรับการเขียนบทความเชิงลึกเกี่ยวกับ HikariCP ในบล็อกวิศวกรรมของพวกเขาโดยไม่ได้ร้องขอ ลองดูถ้าคุณมีเวลา
อ่านความท้าทายพูล "ฐานข้อมูลล่ม" ที่น่าสนใจของเรา
ซอฟต์แวร์โอเพ่นซอร์สเช่น HikariCP ก็แข่งขันกันในตลาดเสรีเช่นเดียวกับผลิตภัณฑ์อื่นๆ เราเข้าใจแล้ว เราเข้าใจดีว่าความก้าวหน้าของผลิตภัณฑ์ เมื่อเปิดเผยสู่สาธารณะแล้ว มักจะได้รับความร่วมมือจากกัน และเราเข้าใจดีว่าแนวคิดสามารถเกิดขึ้นได้จากจิตวิญญาณแห่งจิตวิญญาณ พร้อมกันและเป็นอิสระ แต่ไทม์ไลน์ของนวัตกรรม โดยเฉพาะอย่างยิ่งในโครงการโอเพ่นซอร์ส ก็มีความชัดเจนเช่นกัน และเราต้องการให้ผู้ใช้ของเราเข้าใจทิศทางการไหลของนวัตกรรมในพื้นที่ของเรา การเห็นผลลัพธ์ของการคิดและการวิจัยหลายร้อยชั่วโมงที่ร่วมมือกันอย่างง่ายดายอาจเป็นเรื่องเลวร้าย และบางทีอาจเป็นสิ่งที่มีอยู่ในตลาดเสรี แต่เราไม่ได้ถูกทำให้ขวัญเสีย เรามีแรงบันดาลใจ เพื่อขยายช่องว่าง
HikariCP มาพร้อมกับค่าเริ่มต้นที่ สมเหตุสมผล ซึ่งทำงานได้ดีในการปรับใช้ส่วนใหญ่โดยไม่ต้องปรับแต่งเพิ่มเติม พร็อพเพอร์ตี้ทุกรายการเป็นทางเลือก ยกเว้น "ข้อมูลสำคัญ" ที่ทำเครื่องหมายไว้ด้านล่าง
- HikariCP ใช้มิลลิวินาทีสำหรับค่าเวลาทั้งหมด
HikariCP อาศัยตัวจับเวลาที่แม่นยำเพื่อประสิทธิภาพและความน่าเชื่อถือ จำเป็น ที่เซิร์ฟเวอร์ของคุณต้องซิงโครไนซ์กับแหล่งเวลา เช่น เซิร์ฟเวอร์ NTP โดยเฉพาะอย่างยิ่ง หากเซิร์ฟเวอร์ของคุณทำงานภายในเครื่องเสมือน ทำไม อ่านเพิ่มเติมได้ที่นี่ อย่าพึ่งพาการตั้งค่าไฮเปอร์ไวเซอร์เพื่อ "ซิงโครไนซ์" นาฬิกาของเครื่องเสมือน กำหนดค่าการซิงโครไนซ์แหล่งเวลาภายในเครื่องเสมือน หากคุณมาขอความช่วยเหลือเกี่ยวกับปัญหาที่เกิดจากการประสานเวลาไม่เพียงพอ คุณจะถูกเยาะเย้ยต่อสาธารณะบน Twitter
- dataSourceClassName
นี่คือชื่อของคลาส DataSource
ที่จัดทำโดยไดรเวอร์ JDBC ศึกษาเอกสารประกอบสำหรับไดรเวอร์ JDBC เฉพาะของคุณเพื่อรับชื่อคลาสนี้ หรือดูตารางด้านล่าง หมายเหตุ ไม่รองรับแหล่งข้อมูล XA XA ต้องการผู้จัดการธุรกรรมจริงเช่น bitronix โปรดทราบว่าคุณไม่จำเป็นต้องใช้คุณสมบัตินี้ หากคุณใช้ jdbcUrl
สำหรับการกำหนดค่าไดรเวอร์ JDBC ที่ใช้ DriverManager "old-school" ค่าเริ่มต้น: ไม่มี
- หรือ -
- jdbcUrl
คุณสมบัตินี้กำหนดให้ HikariCP ใช้การกำหนดค่า "แบบอิง DriverManager" เรารู้สึกว่าการกำหนดค่าตามแหล่งข้อมูล (ด้านบน) นั้นเหนือกว่าด้วยเหตุผลหลายประการ (ดูด้านล่าง) แต่สำหรับการปรับใช้จำนวนมาก มีความแตกต่างที่มีนัยสำคัญเพียงเล็กน้อย เมื่อใช้คุณสมบัตินี้กับไดรเวอร์ "เก่า" คุณอาจต้องตั้งค่าคุณสมบัติ driverClassName
แต่ให้ลองใช้ก่อน โปรดทราบว่าหากใช้คุณสมบัตินี้ คุณยังคงใช้คุณสมบัติ DataSource เพื่อกำหนดค่าไดรเวอร์ของคุณได้ และในความเป็นจริงแนะนำให้ใช้กับพารามิเตอร์ไดรเวอร์ที่ระบุใน URL เอง ค่าเริ่มต้น: ไม่มี
- username
คุณสมบัตินี้จะตั้งค่าชื่อผู้ใช้การรับรองความถูกต้องเริ่มต้นที่ใช้เมื่อรับ การเชื่อมต่อ จากไดรเวอร์พื้นฐาน โปรดทราบว่าสำหรับ DataSources สิ่งนี้จะทำงานในลักษณะที่กำหนดได้เองโดยการเรียก DataSource.getConnection(*username*, password)
บน DataSource พื้นฐาน อย่างไรก็ตาม สำหรับการกำหนดค่าตามไดรเวอร์ ไดรเวอร์แต่ละตัวจะแตกต่างกัน ในกรณีของไดรเวอร์ HikariCP จะใช้คุณสมบัติ username
นี้เพื่อตั้งค่าคุณสมบัติ user
ใน Properties
ที่ส่งไปยังการเรียก DriverManager.getConnection(jdbcUrl, props)
ของไดรเวอร์ หากนี่ไม่ใช่สิ่งที่คุณต้องการ ให้ข้ามวิธีนี้ไปโดยสิ้นเชิงแล้วเรียก addDataSourceProperty("username", ...)
เป็นต้น ค่าเริ่มต้น: ไม่มี
- password
คุณสมบัตินี้จะตั้งค่ารหัสผ่านการรับรองความถูกต้องเริ่มต้นซึ่งใช้เมื่อรับ การเชื่อมต่อ จากไดรเวอร์ที่เกี่ยวข้อง โปรดทราบว่าสำหรับ DataSources สิ่งนี้จะทำงานในรูปแบบที่กำหนดได้เองโดยการเรียก DataSource.getConnection(username, *password*)
บน DataSource พื้นฐาน อย่างไรก็ตาม สำหรับการกำหนดค่าตามไดรเวอร์ ไดรเวอร์แต่ละตัวจะแตกต่างกัน ในกรณีของไดรเวอร์ HikariCP จะใช้คุณสมบัติ password
นี้เพื่อตั้งค่าคุณสมบัติ password
ผ่านใน Properties
ที่ส่งไปยังการเรียก DriverManager.getConnection(jdbcUrl, props)
ของไดรเวอร์ หากนี่ไม่ใช่สิ่งที่คุณต้องการ ให้ข้ามวิธีนี้ทั้งหมดแล้วเรียก addDataSourceProperty("pass", ...)
เป็นต้น ค่าเริ่มต้น: ไม่มี
✅ autoCommit
คุณสมบัตินี้ควบคุมพฤติกรรมการยอมรับอัตโนมัติเริ่มต้นของการเชื่อมต่อที่ส่งคืนจากพูล มันเป็นค่าบูลีน ค่าเริ่มต้น: จริง
⏳ connectionTimeout
เวลา
คุณสมบัตินี้ควบคุมจำนวนมิลลิวินาทีสูงสุดที่ไคลเอนต์ (นั่นคือคุณ) จะรอการเชื่อมต่อจากพูล หากเกินเวลานี้โดยไม่มีการเชื่อมต่อให้ใช้งาน SQLException จะถูกส่งออกไป การหมดเวลาการเชื่อมต่อต่ำสุดที่ยอมรับได้คือ 250 มิลลิวินาที ค่าเริ่มต้น: 30000 (30 วินาที)
⏳ idleTimeout
คุณสมบัตินี้ควบคุมระยะเวลาสูงสุดที่การเชื่อมต่อได้รับอนุญาตให้ไม่ได้ใช้งานในพูล การตั้งค่านี้ใช้เฉพาะเมื่อมีการกำหนด minimumIdle
ให้น้อยกว่า maximumPoolSize
การเชื่อมต่อที่ไม่ได้ใช้งานจะ ไม่ ถูกยกเลิกเมื่อพูลถึงการเชื่อมต่อ minimumIdle
ไม่ว่าการเชื่อมต่อจะถูกยกเลิกเนื่องจากไม่ได้ใช้งานหรือไม่ก็ตาม ขึ้นอยู่กับความแปรผันสูงสุด +30 วินาที และการเปลี่ยนแปลงโดยเฉลี่ย +15 วินาที การเชื่อมต่อจะไม่มีวันถูกยกเลิกเนื่องจากไม่ได้ใช้งาน ก่อนหมด เวลานี้ ค่า 0 หมายความว่าการเชื่อมต่อที่ไม่ได้ใช้งานจะไม่ถูกลบออกจากพูล ค่าต่ำสุดที่อนุญาตคือ 10,000ms (10 วินาที) ค่าเริ่มต้น: 600000 (10 นาที)
⏳ keepaliveTime
คุณสมบัตินี้ควบคุมความถี่ที่ HikariCP จะพยายามรักษาการเชื่อมต่อให้คงอยู่ เพื่อป้องกันไม่ให้ฐานข้อมูลหรือโครงสร้างพื้นฐานเครือข่ายหมดเวลา ค่านี้ต้องน้อยกว่าค่า maxLifetime
"keepalive" จะเกิดขึ้นเฉพาะกับการเชื่อมต่อที่ไม่ได้ใช้งานเท่านั้น เมื่อถึงเวลาสำหรับ "keepalive" กับการเชื่อมต่อที่กำหนด การเชื่อมต่อนั้นจะถูกลบออกจากพูล "ส่ง Ping" จากนั้นจึงกลับสู่พูล 'ping' เป็นหนึ่งใน: การเรียกใช้เมธอด JDBC4 isValid()
หรือการดำเนินการของ connectionTestQuery
โดยทั่วไป ระยะเวลานอกพูลควรวัดเป็นมิลลิวินาทีหลักเดียวหรือต่ำกว่ามิลลิวินาที ดังนั้นจึงควรมีผลกระทบด้านประสิทธิภาพเพียงเล็กน้อยหรือไม่มีเลยที่สังเกตเห็นได้ ค่าต่ำสุดที่อนุญาตคือ 30,000ms (30 วินาที) แต่ค่าในช่วงนาทีเป็นที่ต้องการมากที่สุด ค่าเริ่มต้น: 120000 (2 นาที)
⏳ maxLifetime
คุณสมบัตินี้ควบคุมอายุการใช้งานสูงสุดของการเชื่อมต่อในพูล การเชื่อมต่อที่ใช้งานอยู่จะไม่มีวันถูกยกเลิก เฉพาะเมื่อปิดแล้วเท่านั้นจึงจะถูกลบออก บนพื้นฐานการเชื่อมต่อโดยการเชื่อมต่อ การลดทอนเชิงลบเล็กน้อยจะถูกนำมาใช้เพื่อหลีกเลี่ยงการสูญพันธุ์ครั้งใหญ่ในสระ เราขอแนะนำอย่างยิ่งให้ตั้งค่านี้ และควรสั้นกว่าฐานข้อมูลหรือโครงสร้างพื้นฐานใดๆ ที่กำหนดเวลาในการเชื่อมต่อหลายวินาที ค่า 0 บ่งชี้ว่าไม่มีอายุการใช้งานสูงสุด (อายุการใช้งานไม่จำกัด) ขึ้นอยู่กับการตั้งค่า idleTimeout
ค่าต่ำสุดที่อนุญาตคือ 30000ms (30 วินาที) ค่าเริ่มต้น: 1800000 (30 นาที)
- connectionTestQuery
หากไดรเวอร์ของคุณรองรับ JDBC4 เราขอแนะนำอย่างยิ่งว่าอย่าตั้งค่าคุณสมบัตินี้ นี่สำหรับไดรเวอร์ "ดั้งเดิม" ที่ไม่รองรับ JDBC4 Connection.isValid() API
นี่คือแบบสอบถามที่จะดำเนินการก่อนการเชื่อมต่อจะได้รับจากพูลเพื่อตรวจสอบว่าการเชื่อมต่อกับฐานข้อมูลยังคงมีอยู่ ลองเรียกใช้พูลโดยไม่มีคุณสมบัตินี้อีกครั้ง HikariCP จะบันทึกข้อผิดพลาดหากไดรเวอร์ของคุณไม่สอดคล้องกับ JDBC4 เพื่อแจ้งให้คุณทราบ ค่าเริ่มต้น: ไม่มี
- minimumIdle
คุณสมบัตินี้ควบคุมจำนวน การเชื่อมต่อที่ไม่ได้ใช้งาน ขั้นต่ำที่ HikariCP พยายามรักษาไว้ในพูล หากการเชื่อมต่อที่ไม่ได้ใช้งานลดลงต่ำกว่าค่านี้และการเชื่อมต่อทั้งหมดในพูลน้อยกว่า maximumPoolSize
HikariCP จะพยายามอย่างดีที่สุดเพื่อเพิ่มการเชื่อมต่อเพิ่มเติมอย่างรวดเร็วและมีประสิทธิภาพ อย่างไรก็ตาม เพื่อประสิทธิภาพสูงสุดและการตอบสนองต่อความต้องการที่เพิ่มขึ้น เราขอแนะนำว่า อย่า ตั้งค่านี้ และอนุญาตให้ HikariCP ทำหน้าที่เป็นพูลการเชื่อมต่อ ขนาดคงที่แทน ค่าเริ่มต้น: เหมือนกับ maximumPoolSize
- maximumPoolSize
คุณสมบัตินี้ควบคุมขนาดสูงสุดที่พูลสามารถเข้าถึงได้ รวมถึงการเชื่อมต่อทั้งที่ไม่ได้ใช้งานและที่ใช้งานอยู่ โดยพื้นฐานแล้วค่านี้จะกำหนดจำนวนสูงสุดของการเชื่อมต่อจริงไปยังแบ็กเอนด์ฐานข้อมูล ค่าที่สมเหตุสมผลสำหรับสิ่งนี้จะพิจารณาจากสภาพแวดล้อมการดำเนินการของคุณดีที่สุด เมื่อพูลถึงขนาดนี้ และไม่มีการเชื่อมต่อที่ไม่ได้ใช้งาน การเรียก getConnection() จะบล็อกสูงสุดเป็นมิลลิวินาทีใน connectionTimeout
ก่อนที่จะหมดเวลา โปรดอ่านเกี่ยวกับขนาดสระว่ายน้ำ ค่าเริ่มต้น: 10
- metricRegistry
คุณสมบัตินี้ใช้ได้เฉพาะผ่านการกำหนดค่าแบบเป็นโปรแกรมหรือคอนเทนเนอร์ IoC เท่านั้น คุณสมบัตินี้อนุญาตให้คุณระบุอินสแตนซ์ของ Codahale/Dropwizard MetricRegistry
ที่จะใช้โดยพูลเพื่อบันทึกเมทริกต่างๆ ดูหน้าวิกิการวัดสำหรับรายละเอียด ค่าเริ่มต้น: ไม่มี
- healthCheckRegistry
คุณสมบัตินี้ใช้ได้เฉพาะผ่านการกำหนดค่าแบบเป็นโปรแกรมหรือคอนเทนเนอร์ IoC เท่านั้น คุณสมบัตินี้ช่วยให้คุณสามารถระบุอินสแตนซ์ของ Codahale/Dropwizard HealthCheckRegistry
ที่จะใช้โดยพูลเพื่อรายงานข้อมูลสุขภาพปัจจุบัน ดูหน้าวิกิการตรวจสุขภาพเพื่อดูรายละเอียด ค่าเริ่มต้น: ไม่มี
- poolName
คุณสมบัตินี้แทนชื่อที่ผู้ใช้กำหนดสำหรับพูลการเชื่อมต่อ และปรากฏเป็นหลักในการบันทึกและคอนโซลการจัดการ JMX เพื่อระบุพูลและคอนฟิกูเรชันพูล ค่าเริ่มต้น: สร้างขึ้นอัตโนมัติ
⏳ initializationFailTimeout
คุณสมบัตินี้ควบคุมว่าพูลจะ "ล้มเหลวอย่างรวดเร็ว" หรือไม่ หากไม่สามารถเริ่มต้นพูลด้วยการเชื่อมต่อเริ่มต้นได้สำเร็จ จำนวนบวกใดๆ จะถือเป็นจำนวนมิลลิวินาทีในการพยายามรับการเชื่อมต่อเริ่มต้น เธรดแอปพลิเคชันจะถูกบล็อกในช่วงเวลานี้ หากไม่สามารถรับการเชื่อมต่อก่อนที่จะหมดเวลานี้ ข้อยกเว้นจะถูกส่งออกไป การหมดเวลานี้จะมีผล หลังจาก ช่วงระยะเวลา connectionTimeout
หากค่าเป็นศูนย์ (0) HikariCP จะพยายามรับและตรวจสอบการเชื่อมต่อ หากได้รับการเชื่อมต่อ แต่ไม่ผ่านการตรวจสอบ จะมีข้อยกเว้นเกิดขึ้นและพูลไม่เริ่มทำงาน อย่างไรก็ตาม หากไม่สามารถรับการเชื่อมต่อได้ พูลจะเริ่มทำงาน แต่ความพยายามในการรับการเชื่อมต่อในภายหลังอาจล้มเหลว ค่าที่น้อยกว่าศูนย์จะข้ามความพยายามในการเชื่อมต่อครั้งแรก และพูลจะเริ่มทำงานทันทีในขณะที่พยายามรับการเชื่อมต่อในเบื้องหลัง ดังนั้น ความพยายามในภายหลังเพื่อให้ได้การเชื่อมต่ออาจล้มเหลว ค่าเริ่มต้น: 1
❌ isolateInternalQueries
คุณสมบัตินี้กำหนดว่า HikariCP แยกการสืบค้นพูลภายใน เช่น การทดสอบการเชื่อมต่อที่ใช้งานจริง ในธุรกรรมของตนเองหรือไม่ เนื่องจากโดยทั่วไปแล้วเป็นการสืบค้นแบบอ่านอย่างเดียว จึงแทบไม่จำเป็นต้องสรุปไว้ในธุรกรรมของตนเอง คุณสมบัตินี้ใช้เฉพาะในกรณีที่ autoCommit
ถูกปิดใช้งาน ค่าเริ่มต้น: เท็จ
❌ allowPoolSuspension
คุณสมบัตินี้ควบคุมว่าพูลสามารถถูกระงับและดำเนินการต่อผ่าน JMX ได้หรือไม่ สิ่งนี้มีประโยชน์สำหรับสถานการณ์การทำงานอัตโนมัติเมื่อเกิดข้อผิดพลาดบางอย่าง เมื่อพูลถูกระงับ การเรียกไปยัง getConnection()
จะ ไม่ หมดเวลา และจะถูกพักไว้จนกว่าพูลจะกลับมาทำงานต่อ ค่าเริ่มต้น: เท็จ
❗ readOnly
คุณสมบัตินี้ควบคุมว่า การเชื่อมต่อ ที่ได้รับจากพูลอยู่ในโหมดอ่านอย่างเดียวตามค่าเริ่มต้นหรือไม่ โปรดทราบว่าฐานข้อมูลบางแห่งไม่สนับสนุนแนวคิดของโหมดอ่านอย่างเดียว ในขณะที่ฐานข้อมูลอื่นๆ จะมีการเพิ่มประสิทธิภาพคิวรีเมื่อตั้งค่า การเชื่อม ต่อเป็นแบบอ่านอย่างเดียว ไม่ว่าคุณจะต้องการคุณสมบัตินี้หรือไม่นั้นจะขึ้นอยู่กับแอปพลิเคชันและฐานข้อมูลของคุณเป็นส่วนใหญ่ ค่าเริ่มต้น: เท็จ
❗ registerMbeans
คุณสมบัตินี้ควบคุมว่า JMX Management Beans ("MBeans") ได้รับการลงทะเบียนหรือไม่ ค่าเริ่มต้น: เท็จ
- catalog
คุณสมบัตินี้จะตั้ง ค่าแค็ตตาล็อก เริ่มต้นสำหรับฐานข้อมูลที่รองรับแนวคิดของแค็ตตาล็อก หากไม่ได้ระบุคุณสมบัตินี้ จะใช้แค็ตตาล็อกดีฟอลต์ที่กำหนดโดยไดรเวอร์ JDBC ค่าเริ่มต้น: ค่าเริ่มต้นของไดรเวอร์
- connectionInitSql
คุณสมบัตินี้ตั้งค่าคำสั่ง SQL ที่จะดำเนินการหลังจากสร้างการเชื่อมต่อใหม่ทุกครั้งก่อนที่จะเพิ่มลงในพูล หาก SQL นี้ไม่ถูกต้องหรือมีข้อผิดพลาดเกิดขึ้น จะถือว่าการเชื่อมต่อล้มเหลว และตรรกะการลองใหม่มาตรฐานจะตามมา ค่าเริ่มต้น: ไม่มี
- driverClassName
HikariCP จะพยายามแก้ไขไดรเวอร์ผ่าน DriverManager โดยยึดตาม jdbcUrl
แต่เพียงผู้เดียว แต่สำหรับไดรเวอร์รุ่นเก่าบางรุ่น จะต้องระบุ driverClassName
ด้วย ละเว้นคุณสมบัตินี้เว้นแต่คุณจะได้รับข้อความแสดงข้อผิดพลาดที่ชัดเจนว่าไม่พบไดรเวอร์ ค่าเริ่มต้น: ไม่มี
- transactionIsolation
คุณสมบัตินี้ควบคุมระดับการแยกธุรกรรมเริ่มต้นของการเชื่อมต่อที่ส่งคืนจากพูล หากไม่ได้ระบุคุณสมบัตินี้ ระบบจะใช้ระดับการแยกธุรกรรมดีฟอลต์ที่กำหนดโดยไดรเวอร์ JDBC ใช้พร็อพเพอร์ตี้นี้เฉพาะในกรณีที่คุณมีข้อกำหนดการแยกเฉพาะซึ่งเป็นเรื่องปกติสำหรับการค้นหาทั้งหมด ค่าของคุณสมบัตินี้เป็นชื่อคงที่จากคลาส Connection
เช่น TRANSACTION_READ_COMMITTED
, TRANSACTION_REPEATABLE_READ
เป็นต้น ค่าเริ่มต้น: ค่าเริ่มต้นของไดรเวอร์
⏳ validationTimeout
คุณสมบัตินี้ควบคุมระยะเวลาสูงสุดที่การเชื่อมต่อจะถูกทดสอบเพื่อความมีชีวิตชีวา ค่านี้ต้องน้อยกว่า connectionTimeout
การหมดเวลาการตรวจสอบต่ำสุดที่ยอมรับได้คือ 250 มิลลิวินาที ค่าเริ่มต้น: 5000
⏳ เกณฑ์ leakDetectionThreshold
คุณสมบัตินี้ควบคุมระยะเวลาที่การเชื่อมต่อสามารถออกจากพูลได้ก่อนที่จะบันทึกข้อความซึ่งบ่งชี้ว่าการเชื่อมต่ออาจรั่วไหล ค่า 0 หมายถึงปิดใช้งานการตรวจจับการรั่วไหล ค่าต่ำสุดที่ยอมรับได้สำหรับการเปิดใช้งานการตรวจจับการรั่วไหลคือ 2000 (2 วินาที) ค่าเริ่มต้น: 0
➡ dataSource
คุณสมบัตินี้ใช้ได้เฉพาะผ่านการกำหนดค่าแบบเป็นโปรแกรมหรือคอนเทนเนอร์ IoC เท่านั้น คุณสมบัตินี้ช่วยให้คุณสามารถตั้งค่าอินสแตนซ์ของ DataSource
ที่จะห่อโดยพูลได้โดยตรง แทนที่จะให้ HikariCP สร้างมันผ่านการสะท้อนกลับ สิ่งนี้มีประโยชน์ในเฟรมเวิร์กการฉีดการขึ้นต่อกันบางเฟรมเวิร์ก เมื่อมีการระบุคุณสมบัตินี้ คุณสมบัติ dataSourceClassName
และคุณสมบัติเฉพาะแหล่งข้อมูลทั้งหมดจะถูกละเว้น ค่าเริ่มต้น: ไม่มี
- schema
คุณสมบัตินี้จะตั้ง ค่าสคี มาเริ่มต้นสำหรับฐานข้อมูลที่สนับสนุนแนวคิดของสคีมา หากไม่ได้ระบุคุณสมบัตินี้ ระบบจะใช้สกีมาดีฟอลต์ที่กำหนดโดยไดรเวอร์ JDBC ค่าเริ่มต้น: ค่าเริ่มต้นของไดรเวอร์
➡ threadFactory
คุณสมบัตินี้ใช้ได้เฉพาะผ่านการกำหนดค่าแบบเป็นโปรแกรมหรือคอนเทนเนอร์ IoC เท่านั้น คุณสมบัตินี้อนุญาตให้คุณตั้งค่าอินสแตนซ์ของ java.util.concurrent.ThreadFactory
ที่จะใช้สำหรับการสร้างเธรดทั้งหมดที่ใช้โดยพูล จำเป็นในสภาพแวดล้อมการดำเนินการที่มีข้อจำกัดบางประการ ซึ่งสามารถสร้างเธรดได้ผ่าน ThreadFactory
ที่คอนเทนเนอร์ของแอปพลิเคชันจัดเตรียมไว้ให้เท่านั้น ค่าเริ่มต้น: ไม่มี
➡ scheduledExecutor
คุณสมบัตินี้ใช้ได้เฉพาะผ่านการกำหนดค่าแบบเป็นโปรแกรมหรือคอนเทนเนอร์ IoC เท่านั้น คุณสมบัตินี้อนุญาตให้คุณตั้งค่าอินสแตนซ์ของ java.util.concurrent.ScheduledExecutorService
ที่จะใช้สำหรับงานที่กำหนดเวลาไว้ภายในต่างๆ หากจัดหา HikariCP ด้วยอินสแตนซ์ ScheduledThreadPoolExecutor
ขอแนะนำให้ใช้ setRemoveOnCancelPolicy(true)
ค่าเริ่มต้น: ไม่มี
➡ exceptionOverride
คุณสมบัตินี้ใช้ได้เฉพาะผ่านการกำหนดค่าแบบเป็นโปรแกรมหรือคอนเทนเนอร์ IoC เท่านั้น คุณสมบัตินี้ช่วยให้คุณสามารถตั้งค่าอินสแตนซ์ของคลาสโดยใช้อินเทอร์เฟซ com.zaxxer.hikari.SQLExceptionOverride
ซึ่งจะถูกเรียกก่อนที่การเชื่อมต่อจะถูกถอดออกจากพูลเนื่องจากเงื่อนไขข้อยกเว้นเฉพาะ โดยทั่วไป เมื่อ SQLException
ถูกส่งออกไป การเชื่อมต่อจะถูกไล่ออกจากพูลเมื่อมี SQLStates หรือ ErrorCodes เฉพาะเจาะจงอยู่ เมธอด adjudicate()
จะถูกเรียกใช้บนอินสแตนซ์ SQLExceptionOverride
ซึ่งอาจส่งคืนหนึ่งใน: Override.CONTINUE_EVICT
Override.DO_NOT_EVICT
หรือ Override.MUST_EVICT
ยกเว้นในกรณีที่เจาะจงมาก ควรส่งคืน Override.CONTINUE_EVICT
โดยอนุญาตให้ตรรกะการขับไล่/ไม่มีการขับไล่เริ่มต้นดำเนินการได้ ค่าเริ่มต้น: ไม่มี
- exceptionOverrideClassName
คุณสมบัตินี้ช่วยให้คุณสามารถระบุชื่อของคลาสที่ผู้ใช้ระบุซึ่งใช้อินเทอร์เฟซ com.zaxxer.hikari.SQLExceptionOverride
อินสแตนซ์ของคลาสจะถูกสร้างอินสแตนซ์โดยพูลเพื่อตัดสินการถอดการเชื่อมต่อ ดูคุณสมบัติด้านบน exceptionOverride
สำหรับคำอธิบายแบบเต็ม ค่าเริ่มต้น: ไม่มี
HikariCP มี "ปุ่ม" มากมายให้หมุนดังที่คุณเห็นด้านบน แต่ก็น้อยกว่าพูลอื่นๆ บางอัน นี่คือปรัชญาการออกแบบ สุนทรียภาพของการออกแบบ HikariCP คือความเรียบง่าย เพื่อให้สอดคล้องกับปรัชญาการออกแบบ ที่เรียบง่ายจะดีกว่า หรือ น้อยกว่า แกนการกำหนดค่าบางส่วนจึงถูกละทิ้งโดยเจตนา
พูลการเชื่อมต่อจำนวนมาก รวมถึง Apache DBCP, Vibur, c3p0 และอื่นๆ เสนอการแคช PreparedStatement
ฮิคาริซีพีไม่มี ทำไม
ที่พูลการเชื่อมต่อเลเยอร์ PreparedStatements
สามารถแคชได้ ต่อการเชื่อมต่อ เท่านั้น หากแอปพลิเคชันของคุณมีการสืบค้นที่ดำเนินการทั่วไป 250 รายการและกลุ่มการเชื่อมต่อ 20 รายการ คุณกำลังขอให้ฐานข้อมูลของคุณมีแผนการดำเนินการสืบค้นถึง 5,000 รายการ และในทำนองเดียวกัน พูลจะต้องแคช PreparedStatements
จำนวนมากนี้และกราฟของออบเจ็กต์ที่เกี่ยวข้อง
ไดรเวอร์ JDBC ฐานข้อมูลหลักส่วนใหญ่มีแคชคำสั่งที่สามารถกำหนดค่าได้แล้ว รวมถึง PostgreSQL, Oracle, Derby, MySQL, DB2 และอื่นๆ อีกมากมาย ไดรเวอร์ JDBC อยู่ในตำแหน่งที่ไม่เหมือนใครในการใช้ประโยชน์จากคุณลักษณะเฉพาะของฐานข้อมูล และการใช้งานแคชเกือบทั้งหมดสามารถแชร์แผนการดำเนินการ ผ่านการเชื่อมต่อได้ ซึ่งหมายความว่า แทนที่จะมีคำสั่ง 5,000 รายการในหน่วยความจำและแผนการดำเนินการที่เกี่ยวข้อง การสืบค้นที่ดำเนินการทั่วไป 250 รายการของคุณส่งผลให้เกิดแผนการดำเนินการ 250 รายการในฐานข้อมูล การใช้งานที่ชาญฉลาดไม่ได้เก็บวัตถุ PreparedStatement
ไว้ในหน่วยความจำที่ระดับไดรเวอร์ แต่เพียงแนบอินสแตนซ์ใหม่เข้ากับรหัสแผนที่มีอยู่แทน
การใช้แคชคำสั่งที่เลเยอร์การรวมกลุ่มถือเป็นรูปแบบที่ต่อต้าน และจะส่งผลเสียต่อประสิทธิภาพของแอปพลิเคชันของคุณเมื่อเปรียบเทียบกับแคชที่ไดรเวอร์ให้มา
เช่นเดียวกับการแคชใบแจ้งยอด ผู้จำหน่ายฐานข้อมูลหลักส่วนใหญ่สนับสนุนการบันทึกใบแจ้งยอดผ่านคุณสมบัติของไดรเวอร์ของตนเอง ซึ่งรวมถึง Oracle, MySQL, Derby, MSSQL และอื่นๆ บางตัวยังรองรับการบันทึกข้อความค้นหาที่ช้าอีกด้วย สำหรับฐานข้อมูลบางส่วนที่ไม่รองรับ มีหลายตัวเลือกให้เลือก เราได้รับรายงานว่า p6spy ทำงานได้ดี และยังทราบถึงความพร้อมใช้งานของ log4jdbc และ jdbcdslog-exp
โปรดอ่านคู่มือการกู้คืนอย่างรวดเร็วสำหรับรายละเอียดเกี่ยวกับวิธีกำหนดค่าไดรเวอร์และระบบของคุณเพื่อการกู้คืนที่เหมาะสมจากการรีสตาร์ทฐานข้อมูลและเหตุการณ์พาร์ติชันเครือข่าย
คุณสามารถใช้คลาส HikariConfig
ได้ 1 :
HikariConfig config = new HikariConfig ();
config . setJdbcUrl ( "jdbc:mysql://localhost:3306/simpsons" );
config . setUsername ( "bart" );
config . setPassword ( "51mp50n" );
config . addDataSourceProperty ( "cachePrepStmts" , "true" );
config . addDataSourceProperty ( "prepStmtCacheSize" , "250" );
config . addDataSourceProperty ( "prepStmtCacheSqlLimit" , "2048" );
HikariDataSource ds = new HikariDataSource ( config );
1 ตัวอย่างเฉพาะ MySQL ห้ามคัดลอกคำต่อคำ
หรือสร้างอินสแตนซ์ HikariDataSource
โดยตรงดังนี้:
HikariDataSource ds = new HikariDataSource ();
ds . setJdbcUrl ( "jdbc:mysql://localhost:3306/simpsons" );
ds . setUsername ( "bart" );
ds . setPassword ( "51mp50n" );
...
หรือไฟล์คุณสมบัติตาม:
// Examines both filesystem and classpath for .properties file
HikariConfig config = new HikariConfig ( "/some/path/hikari.properties" );
HikariDataSource ds = new HikariDataSource ( config );
ตัวอย่างไฟล์คุณสมบัติ:
dataSourceClassName =org.postgresql.ds.PGSimpleDataSource
dataSource.user =test
dataSource.password =test
dataSource.databaseName =mydb
dataSource.portNumber =5432
dataSource.serverName =localhost
หรือ java.util.Properties
ตาม:
Properties props = new Properties ();
props . setProperty ( "dataSourceClassName" , "org.postgresql.ds.PGSimpleDataSource" );
props . setProperty ( "dataSource.user" , "test" );
props . setProperty ( "dataSource.password" , "test" );
props . setProperty ( "dataSource.databaseName" , "mydb" );
props . put ( "dataSource.logWriter" , new PrintWriter ( System . out ));
HikariConfig config = new HikariConfig ( props );
HikariDataSource ds = new HikariDataSource ( config );
นอกจากนี้ยังมีคุณสมบัติระบบ hikaricp.configurationFile
ซึ่งสามารถใช้เพื่อระบุตำแหน่งของไฟล์คุณสมบัติ หากคุณต้องการใช้ตัวเลือกนี้ ให้สร้างอินสแตนซ์ HikariConfig
หรือ HikariDataSource
โดยใช้ตัวสร้างเริ่มต้น จากนั้นไฟล์คุณสมบัติจะถูกโหลด
เคล็ดลับประสิทธิภาพ MySQL
เราแนะนำให้ใช้ dataSourceClassName
แทน jdbcUrl
แต่ก็ยอมรับได้ เราจะพูดอีกครั้งว่า เป็นที่ยอมรับ
หมายเหตุ: ผู้ใช้ที่กำหนดค่าอัตโนมัติของ Spring Boot คุณต้องใช้การกำหนดค่าตาม jdbcUrl
เป็นที่ทราบกันว่า MySQL DataSource ใช้งานไม่ได้เนื่องจากการสนับสนุนการหมดเวลาของเครือข่าย ใช้การกำหนดค่า jdbcUrl
แทน
นี่คือรายการคลาส JDBC DataSource สำหรับฐานข้อมูลยอดนิยม:
ฐานข้อมูล | คนขับ | คลาส แหล่งข้อมูล |
---|---|---|
อาปาเช่ดาร์บี้ | ดาร์บี้ | org.apache.derby.jdbc.ClientDataSource |
ไฟร์เบิร์ด | เจย์เบิร์ด | org.firebirdsql.ds.FBSimpleDataSource |
Google สแปนเนอร์ | ประแจ | com.google.cloud.spanner.jdbc.JdbcDriver |
H2 | H2 | org.h2.jdbcx.JdbcDataSource |
HSQLDB | HSQLDB | org.hsqldb.jdbc.JDBCDataSource |
ไอบีเอ็ม DB2 | ไอบีเอ็ม เจซีซี | com.ibm.db2.jcc.DB2SimpleDataSource |
ไอบีเอ็ม อินฟอร์มิกซ์ | ไอบีเอ็ม อินฟอร์มิกซ์ | com.informix.jdbcx.IfxDataSource |
เอ็มเอส SQL เซิร์ฟเวอร์ | ไมโครซอฟต์ | com.microsoft.sqlserver.jdbc.SQLServerDataSource |
คอนเนคเตอร์/เจ | ||
มาเรียดีบี | มาเรียดีบี | org.mariadb.jdbc.MariaDbDataSource |
ออราเคิล | ออราเคิล | oracle.jdbc.pool.OracleDataSource |
โอเรียนท์ดีบี | โอเรียนท์ดีบี | com.orienttechnologies.orient.jdbc.OrientDataSource |
PostgreSQL | pgjdbc-ng | com.impossibl.postgres.jdbc.PGDataSource |
PostgreSQL | PostgreSQL | org.postgresql.ds.PGSimpleDataSource |
เอสเอพี แม็กซ์ดีบี | เอสเอพี | com.sap.dbtech.jdbc.DriverSapDB |
SQLite | ซีเรียล | org.sqlite.SQLiteDataSource |
ซีเบส | เจเชื่อมต่อ | com.sybase.jdbc4.jdbc.SybDataSource |
หมายเหตุ Play 2.4 ตอนนี้ใช้ HikariCP เป็นค่าเริ่มต้น มีปลั๊กอินใหม่สำหรับเฟรมเวิร์ก Play; เล่น-hikaricp. หากคุณใช้เฟรมเวิร์ก Play ที่ยอดเยี่ยม แอปพลิเคชันของคุณสมควรได้รับ HikariCP ขอบคุณทีม Edulify!
tomekw ได้สร้างเครื่องห่อ Clojure ใหม่แล้ว และสามารถพบได้ที่นี่
tomekw ได้สร้าง wrapper JRuby ใหม่แล้ว และสามารถพบได้ที่นี่
กลุ่มสนทนาของ Google HikariCP ที่นี่ กำลังเพิ่มคำถามที่พบบ่อย
อย่าลืม Wiki สำหรับข้อมูลเพิ่มเติมเช่น:
⇒ Java 8+ (สิ่งประดิษฐ์ Java 6/7 อยู่ในโหมดบำรุงรักษา)
⇒ ไลบรารี slf4j
โปรเจ็กต์ที่มีประสิทธิภาพสูงไม่สามารถมีเครื่องมือมากเกินไปได้! เราขอขอบคุณบริษัทดังต่อไปนี้:
ขอขอบคุณ ej-technologies สำหรับ JProfiler ซึ่งเป็นผู้สร้างโปรไฟล์แบบออลอินวันที่ยอดเยี่ยม
YourKit รองรับโครงการโอเพ่นซอร์สด้วย Java Profiler ที่มีฟีเจอร์ครบถ้วน คลิกโลโก้ YourKit ด้านล่างเพื่อเรียนรู้เพิ่มเติม
โปรดดำเนินการเปลี่ยนแปลงและส่งคำขอดึงจากสาขา dev
แทน master
โปรดตั้งค่าโปรแกรมแก้ไขให้ใช้ช่องว่างแทนแท็บ และยึดตามรูปแบบที่ชัดเจนของโค้ดที่คุณกำลังแก้ไข สาขา dev
นั้น "เป็นปัจจุบัน" มากกว่า master
เสมอ หากคุณต้องการใช้ชีวิตที่ไร้ขอบเขต