JDBC面接対策:必須50問&エキスパート回答(2026年版)

JDBCの面接準備には、データベース接続、パフォーマンスチューニング、セキュリティベストプラクティスへの深い理解が求められます。以下の50問は、採用担当者が重視する核心概念と実践的シナリオを網羅しています。
1) JDBCとは?Javaアプリケーションでの重要性
JDBC(Java Database Connectivity)は、Javaプログラムがリレーショナルデータベースと対話するためのコアAPIです。SQL実行、結果処理、トランザクション制御を標準化し、MySQL、Oracle、PostgreSQLなどを最小限の変更で切り替え可能なデータベース非依存コードの記述を可能にします。
2) JDBCドライバの4タイプと主な違い
- Type 1(JDBC-ODBC Bridge):JDBCをODBCにブリッジ;使いやすいがODBC必須で低速。
- Type 2(Native API):ネイティブDBライブラリを呼び出し;Type 1より高速だがプラットフォーム依存。
- Type 3(Network Protocol):ミドルウェアで呼び出し変換;DB非依存だがネットワークオーバーヘッドあり。
- Type 4(Thin Driver):純Java、DBと直接通信;最高のパフォーマンスと移植性。現代アプリの多くはType 4使用。
3) JDBCプログラムのライフサイクル
- ドライバ読み込み:
Class.forName("com.mysql.cj.jdbc.Driver") DriverManagerまたはDataSourceでConnection確立Statement、PreparedStatement、CallableStatement作成- SQL実行(クエリ、更新、プロシージャ)
- 必要に応じて
ResultSet処理 - 全リソースクローズ(
try-with-resources推奨)
4) Statement、PreparedStatement、CallableStatementの使い分け
- Statement:静的SQL;ワンショットクエリに手軽。
- PreparedStatement:パラメータ化クエリ;SQLインジェクション防止とプリコンパイルで性能向上。
- CallableStatement:ストアドプロシージャ/関数;複雑なDBロジックをカプセル化。
5) JDBCでのトランザクション管理
- 自動コミット無効:
conn.setAutoCommit(false) - 複数ステートメント実行
- 成功時
conn.commit()、失敗時conn.rollback()
資金移動などアトミックな操作にこのパターンを使用。
6) JDBC接続プーリングの長所と短所
- 長所:接続再利用、レイテンシ削減、負荷下でのスケール。
- 短所:慎重な設定必要;リフレッシュしないとステール接続発生。
HikariCPやApache DBCPが業界標準。
7) execute()、executeQuery()、executeUpdate()の違い
execute():任意のSQL;ResultSet生成ならboolean返却。executeQuery():SELECT文;ResultSet返却。executeUpdate():INSERT、UPDATE、DELETE;影響行数返却。
8) JDBCパフォーマンス向上戦略
PreparedStatementでプリコンパイル活用addBatch()/executeBatch()でバッチ更新- 接続プーリング
- 必要なカラムのみ選択
- リソース即時クローズ
9) JDBCバッチ更新の解説
PreparedStatement ps = conn.prepareStatement("INSERT INTO student VALUES(?,?)");
for(int i=1;i<=1000;i++){
ps.setInt(1,i);
ps.setString(2,"Name"+i);
ps.addBatch();
}
ps.executeBatch();
ラウンドトリップ削減でスループット向上。
10) ResultSetの役割
ResultSetはクエリ結果を保持。作成フラグにより前方向のみ、スクロール可能、更新可能などのタイプがある。
11) JDBCとODBCの比較
- JDBC:純Java、プラットフォーム非依存、高性能。
- ODBC:Cベース、プラットフォーム依存、ネイティブドライバ必須。
12) JDBCアーキテクチャコンポーネント
- JDBC API(Connection、Statement、ResultSet)
- Driver Manager(ドライバ登録)
- ドライバ実装(Type 1-4)
- データベースバックエンド
13) ResultSetMetaDataとDatabaseMetaDataの違い
- ResultSetMetaData:特定クエリのカラム名、型。
- DatabaseMetaData:ドライバ名、DB製品、サポートSQL機能。
14) Savepointの使用方法
conn.setAutoCommit(false);
Savepoint sp = conn.setSavepoint("sp1");
// 操作
conn.rollback(sp); // 部分ロールバック
conn.commit();
15) RowSetとそのバリエーション定義
- JdbcRowSet – 接続型
- CachedRowSet – 切断型、シリアライズ可能
- WebRowSet – XMLベース
- FilteredRowSet – フィルタ付きビュー
- JoinRowSet – 複数RowSetのマージ
16) JDBCでのSQLException処理
SQLExceptionはgetErrorCode()、getSQLState()、getMessage()を提供。失敗時は必ずログ記録とロールバック。
17) バッチ処理とは
複数DML文を単一ラウンドトリップにグループ化;addBatch()とexecuteBatch()使用。
18) ステートメントタイプの再確認
- Statement – 静的SQL
- PreparedStatement – パラメータ化
- CallableStatement – ストアドプロシージャ
19) 効率的な接続管理
接続プーリング付きDataSourceを推奨。try-with-resourcesで自動クリーンアップ。
20) JDBC StatementとHibernate Sessionの比較
- JDBC:ローレベル、手動マッピング
- Hibernate:ORM、キャッシュ、自動SQL生成
21) 自動生成キーの取得
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); ps.executeUpdate(); ResultSet rs = ps.getGeneratedKeys();
22) BLOBとCLOBの扱い
- BLOB – バイナリストリーム
- CLOB – キャラクターストリーム
23) ResultSetをスクロール可能/更新可能にする
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEE");
rs.absolute(3);
rs.updateString("name", "UpdatedName");
rs.updateRow();
24) DataSourceとDriverManagerの違い
- DriverManager – シンプル、プーリングなし
- DataSource – JNDIルックアップ、プーリング、XAサポート
25) PreparedStatementでのバッチ処理
for(int i=1;i<=5;i++){
ps.setInt(1,i);
ps.setString(2,"Student"+i);
ps.addBatch();
}
ps.executeBatch();
26) DatabaseMetaDataの活用
DatabaseMetaData dbmd = conn.getMetaData();
System.out.println("DB: " + dbmd.getDatabaseProductName());
27) execute系メソッドの再確認
- execute() – boolean
- executeQuery() – ResultSet
- executeUpdate() – int
28) JDBCリソースのクローズ
try (Connection c = ds.getConnection();
Statement s = c.createStatement();
ResultSet rs = s.executeQuery("SELECT * FROM EMPLOYEE")) {
while(rs.next()){ /* 処理 */ }
}
29) 一般的なパフォーマンス最適化
- 接続プーリング
- StatementよりPreparedStatement
- バッチ更新
- フェッチサイズ調整
- 選択的カラム取得
30) ストアドプロシージャ呼び出し
CallableStatement cs = conn.prepareCall("{call getEmployeeSalary(?)}");
cs.setInt(1,101);
ResultSet rs = cs.executeQuery();
31) JDBC接続プーリングの内部仕組み
初期化時に固定数の接続を作成。リクエストが接続を借用、使用後に返却しリソースをメモリ内保持。
32) HikariCP設定
HikariConfig cfg = new HikariConfig();
cfg.setJdbcUrl("jdbc:mysql://localhost:3306/testdb");
cfg.setUsername("root");
cfg.setPassword("pw");
cfg.setMaximumPoolSize(10);
HikariDataSource ds = new HikariDataSource(cfg);
33) DriverManagerとDataSourceの再比較
- DriverManager – 直接、プーリングなし
- DataSource – プール、XA、JNDI
34) 「No suitable driver found」の主な原因
- ドライバJARがクラスパスにない
- JDBC URL誤り
Class.forName()不足(Java 9以前)- ドライバ-DBバージョン不一致
35) SQLインジェクション防止
- 常にパラメータ付き
PreparedStatement使用 - ユーザー入力の検証とサニタイズ
- DB権限制限
36) JDBCとORM(Hibernate)の比較
- JDBC:細かい制御、手動マッピング、軽量
- Hibernate:自動ORM、キャッシュ、学習曲線高め
37) SQLクエリのログ出力
- ドライバログ有効化(例:MySQLの
logger=com.mysql.cj.log.StandardLogger) - P6Spyやdatasource-proxyでインターセプトしてログ
38) JDBCでの安全なマルチスレッディング
Connectionオブジェクトをスレッド間で共有しない- スレッドごとにプールから接続取得
try-with-resourcesでリソースクローズ
39) Spring/Spring BootでのJDBC
SpringのJdbcTemplateがボイラープレート、例外変換、接続プーリングを自動処理。
40) JDBC Connectionの状態
- Initialized → Open → In Transaction → Committed/Rolled-back → Closed
41) ドライバタイプの再確認
- Type 1 – 低性能、ODBC必須
- Type 2 – ネイティブ、中性能
- Type 3 – ミドルウェア、中程度性能
- Type 4 – 純Java、最高性能
42) トランザクション分離レベル
- READ_UNCOMMITTED – ダーティリード
- READ_COMMITTED – デフォルト、ダーティリード防止
- REPEATABLE_READ – ノンリピータブルリード防止
- SERIALIZABLE – 厳格分離、ファントムリード回避
43) 分散(XA)トランザクション
javax.sql.XADataSourceとJTAマネージャ(Atomikos、Bitronix、Spring)使用- 二相コミットで複数DB間のコミット調整
44) JDBCパフォーマンスプロファイリング
- P6Spy、datasource-proxyでクエリログ
- Java Flight Recorder / JVisualVMで接続使用状況
- データベースEXPLAINプランでクエリチューニング
- Prometheus + Grafanaでメトリクス
45) JDBCメモリリーク防止
try-with-resourcesでResultSet、Statement、Connection必ずクローズ- プールタイムアウト設定(maxIdleTime、maxLifetime)
- スコープ外でResultSet保持回避
46) マイクロサービス/クラウドでのJDBC
- 軽量プーリングにHikariCP
- ステートレスJDBCセッション
- リードレプリカ、キャッシュ(Redis)
- Resilience4jサーキットブレーカーでDBフェイルオーバー
47) 接続失敗のグレースフルハンドリング
for(int i=0;i<3;i++){
try(Connection c=ds.getConnection()){
break;
} catch(SQLTransientConnectionException e){
Thread.sleep(1000*(i+1));
}
}
48) Commit、Rollback、Savepointの違い
- Commit – 全変更確定
- Rollback – 直前コミットまで巻き戻し
- Savepoint – 部分ロールバック対象
49) JDBCメタデータの有用性
- 動的スキーマイントロスペクション
- データベース機能チェック
- ORM生成用ツーリング
50) エンタープライズJDBCのベストプラクティス
DataSourceにプーリング使用PreparedStatement優先- 適切な分離レベルでトランザクション処理
- バッチ操作とページネーション
- クエリのログ記録と監視
- 例外とリトライのグレースフル処理
🔍 実践シナリオ付きトップJDBC面接質問&戦略的回答
以下は慎重に作成された10のJDBC面接質問、面接官の期待、強力な模範回答です。
1) JDBCとは?なぜ重要か?
期待回答: JDBCはデータベースアクセスのJava API;SQL実行、結果処理、トランザクションを抽象化し、データベース非依存コードを可能にする。
2) JDBCドライバタイプを説明せよ。
期待回答: 4タイプ:JDBC-ODBC Bridge、Native API、Network Protocol、Thin Driver。現在Type 4が最も一般的。
3) 効率的な接続管理方法は?
期待回答: HikariCPなどの接続プール使用;リクエストごとに接続開閉しない。
4) Statement、PreparedStatement、CallableStatementの違いは?
期待回答: Statement – 静的SQL;PreparedStatement – パラメータ化、インジェクション防止;CallableStatement – ストアドプロシージャ。
5) 実施したJDBCパフォーマンス最適化を説明せよ。
期待回答: 文字列結合をPreparedStatementに置換、プーリング導入、バッチ挿入活用;レスポンス時間40%削減。
6) SQLインジェクション防止方法は?
期待回答: PreparedStatement使用;入力検証;DB権限制限。
7) JDBC接続失敗のトラブルシュート手順は?
期待回答: URL、認証、ネットワーク、ドライバJAR確認;ログ確認;ポート設定修正。
8) JDBCでのトランザクション管理方法は?
期待回答: 自動コミット無効化、操作実行、結果に応じてコミット/ロールバック;ACID準拠確保。
9) JDBCで解決した困難なDB課題は?
期待回答: バルク挿入にバッチ処理導入、所要時間を数分から数秒に短縮。
10) タイトなデッドライン下でのJDBC改善優先順位は?
期待回答: インパクト評価、明確なコミュニケーション、高インパクト項目優先、SLA達成への協調。
Java
- Java 9 CompletableFuture API改善:遅延・タイムアウト・サブクラス対応・新ファクトリ
- Java ArrayList完全解説:使い方、主要メソッド、実践例
- Javaメソッドオーバーライド: スーパークラスの振る舞いをカスタマイズ
- Java LinkedBlockingQueue完全マスター:包括的ガイドと実例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- 2026年 Hibernate 面接ガイド——必須30問と模範解答
- Java 10の新機能とリリースモデル:6ヶ月サイクルとLTSの解説
- Java配列チュートリアル:宣言、生成、初期化の完全ガイド
- Java 10のアプリケーションクラスデータ共有(AppCDS)で起動高速化
- Java 8関数型インターフェース完全ガイド:java.util.functionパッケージ43種類
- 2026年版 Neo4j面接質問トップ20と解答ガイド