2012-04-30 9 views
2

私のデータベースで、私のapiメソッドの1つから、小さな(ただし頻繁に)操作を行う必要があります。私はそれらを "withSession"に毎回ラップしようとすると、私はひどいパフォーマンスを得る。ScalaQueryでセッションを再利用しますか?

db withSession { 
    SomeTable.insert(a,b) 
} 

上記の例を100回実行すると、22秒かかります。単一のセッションでそれらをすべて実行することは瞬時に行われます。

以降の関数呼び出しでセッションを再利用する方法はありますか?

答えて

3

あなたは(JDBC Connection Pooling: Connection Reuse?を参照)接続プールのいくつかのタイプを持っていますか?そうでない場合は、すべてのwithSession(...)に新しい接続を使用することになり、それは非常に遅いアプローチです。 ScalaQueryでC3POを使用する方法については、http://groups.google.com/group/scalaquery/browse_thread/thread/9c32a2211aa8cea9を参照してください。

アプリケーションサーバーからの管理対象リソースを使用する場合は、通常は「無料」となりますが、スタンドアロンサーバー(例えばjetty)ではこれを自分で構成する必要があります。

+0

接続プーリングがないと思います。メモリ内のhsqlデータベースにアクセスするだけです。ちなみに、これらの接続には「有効期限」の時間がありますか?たぶん私は1つの接続を開き、それはすべての時間開いたままにすることができますか? – Rogach

+0

100の挿入に22秒を使用すると、hsqlデータベースが接続のインスタンス化に大きなオーバーヘッドを持つように見えます。有効期限はサーバーに依存します。これはしばしば接続プールの問題です。彼らが解決する1つの方法は、接続を渡す前にテストクエリを実行することです(たとえば 'select 1')。 – thoredge

1

私はおそらくあまりにも明白な方法を記載したんだけど、あなただけのようなwithSessionブロック内のより多くの電話を入れることができます:代わりにあなたはときにそれを閉じて、その後、暗黙のセッションを作成し、あなたのビジネスを行うことができ

db withSession { 
    SomeTable.insert(a,b) 
    SomeOtherTable.insert(a,b) 
} 

すれば完了です:

implicit val session = db.createSession 
SomeTable.insert(a,b) 
SomeOtherTable.insert(a,b) 
session.close 
+0

はい、それは本当に明らかです:)私はそれらをバッチすることはできません - 何かを行う要求は、データベースロジックで悩まされるべきではない、他の非データベースコードから来ています。しかし、暗黙のセッションのアイデアは良いです - 私は1つのセッションを開き、それを残すことができますか?しばらくしてから死ぬことはありませんか? – Rogach

+0

HSQLDBのドキュメントでは、「ユーザーログインとログアウト操作を記録するアプリケーションのように、マルチスレッドでもトランザクションでもないアプリケーションは、複数の接続を必要としません。ネットワークの問題のためにドロップされます。だから、あなたは1つを開いて、アプリの生活の周りにそれを保つことができるようだ。他に潜在的に役に立つヒントがあります:http://hsqldb.org/doc/guide/deployment-chapt.html#dec_managing_connections – jxstanford

関連する問題