เชื่อมต่อด้วยทรานแซกเตอร์
ตั้งค่าการเข้าถึงฐานข้อมูล
เชื่อมต่อด้วยทรานแซกเตอร์ เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
Transactor คืออะไร
Doobie เป็นชั้น JDBC เชิงฟังก์ชันล้วนสำหรับ Scala โดย Transactor[F] เป็นสะพานเชื่อมระหว่างโปรแกรมบริสุทธิ์ของ Doobie กับการเชื่อมต่อฐานข้อมูลจริง
Transactor รู้วิธีจัดหาการเชื่อมต่อ JDBC Connection เรียกใช้โปรแกรมภายในธุรกรรม และปล่อยทรัพยากรอย่างปลอดภัย
ชนิดนี้รับพารามิเตอร์เป็นชนิดเอฟเฟกต์ F[_] เช่น cats.effect.IO
import doobie._
import cats.effect.IO
val xa: Transactor[IO] = ???โปรแกรม ConnectionIO
คำสั่งสอบถามของ Doobie เป็นค่าชนิด ConnectionIO[A] ซึ่งอธิบายการคำนวณที่ต้องใช้การเชื่อมต่อ JDBC แต่ยังไม่ทำงานในทันที
คุณสร้างโปรแกรมเหล่านี้แบบบริสุทธิ์ แล้วส่งให้ Transactor เป็นผู้เรียกใช้ ฐานข้อมูลจะยังไม่ถูกแตะต้องจนกว่าคุณจะสั่งให้ทำงาน
import doobie.implicits._
val program: ConnectionIO[Int] =
sql"select 42".query[Int].uniqueDriverManagerTransactor
Transactor ที่เรียบง่ายที่สุดคือ Transactor.fromDriverManager ซึ่งเปิดการเชื่อมต่อใหม่เอี่ยมสำหรับทุกธุรกรรมโดยใช้ DriverManager ของ JDBC
ต้องระบุชื่อคลาสไดรเวอร์ URL ของ JDBC ชื่อผู้ใช้ และรหัสผ่าน เหมาะสำหรับการทดสอบและสคริปต์ แต่ไม่มีการรวมการเชื่อมต่อ
val xa = Transactor.fromDriverManager[IO](
driver = "org.postgresql.Driver",
url = "jdbc:postgresql://localhost:5432/app",
user = "postgres",
password = "secret",
logHandler = None
)การเรียกใช้โปรแกรม
หากต้องการเรียกใช้ ConnectionIO ให้เรียก .transact(xa) ซึ่งจะให้ผลลัพธ์เป็น F[A] หรือในกรณีนี้คือ IO[A]
Transactor จะครอบโปรแกรมไว้ในธุรกรรม โดยยืนยันธุรกรรมเมื่อสำเร็จและย้อนกลับเมื่อเกิดข้อผิดพลาด พร้อมปล่อยการเชื่อมต่อไม่ว่าผลลัพธ์จะเป็นอย่างไร
import doobie.implicits._
val result: IO[Int] =
sql"select 42".query[Int].unique.transact(xa)การรวมการเชื่อมต่อด้วย HikariCP
สำหรับการใช้งานจริง คุณควรใช้กลุ่มการเชื่อมต่อ Doobie มี HikariTransactor ซึ่งทำงานบน HikariCP
สิ่งนี้ถูกสร้างเป็น Resource เพื่อให้กลุ่มการเชื่อมต่อปิดลงอย่างเรียบร้อย นอกจากนี้คุณต้องส่งบริบทการทำงานสำหรับการดำเนินการ JDBC ที่หยุดรอ
import doobie.hikari.HikariTransactor
import cats.effect.IO
val xaRes: Resource[IO, HikariTransactor[IO]] =
HikariTransactor.newHikariTransactor[IO](
"org.postgresql.Driver",
"jdbc:postgresql://localhost/app",
"postgres", "secret",
connectEC
)เหตุใดจึงต้องใช้ Resource
Transactor ที่ใช้กลุ่มการเชื่อมต่อเป็นเจ้าของสถานะที่มีอายุยาวนาน ได้แก่ การเชื่อมต่อที่เปิดอยู่และเธรดเบื้องหลัง Resource[F, A] รับประกันว่าการจัดหาและการปล่อยจะเกิดเป็นคู่ แม้เกิดข้อผิดพลาดหรือการยกเลิก
โดยทั่วไปคุณจะสร้าง Transactor หนึ่งครั้งเมื่อเริ่มต้นระบบ แล้วใช้ซ้ำตลอดอายุการทำงานของแอปพลิเคชัน
xaRes.use { xa =>
program.transact(xa)
}กลุ่ม connectEC
HikariCP ต้องใช้ ExecutionContext เพื่อรอการเชื่อมต่อจากกลุ่ม Doobie จัดเตรียม ExecutionContexts.fixedThreadPool สำหรับงานนี้ ซึ่งตัวมันเองเป็น Resource
การแยกส่วนนี้ออกจากกลุ่มคำนวณจะป้องกันไม่ให้การจัดหาการเชื่อมต่อที่หยุดรอแย่งทรัพยากรจากงานที่ใช้ CPU
import doobie.util.ExecutionContexts
val poolRes =
for {
ec <- ExecutionContexts.fixedThreadPool[IO](8)
xa <- HikariTransactor.newHikariTransactor[IO](
"org.postgresql.Driver", url, user, pass, ec)
} yield xaการกำหนดค่า DataSource ที่มีอยู่แล้ว
หากคุณมี javax.sql.DataSource ที่กำหนดค่าไว้แล้ว เช่น อินสแตนซ์ Hikari ที่ปรับแต่งมาอย่างเหมาะสม ให้ครอบโดยตรงด้วย Transactor.fromDataSource
วิธีนี้ใช้กันทั่วไปเมื่อเฟรมเวิร์กเป็นผู้จัดการกลุ่มการเชื่อมต่อ และคุณต้องการให้ Doobie นำกลุ่มนั้นไปใช้เท่านั้น
val xa = Transactor.fromDataSource[IO](
dataSource = myDataSource,
connectEC = connectEC
)การทดสอบการเชื่อมต่อเบื้องต้น
การตรวจสอบสุขภาพอย่างง่ายคือเรียกใช้ select 1 ผ่าน Transactor หากมีผลลัพธ์กลับมา แสดงว่าไดรเวอร์ URL และข้อมูลรับรองของคุณทำงานถูกต้องทั้งหมด
นี่เป็นขั้นตอนแรกที่ดี ก่อนเชื่อมต่อคำสั่งสอบถามจริง
val check: IO[Int] =
sql"select 1".query[Int].unique.transact(xa)
// check.unsafeRunSync() == 1ภายใน Transactor: กลยุทธ์
Transactor สร้างจากตัวแปลความหมายและ Strategy โดย Strategy จะควบคุมสิ่งที่เกิดขึ้นรอบธุรกรรมแต่ละรายการ ได้แก่ before, after, oops (เมื่อเกิดข้อผิดพลาด) และ always
กลยุทธ์เริ่มต้นจะปิดการยืนยันอัตโนมัติ ยืนยันหลังทำงานสำเร็จ ย้อนกลับเมื่อเกิดข้อผิดพลาด และปิดการเชื่อมต่อทุกครั้ง
import doobie.util.transactor.Strategy
val noCommit = xa.copy(
strategy0 = Strategy.default.copy(after = doobie.free.connection.unit)
)การบันทึกและการสังเกตระบบ
Doobie สามารถบันทึกคำสั่งทุกคำสั่ง อาร์กิวเมนต์ และระยะเวลาได้ ในรุ่นสมัยใหม่จะผูก LogHandler[F] ต่อคำสั่งสอบถาม แทนที่จะผูกต่อตัว Transactor
ความสามารถนี้มีประโยชน์อย่างยิ่งสำหรับค้นหาคำสั่งสอบถามที่ทำงานช้าและตรวจสอบการผูกพารามิเตอร์ในระบบจริง
import doobie.util.log._
val handler: LogHandler[IO] = (ev: LogEvent) =>
IO.println(ev.sql)ตรวจสอบอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับ Transactor
สรุป
Transactor[F] เชื่อมโปรแกรม ConnectionIO แบบบริสุทธิ์เข้ากับฐานข้อมูลจริง fromDriverManager เหมาะกับการทดสอบ ส่วน HikariTransactor และ fromDataSource เหมาะกับการใช้งานจริงผ่านการรวมการเชื่อมต่อ
สร้าง Transactor ที่ใช้กลุ่มการเชื่อมต่อเป็น Resource เรียกใช้โปรแกรมด้วย .transact(xa) และให้ Strategy เริ่มต้นจัดการการยืนยัน การย้อนกลับ และการล้างทรัพยากร
เรียนรู้ Scala ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 39
- บทเรียน
- 143
คำถามที่พบบ่อย
บทเรียน “เชื่อมต่อด้วยทรานแซกเตอร์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เชื่อมต่อด้วยทรานแซกเตอร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เชื่อมต่อด้วยทรานแซกเตอร์”
ตั้งค่าการเข้าถึงฐานข้อมูล คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “เชื่อมต่อด้วยทรานแซกเตอร์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม
ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เชื่อมต่อด้วยทรานแซกเตอร์
- เรียกใช้คำสั่งค้นหา
- การแทรกและอัปเดต
- ประกอบธุรกรรม