Kabukiza.tech 1 LT - ScalikeJDBC-Async & Skinny Framework #kbkz_tech


Published on

- ScalikeJDBC & ScalikeJDBC Async introduction
- Skinny Framework introduction

Published in: Technology
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Kabukiza.tech 1 LT - ScalikeJDBC-Async & Skinny Framework #kbkz_tech

  1. 1. JDBC-like non-blocking DB Access in Scala @seratch Kazuhiro Sera Kabukiza.tech is a workshop which is presented by Dwango at Kabukiza tower
  2. 2. ScalikeJDBC  - DB Access library in Scala - “Never stuck when using at work“ - SQL, flexibility, expandability, speedy bug fixes and releases - Cool enough though it’s less well- known than Slick or Squeryl.
  3. 3. DSL Example import scalikejdbc._, SQLInterpolation._ val memberId = 123 val member = DB readOnly { implicit session => withSQL { select.from(Member as m) .where.eq(m.id, memberId).and.isNull(m.deletedAt) }.map(Member(m)).single.apply() }
  4. 4. SQL Interpolation import scalikejdbc._, SQLInterpolation._ val memberId = 123 val member = DB readOnly { implicit session => sql”””select id, name from member where id = ${memberId} and deleted_at is null””” .map(Member(m)).single.apply() }
  5. 5. Get things done - Easy to understand, few pitfalls - No need to google framework specific knowledges - Easy to find the first developer who use it correctly (required background is only Scala basics and SQL)
  6. 6. Productive - Mostly type-safe DSL - Source code generator from existing tables via sbt plugin - Logging slow queries, it’s also possible to send data to external services (e.g. Fluentd) - AutoRollback testing support for specs2、ScalaTest
  7. 7. ScalikeJDBC-Async - ScalikeJDBC compatible API, but it doesn’t use JDBC internally - Inspired by Activate ‘s async API support (2013/7) - Though some introduction examples are already reported, this library is still in the alpha stage.
  8. 8. How? - Just wrapped postgresql-async/ mysql-async by @mauricio - Netty based database driver which is not compatible with JDBC - ConnectionPool with queue - Transaction = begin/commit in a non-shared connection
  9. 9. Mostly same! import scalikejdbc._, SQLInterpolation._, async._ val memberId = 123 val member = AsyncDB withPool { implicit session => withSQL { select.from(Member as m) .where.eq(m.id, memberId).and.isNull(m.deletedAt) }.map(Member(m)).single.future() }
  10. 10. Transactions with for comprehensions val name = “Typesafe” val programmers = Seq(“Alice”, “Bob”, “Chris”) val resultFuture = AsyncDB localTx { implicit tx => for { company <- Company.create(name) employees <- company.hireAll(programmers) } yield () }
  11. 11. Tips - Since you need to work with many Future[Option[_]] and Future[List[_]], for comprehensions are suitable - Play2’s Action can receive Future values, pretty good chemistry
  12. 12. One more thing This is a Lightning talk, but I have “One more thing”.
  13. 13. Really Must? Indeed, some kinds of applications need non- blocking DB access. However, many smaller applications actually exist.
  14. 14. Most cases? - “Our application is built with Servlet & JDBC. No problem.” - “C10K? It’s not my problem.” - “Just need simple admin CRUD app.” - “Good at Java, but Java in 2013??”
  15. 15. Rails?  Reasonable choice for front end apps. I myself am working with API servers in Java and Rails front end at the office. Oops, most of you here would like to write Scala apps, right?
  16. 16. Grails?  If you’re not a Groovy lover... Oops, most of you here prefer Scala than Groovy, right?
  17. 17. Play2?  I understand Play2 makes Reactive/real- time app development productive. Indeed, looks like Rails app but Play2 is neither new Rails nor new Play1.
  18. 18. Skinny! Small & full-stack web app framework in Scala is still absent. So I just started developing Scala on Rails which is named “Skinny Framework”! Built with Scalatra + ScalikeJDBC + more, API is highly inspired by Rails. http://git.io/skinny
  19. 19. ORM Example case class Developer(id: Long, groupId: Opion[Long], group: Option[Group] = None, skills: Seq[Skill] = Nil) object Developer extends SkinnyCRUDMapper[Developer] { belongsTo[Group](Group, (d, g) => d.copy(group = g)).byDefault hasManyThrough[Skill](DeveloperSkill, Skill, (d, skills) => d.coply(skills = skills)) def extract ... } Developer.findAll() Developer.findById(123) Developer.createWithAttributes(params.permit(“id”, “groupId”)) Developer.updateById(123).withAttributes(attrs) Developer.deleteById(123)
  20. 20. Thanks - There is no async JDBC - ScalikeJDBC introduction - ScalikeJDBC-Async introduction - Skinny Framework introduction