DriverManager VS DataSource
ถ้าดูตอนการทำงานเชื่อมต่อกับ database จะเห็นว่ามี 2 concept คือ DriverManager และ Data Source ถ้าเราใช้ Sql.newInstance method จะเป็นการใช้ DriverManager แต่ถึงแม้เราจะมี DriverManager แล้ว แต่เพื่อการจัดการประสิทธิภาพที่ดีกว่าเราควรใช้ DataSource เพราะมันมีการจัดการการเชื่อมต่อกับ database ที่ดีกว่าโดยใช้ connect pool (แหล่งเก็บ connection ที่ใช้เชื่อมต่อกับ database) และรองรับ distributed transaction และเรายังสามารถนำ connect นี้กลับมาใช้ใหม่ได้อีก (reuse) เพราะเมื่อแต่ละ transaction ทำงานเสร็จก็จะมีการคืน connect กลับมาที่ pool แต่ถ้าเราลืมคืน connection ตัว Groovy จะเป็นคืน transaction ให้เอง
DataSource จึงกลายมาเป็นส่วนสำคัญเมื่อต้องการจัดการกับทรัพยากรที่มีอยู่อย่างจำกัดให้เกิดประโยชน์สูงสุด เช่นใน application server ก็มีการจัดการทรัพยากรใน application ของตัวเองที่เป็น connection pool
ใน Groovy เราสามารถใช้ datasource ได้ โดยขึ้นอยู่กับ database vendor แต่ละเจ้าซึ่งจะ implement ไว้ที่ javax.sql.DataSource แต่ HSQL มีเตรียมไว้ที่ org.hsqldb.jdbc.jdbcDataSource ตัวอย่างการเชื่อมต่อฐานข้อมูลด้วย DataSource
import groovy.sql.Sql
source = new org.hsqldb.jdbc.jdbcDataSource()
source.database = 'jdbc:hsqldb:mem:GinA'
source.user = 'sa'
source.password = ''
db2 = new Sql(source)
Note: ถ้าเราใช้ application server เราสามารถเอา DataSource มาได้โดยใช้ JNDI ซึ่งข้อดีของการใช้วิธีนี้ คือการจัดการเชื่อมต่อกับฐานข้อมูลนั้นไม่ขึ้นอยู่กับ application ของเรา ใน application ของเราไม่ต้องระบุ database driver หรือ DataSource classs ซึ่งมันช่วยให้เราสามารถ migrate จากฐานข้อมูลหนึ่งไปอีกฐานข้อมูลหนึ่งโดยไม่ส่งผลกระทบถึง application
Note: การให้ได้มาซึ่ง connection ถ้าใช้ Datasource จะใช้วิธีส่ง DataSource เข้าไปใน Sql constructor แต่ถ้าใช้ DriverManager จะส่งค่าต่างๆ เข้าไปทาง Sql.newInstance
ไม่ว่าเราจะใช้ DataSource หรือ DriverManger สุดท้ายก็จะได้มาซึ่ง reference ของ Sql instance
สุดท้ายถ้าเราต้องการ clone Sql instance ขึ้นมาอีกอันสามารถใช้ new Sql(db) ได้ ตอนนี้เรามี sql