SlideShare a Scribd company logo
1 of 26
Download to read offline
非同期 JDBC in Scala
@seratch
Kazuhiro Sera
Really?
え、ホントに?
JDBC?
JDBC はブロックするって
聞いてたんだけど?
Exactly
ええ、その通りです。
   ミ ヽヽヽリリノノノノ
   彡ミイ  ̄ ̄'` ̄ヾミ
   彡ミi )      ;|ミ
   彡ミ〉 _,,,,,,,,, i,i ,,,,,_イミ  JDBC と言ったな、
    rミi  _-・- l-・-、v
    {6〈`┬  、_」_  イ   あれは嘘だ。
   ヾ|  (  ,-ー-、) |
    \ `- ͡-´ノ 、 '  ’
    /i\ __ノ - ∩_____ ’
   /\_  _ノ\   ( イ___ヨ - パッ
  (_Y  ヽノ )イ͡ニ ,ノ  
  (  )____/ `ー-ー´   
ー-',..-'ー.-,ー!..ー,,-._ー.,-ー.,-ー-...,,____
   l         |   i       i   ''i,,_
JDBC っぽい non-blocking
な DB アクセス in Scala
@seratch
Kazuhiro Sera
ScalikeJDBC 
- Scala の DB アクセスライブラリ
- “仕事で使っても詰まない”
- SQL 書ける、柔軟性、拡張性、スピー
ディなバグ対応・リリース、日本語
- Slick、Squeryl ほど有名じゃないけ
ど、結構イケる感じです
DSL で書いた例
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()
}
生 SQL も書けるよ
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()
}
Get things done
- わかりやすくて、ハマりにくい
- 独自のノウハウを探しまわる必要なし
- 1 人目のちゃんと使える人の確保が容易
(Scala の基本と SQL のみ)
- Cookbook(日本語)販売中
Productive
- ほぼタイプセーフな API を提供
- sbt プラグインでソースコード自動生成
- スロークエリ、Fluentd にも送れる
- specs2、ScalaTest それぞれに
AutoRollback サポート
Main subject
で、そろそろ本題。
ScalikeJDBC-Async
- ScalikeJDBC の API 互換だけど内部は
JDBC じゃない
- Activate という他のライブラリに触発
されて実装した(2013/7)
- 国内外でのいくつか利用事例を認識して
いますが、一応まだアルファバージョン
How?
- postgresql-async/mysql-async by
@mauricio をラップした
- Netty ベースの独自ドライバ
- queue を持った ConnectionPool
- Transaction は Connection を占有し
て実現(begin/commit 自前で発行)
ほぼそのまま!
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()
}
Tx は for 式で
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 ()
}
Tips
- Future[Option[_]] や Future[List[_]]
だらけになるので for 式で書くとよい
- Play2 は Controller の Action に
Future のまま渡せるのでやりやすい
OMT?
LT なのに One more thing 的なアレ。
Really Must?
確かに JDBC がブロックして
困るアプリの開発もあるが
そうじゃないものの方が多い
というのが現実(リアル)では?
Most cases?
- うちのアプリ、実際 Servlet + JDBC で
十分さばけてる(知ってた)
- Reactive? C10K? 何それおいしいの?
- 実は普通の管理画面作りたいだけ
- Java は得意だけど今更の Java 感
Rails? 
実際、フロントエンドの合理的な選択。
私自身 Java でできた API サーバと
Rails フロントエンドがメインのお仕事。
でも、今日ここにいる皆さんはきっと
できれば Scala がいいんですよね・・
Grails? 
SI 業界な事情があるところ以外は
「だったらもう Rails で(ry」と思うけど
ともあれ、今日ここにいる皆さんは
Groovy より Scala ですよね・・
Play2? 
Play2 は発展途上 & Reactive 指向。
見た目から Play1/Rails 的なものを期待して
ミスマッチになっていないか?
管理画面つくるの Play2 で本当に楽?
Skinny!
なければつくるのが OSS ということで
Scala on Rails なフレームワークを
作っています(2 週間前から)!
Scalatra + ScalikeJDBC + more...
http://git.io/skinny
ORM もあるよ
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)
Thanks
- 非同期 JDBC なんてなかったんやー
- ScalikeJDBC のご紹介
- ScalikeJDBC-Async のご紹介
- Skinny Framework のご紹介

More Related Content

Similar to 歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech

Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法Hiroshi Yoshida
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会Yukihiro Kitazawa
 
MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術yoku0825
 
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介Kevin Toyoda
 
JavaScriptをまじめに考えました+
JavaScriptをまじめに考えました+JavaScriptをまじめに考えました+
JavaScriptをまじめに考えました+Hiroaki Okubo
 
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっているJJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっているKoichi Sakata
 
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -Hayato Mizuno
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1Makoto Haruyama
 
Native x Webでいいとこどり開発 ~ピグトーク~
Native x Webでいいとこどり開発 ~ピグトーク~Native x Webでいいとこどり開発 ~ピグトーク~
Native x Webでいいとこどり開発 ~ピグトーク~Kazunari Hara
 
USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413博文 斉藤
 
20080426.1000speakers:4
20080426.1000speakers:420080426.1000speakers:4
20080426.1000speakers:4IWATA Susumu
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2Nishida Kansuke
 
More Better Nested Set
More Better Nested SetMore Better Nested Set
More Better Nested Setxibbar
 
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)Koichi Sakata
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotationEIICHI KIMURA
 

Similar to 歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech (20)

Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
Android上での3D(OpenGL)描画の基礎とNDKによる実践的高速化手法
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会
 
MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術
 
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介
 
JavaScriptをまじめに考えました+
JavaScriptをまじめに考えました+JavaScriptをまじめに考えました+
JavaScriptをまじめに考えました+
 
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっているJJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
 
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1
 
Native x Webでいいとこどり開発 ~ピグトーク~
Native x Webでいいとこどり開発 ~ピグトーク~Native x Webでいいとこどり開発 ~ピグトーク~
Native x Webでいいとこどり開発 ~ピグトーク~
 
Metaspace
MetaspaceMetaspace
Metaspace
 
USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413USP 友の会 LT 資料 20130413
USP 友の会 LT 資料 20130413
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
 
20080426.1000speakers:4
20080426.1000speakers:420080426.1000speakers:4
20080426.1000speakers:4
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
 
More Better Nested Set
More Better Nested SetMore Better Nested Set
More Better Nested Set
 
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
 
Jquery1 1
Jquery1 1Jquery1 1
Jquery1 1
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotation
 

More from Kazuhiro Sera

All I learned while working on a Scala OSS project for over six years #ScalaM...
All I learned while working on a Scala OSS project for over six years #ScalaM...All I learned while working on a Scala OSS project for over six years #ScalaM...
All I learned while working on a Scala OSS project for over six years #ScalaM...Kazuhiro Sera
 
Contributing to Scala OSS from East Asia #ScalaMatsuri
 Contributing to Scala OSS from East Asia #ScalaMatsuri Contributing to Scala OSS from East Asia #ScalaMatsuri
Contributing to Scala OSS from East Asia #ScalaMatsuriKazuhiro Sera
 
Skinny Meetup Tokyo 2 日本語スライド
Skinny Meetup Tokyo 2 日本語スライドSkinny Meetup Tokyo 2 日本語スライド
Skinny Meetup Tokyo 2 日本語スライドKazuhiro Sera
 
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconSeasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconKazuhiro Sera
 
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageekJava エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageekKazuhiro Sera
 
Future on Servlet #scala_ks
Future on Servlet #scala_ksFuture on Servlet #scala_ks
Future on Servlet #scala_ksKazuhiro Sera
 
Servlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ksServlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ksKazuhiro Sera
 
マイクロサービス運用の所感 #m3dev
マイクロサービス運用の所感 #m3devマイクロサービス運用の所感 #m3dev
マイクロサービス運用の所感 #m3devKazuhiro Sera
 
Scala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaScala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaKazuhiro Sera
 
Scala on Rails #rakutentech
Scala on Rails #rakutentechScala on Rails #rakutentech
Scala on Rails #rakutentechKazuhiro Sera
 
Solid And Sustainable Development in Scala
Solid And Sustainable Development in ScalaSolid And Sustainable Development in Scala
Solid And Sustainable Development in ScalaKazuhiro Sera
 
Beginning Scala with Skinny Framework #jjug_ccc
Beginning Scala with Skinny Framework #jjug_cccBeginning Scala with Skinny Framework #jjug_ccc
Beginning Scala with Skinny Framework #jjug_cccKazuhiro Sera
 
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24Kazuhiro Sera
 
Skinny Framework 1.0.0
Skinny Framework 1.0.0Skinny Framework 1.0.0
Skinny Framework 1.0.0Kazuhiro Sera
 
Skinny Framework Progress Situation
Skinny Framework Progress SituationSkinny Framework Progress Situation
Skinny Framework Progress SituationKazuhiro Sera
 
Skinny Framework 進捗どうですか? #fud_scala
Skinny Framework 進捗どうですか? #fud_scalaSkinny Framework 進捗どうですか? #fud_scala
Skinny Framework 進捗どうですか? #fud_scalaKazuhiro Sera
 
テストの運用について #m3dev
テストの運用について #m3devテストの運用について #m3dev
テストの運用について #m3devKazuhiro Sera
 
テストを書くのが嫌いな君へ #m3dev
テストを書くのが嫌いな君へ #m3devテストを書くのが嫌いな君へ #m3dev
テストを書くのが嫌いな君へ #m3devKazuhiro Sera
 
Skinny Controllers, Skinny Models
Skinny Controllers, Skinny ModelsSkinny Controllers, Skinny Models
Skinny Controllers, Skinny ModelsKazuhiro Sera
 

More from Kazuhiro Sera (20)

All I learned while working on a Scala OSS project for over six years #ScalaM...
All I learned while working on a Scala OSS project for over six years #ScalaM...All I learned while working on a Scala OSS project for over six years #ScalaM...
All I learned while working on a Scala OSS project for over six years #ScalaM...
 
Contributing to Scala OSS from East Asia #ScalaMatsuri
 Contributing to Scala OSS from East Asia #ScalaMatsuri Contributing to Scala OSS from East Asia #ScalaMatsuri
Contributing to Scala OSS from East Asia #ScalaMatsuri
 
Skinny Meetup Tokyo 2 日本語スライド
Skinny Meetup Tokyo 2 日本語スライドSkinny Meetup Tokyo 2 日本語スライド
Skinny Meetup Tokyo 2 日本語スライド
 
Skinny 2 Update
Skinny 2 UpdateSkinny 2 Update
Skinny 2 Update
 
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarconSeasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
 
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageekJava エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
 
Future on Servlet #scala_ks
Future on Servlet #scala_ksFuture on Servlet #scala_ks
Future on Servlet #scala_ks
 
Servlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ksServlet と Future の関わり方 #scala_ks
Servlet と Future の関わり方 #scala_ks
 
マイクロサービス運用の所感 #m3dev
マイクロサービス運用の所感 #m3devマイクロサービス運用の所感 #m3dev
マイクロサービス運用の所感 #m3dev
 
Scala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaScala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscala
 
Scala on Rails #rakutentech
Scala on Rails #rakutentechScala on Rails #rakutentech
Scala on Rails #rakutentech
 
Solid And Sustainable Development in Scala
Solid And Sustainable Development in ScalaSolid And Sustainable Development in Scala
Solid And Sustainable Development in Scala
 
Beginning Scala with Skinny Framework #jjug_ccc
Beginning Scala with Skinny Framework #jjug_cccBeginning Scala with Skinny Framework #jjug_ccc
Beginning Scala with Skinny Framework #jjug_ccc
 
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
 
Skinny Framework 1.0.0
Skinny Framework 1.0.0Skinny Framework 1.0.0
Skinny Framework 1.0.0
 
Skinny Framework Progress Situation
Skinny Framework Progress SituationSkinny Framework Progress Situation
Skinny Framework Progress Situation
 
Skinny Framework 進捗どうですか? #fud_scala
Skinny Framework 進捗どうですか? #fud_scalaSkinny Framework 進捗どうですか? #fud_scala
Skinny Framework 進捗どうですか? #fud_scala
 
テストの運用について #m3dev
テストの運用について #m3devテストの運用について #m3dev
テストの運用について #m3dev
 
テストを書くのが嫌いな君へ #m3dev
テストを書くのが嫌いな君へ #m3devテストを書くのが嫌いな君へ #m3dev
テストを書くのが嫌いな君へ #m3dev
 
Skinny Controllers, Skinny Models
Skinny Controllers, Skinny ModelsSkinny Controllers, Skinny Models
Skinny Controllers, Skinny Models
 

歌舞伎座.tech 1 LT - ScalikeJDBC Async & Skinny Framework #kbkz_tech

  • 1. 非同期 JDBC in Scala @seratch Kazuhiro Sera
  • 5.    ミ ヽヽヽリリノノノノ    彡ミイ  ̄ ̄'` ̄ヾミ    彡ミi )      ;|ミ    彡ミ〉 _,,,,,,,,, i,i ,,,,,_イミ  JDBC と言ったな、     rミi  _-・- l-・-、v     {6〈`┬  、_」_  イ   あれは嘘だ。    ヾ|  (  ,-ー-、) |     \ `- ͡-´ノ 、 '  ’     /i\ __ノ - ∩_____ ’    /\_  _ノ\   ( イ___ヨ - パッ   (_Y  ヽノ )イ͡ニ ,ノ     (  )____/ `ー-ー´    ー-',..-'ー.-,ー!..ー,,-._ー.,-ー.,-ー-...,,____    l         |   i       i   ''i,,_
  • 6. JDBC っぽい non-blocking な DB アクセス in Scala @seratch Kazuhiro Sera
  • 7. ScalikeJDBC  - Scala の DB アクセスライブラリ - “仕事で使っても詰まない” - SQL 書ける、柔軟性、拡張性、スピー ディなバグ対応・リリース、日本語 - Slick、Squeryl ほど有名じゃないけ ど、結構イケる感じです
  • 8. DSL で書いた例 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() }
  • 9. 生 SQL も書けるよ 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() }
  • 10. Get things done - わかりやすくて、ハマりにくい - 独自のノウハウを探しまわる必要なし - 1 人目のちゃんと使える人の確保が容易 (Scala の基本と SQL のみ) - Cookbook(日本語)販売中
  • 11. Productive - ほぼタイプセーフな API を提供 - sbt プラグインでソースコード自動生成 - スロークエリ、Fluentd にも送れる - specs2、ScalaTest それぞれに AutoRollback サポート
  • 13. ScalikeJDBC-Async - ScalikeJDBC の API 互換だけど内部は JDBC じゃない - Activate という他のライブラリに触発 されて実装した(2013/7) - 国内外でのいくつか利用事例を認識して いますが、一応まだアルファバージョン
  • 14. How? - postgresql-async/mysql-async by @mauricio をラップした - Netty ベースの独自ドライバ - queue を持った ConnectionPool - Transaction は Connection を占有し て実現(begin/commit 自前で発行)
  • 15. ほぼそのまま! 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() }
  • 16. Tx は for 式で 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 () }
  • 17. Tips - Future[Option[_]] や Future[List[_]] だらけになるので for 式で書くとよい - Play2 は Controller の Action に Future のまま渡せるのでやりやすい
  • 18. OMT? LT なのに One more thing 的なアレ。
  • 19. Really Must? 確かに JDBC がブロックして 困るアプリの開発もあるが そうじゃないものの方が多い というのが現実(リアル)では?
  • 20. Most cases? - うちのアプリ、実際 Servlet + JDBC で 十分さばけてる(知ってた) - Reactive? C10K? 何それおいしいの? - 実は普通の管理画面作りたいだけ - Java は得意だけど今更の Java 感
  • 21. Rails?  実際、フロントエンドの合理的な選択。 私自身 Java でできた API サーバと Rails フロントエンドがメインのお仕事。 でも、今日ここにいる皆さんはきっと できれば Scala がいいんですよね・・
  • 22. Grails?  SI 業界な事情があるところ以外は 「だったらもう Rails で(ry」と思うけど ともあれ、今日ここにいる皆さんは Groovy より Scala ですよね・・
  • 23. Play2?  Play2 は発展途上 & Reactive 指向。 見た目から Play1/Rails 的なものを期待して ミスマッチになっていないか? 管理画面つくるの Play2 で本当に楽?
  • 24. Skinny! なければつくるのが OSS ということで Scala on Rails なフレームワークを 作っています(2 週間前から)! Scalatra + ScalikeJDBC + more... http://git.io/skinny
  • 25. ORM もあるよ 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)
  • 26. Thanks - 非同期 JDBC なんてなかったんやー - ScalikeJDBC のご紹介 - ScalikeJDBC-Async のご紹介 - Skinny Framework のご紹介