質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

13529閲覧

JDBCのConnectionの作り方について

reizouko

総合スコア26

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/02/21 04:53

JavaでJDBCを使ってデータベースからデータを取得しようとしているのですが、
どのようにConnectionオブジェクトを作るべきなのかで悩んでいます。
何か良い方法はありませんでしょうか。

今思いついているのは、
1.SingletonでConnectionを作成する。
2.ConnectionをThreadLocalにカプセル化して提供する。

1.の案ですと各スレッドで同じConnectionを使用するため、パフォーマンスの劣化やあるスレッドがConnectionをクローズした際に他のスレッドにも影響がでますでしょうか。

2.の案の場合、各スレッド毎にConnectionオブジェクトを持ち、スレッドセーフも担保できるので良い案な気がするのですが、デメリットなど教えていただけると嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

コネクションプーリングについては他の方が指摘していると思いますが、質問としてはその上でたとえばサーブレット上でコネクションオブジェクトをどのように管理したいのかと言う風に感じました。

>1.SingletonでConnectionを作成する。
>2.ConnectionをThreadLocalにカプセル化して提供する。

以下、質問がサーブレットの場合で、コネクションの管理はコンテナに任されているという前提です。

1については、このケースだと、ひとつのコネクションオブジェクトを複数のリクエスト間で使いまわすことになり、リクエスト内のトランザクションを意識できません。

どこかのリクエストがコミットしたトランザクションが他のリクエストに影響します。ロールバックも効きません。シングルトンオブジェクトなコネクションなので。ご指摘のとおり、他のスレッドに影響が出るのであまりお勧めしません。オートコミットなコネクションなら別なのでしょうが。

2についてはたとえばサーブレットのリクエストが来たら、そのリクエストに対し、ThreadLocalでコネクションプールから取り出したコネクションを貼り付けるという感じかと思います。(リクエストが終了で開放)

メリットとしては、リクエスト内で、どこで保存したコネクションを取っても同一のトランザクションと言う風になりコネクションをメソッド引数で引き回す必要がなくなるという所でしょうか。

デメリットとしては、、、自分もこの方法をよく使うのでそういえばあまり考えたことが無かったですね・・申し訳ない。

投稿2016/02/23 12:50

arcanum_jp

総合スコア94

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

DBコネクションは、コネクションする際に一番オーバーヘッドがあり
性能劣化します。

そのため、WEBAPサーバ(tomcatなど)はコネクションプールを採用して、
サーバ起動時にある程度DBに接続しっぱなしの状態を作ってます。
(ユーザがアクセスしてくるたびにDB接続していたらselectは一瞬なのに
接続するところで時間が掛かるということに、、)

実装するのであれば、
1でも2でも良いですが接続を維持するように実装しないと
遅くなります。

追記
このサイトが参考になるかなと思います。
http://d.hatena.ne.jp/wyukawa/20131116/1384621867

投稿2016/02/23 08:02

編集2016/02/23 08:04
hato_pato

総合スコア215

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

その手の処理は、自前で実装すると大変なので、ライブラリーやフレームワークやアプリケーションサーバーの機能を利用したほうが良いと思います。
私はこの辺についてあまり詳しくないので、具体的なライブラリーやフレームワークの名前をたくさんご紹介できないのですが、いくつか挙げてみます。

ライブラリーには、Apache Commons の"Commons DBCP"とか、Play Frameworkで採用されている"Bone CP"というものがあります。

DBCP - Overview
https://commons.apache.org/proper/commons-dbcp/

BoneCP - The fast Java JDBC Connection Pool
http://www.jolbox.com/

フレームワークでは、これらのライブラリーを使ってコネクションプールを実現していたと思います。

アプリケーションサーバーでは、WildFly(JBoss)、GlassFish、Tomcatなどで、コネクションプール機能が提供されています。

...

その他については、キーワード「JDBC コネクションプール」で調べてみてください。

投稿2016/02/21 07:28

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

OR マッパ等のフレームワークを利用すると、そのあたりの問題はフレームワーク側が管理してくれます。

フレームワークを利用しないまでも、そういったもののやり方を調べると参考になると思います。
(だいたい、けっこうなボリュームがありますが、当該箇所の記述は長くありません)

投稿2016/02/21 05:26

編集2016/02/21 05:30
kozuchi

総合スコア1193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問