DBCP (Database Connection Pooling)
DB μ°κ²°μ ν(Pool)μ μ¬μ©νμ¬, μ°κ²°μ μ¬μ¬μ©ν¨μΌλ‘μ¨ μ±λ₯μ ν₯μμν€λ κΈ°μ
DBCP (Database Connection Pooling)
ν(Pool)?
: μ¬λ¬ μ¬λμ΄ ν¨κ» μ¬μ©νκ³ λλμ΄ μ°λ μμ μ§ν©
Pool μ μμμ₯μ
λλ€. μμμ₯μλ μ¬λ¬ μ¬λμ΄ λ€μ΄κ°μ μμνλ©΄μ λ¬Όμ΄λΌλ μμμ 곡μ ν©λλ€. λ§μ°¬κ°μ§λ‘ νλ‘κ·Έλ¨μμμ Pool μ μμμ 곡μ ν΄μ ν¨μ¨μ μΌλ‘ μ¬μ©νλ λ°©μ μ§μν΄μ£Όλ μμμ
λλ€.
DBCP λΌμ΄λΈλ¬λ¦¬
Apache Commons DBCP
μλ° μ ν리μΌμ΄μ
μμ λ§μ΄ μ¬μ©λλ μ°κ²° ν ꡬν λΌμ΄λΈλ¬λ¦¬
λ€μ΄λ‘λ
DBCP μμ νλ‘μ νΈ
νλ‘μ νΈ κ΅¬μ‘°
DBCP/
ββ src/
β ββ DBCP/
β β ββ Main.java
β ββ module-info.java
ββ lib/
ββ commons-dbcp2-2.12.0.jar
ββ commons-logging-1.3.4.jar
ββ commons-pool2-2.12.0.jar
ββ javax.transaction-api-1.3.jar
ββ mysql-connector-j-9.5.0.jar
Plain Text
볡μ¬
Main.java (DBCP κΈ°λ³Έ μμ μ½λ)
package DBCP;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import org.apache.commons.dbcp2.BasicDataSource;
public class Main {
public static void main(String[] args) {
// BasicDataSource κ°μ²΄ μμ± (DB μ°κ²° ν μ€μ )
BasicDataSource ds = new BasicDataSource();
ds.setUrl("jdbc:mysql://localhost:3306/aloha");
ds.setUsername("aloha");
ds.setPassword("123456");
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
// ν μ€μ
ds.setInitialSize(5); // μ΄κΈ° μ°κ²° κ°μ
ds.setMaxTotal(10); // μ΅λ μ°κ²° κ°μ
try (Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM board")) {
while (rs.next()) {
System.out.println("μ λͺ©: " + rs.getString("title"));
System.out.println("μμ±μ: " + rs.getString("writer"));
System.out.println("λ΄μ©: " + rs.getString("content"));
System.out.println("------");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java
볡μ¬
module-info.java
module DBCP {
requires java.sql;
requires static java.transaction.xa;
requires org.apache.commons.dbcp2;
requires org.apache.commons.pool2;
}
Java
볡μ¬
SQL
-- λ°μ΄ν°λ² μ΄μ€ μμ±
CREATE DATABASE aloha;
-- ν
μ΄λΈ μμ±
-- κ²μν ν
μ΄λΈ μμ±
CREATE TABLE `aloha`.`board` (
`no` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'λ²νΈ',
`title` VARCHAR(100) NOT NULL COMMENT 'μ λͺ©',
`writer` VARCHAR(100) NOT NULL COMMENT 'μμ±μ',
`content` TEXT NULL COMMENT 'λ΄μ©',
`created_at` TIMESTAMP NOT NULL DEFAULT now() COMMENT 'λ±λ‘μΌμ',
`updated_at` TIMESTAMP NOT NULL DEFAULT now() COMMENT 'μμ μΌμ'
) COMMENT = 'κ²μν';
-- λ°μ΄ν° μΆκ°
INSERT INTO board (title, writer, content)
VALUES
('μ λͺ©01', 'μμ±μ01', 'λ΄μ©01'),
('μ λͺ©02', 'μμ±μ02', 'λ΄μ©02'),
('μ λͺ©03', 'μμ±μ03', 'λ΄μ©03'),
('μ λͺ©04', 'μμ±μ04', 'λ΄μ©04'),
('μ λͺ©05', 'μμ±μ05', 'λ΄μ©05')
;
SQL
볡μ¬
DBCP κ΄λ ¨ λΌμ΄λΈλ¬λ¦¬ μν μ 리
λΌμ΄λΈλ¬λ¦¬ νμΌλͺ
| μ£Όμ μν | νμ μ¬λΆ |
commons-dbcp2-2.12.0.jar | ν΅μ¬ DBCP λΌμ΄λΈλ¬λ¦¬. BasicDataSource, 컀λ₯μ
ν κ΄λ¦¬, 컀λ₯μ
μ¬μ¬μ©/νμ κΈ°λ₯ μ 곡 | |
commons-pool2-2.12.0.jar | κ°μ²΄ ν(Object Pool) ꡬν λΌμ΄λΈλ¬λ¦¬. DBCPκ° λ΄λΆμ μΌλ‘ 컀λ₯μ
μ κ΄λ¦¬ν λ μ¬μ© | |
commons-logging-1.3.4.jar | Apache κ³΅μ© λ‘κΉ
λΌμ΄λΈλ¬λ¦¬. DBCP λ΄λΆ λμ λ‘κ·Έλ₯Ό νμ€ λ‘κΉ
μΈν°νμ΄μ€λ‘ μΆλ ₯ | |
javax.transaction-api-1.3.jar | νΈλμμ
κ΄λ ¨ API (JTA). DBCP λ΄λΆμμ νΈλμμ
μ°λ μ νμ | |
mysql-connector-j-9.0.0.jar | MySQL JDBC λλΌμ΄λ². μ€μ DB μ°κ²°μ μν νμ λλΌμ΄λ² |
μλ νλ¦ μμ½
λ¨κ³ | λμ | μ£Όμ ν΄λμ€ |
β | BasicDataSource μμ± | BasicDataSource |
β‘ | DB μ°κ²° μ 보 μ€μ (URL, user, password, driver) | BasicDataSource |
β’ | μ΄κΈ° 컀λ₯μ
ν μμ± (setInitialSize) | GenericObjectPool (λ΄λΆ) |
β£ | getConnection() νΈμΆ μ νμμ μ°κ²° μ 곡 | PoolableConnectionFactory |
β€ | μ¬μ© ν μλμΌλ‘ λ°ν (try-with-resources μ¬μ©) | Connection.close() λ΄λΆμμ λ°ν |
DBCP 컀λ₯μ
ν ꡬ쑰λ
graph TB
subgraph Application["μ ν리μΌμ΄μ
"]
A["νλ‘κ·Έλ¨ μ½λ"]
end
subgraph DBCP["DBCP (Connection Pool)"]
B["BasicDataSource"]
C["GenericObjectPool"]
D["Active Connections<br/>(μ¬μ© μ€μΈ μ°κ²°)"]
E["Idle Connections<br/>(λκΈ° μ€μΈ μ°κ²°)"]
end
subgraph Database["λ°μ΄ν°λ² μ΄μ€"]
F["MySQL/Oracle/PostgreSQL λ±"]
end
A -->|"1. getConnection() μμ²"| B
B -->|"2. μ°κ²° μμ²"| C
C -->|"3. μ¬μ© κ°λ₯ν μ°κ²° νμΈ"| E
E -->|"4. μ°κ²° μ 곡"| D
D -->|"5. Connection λ°ν"| A
A -->|"6. 쿼리 μ€ν"| F
F -->|"7. κ²°κ³Ό λ°ν"| A
A -->|"8. close() νΈμΆ<br/>(μ°κ²° λ°ν)"| D
D -->|"9. νλ‘ λ°ν"| E
C -.->|"μ΅λ μ°κ²° μ<br/>μ΄κ³Ό μ λκΈ°"| C
E -.->|"InitialSize: 5<br/>MaxTotal: 10"| E
style A fill:#e1f5ff
style B fill:#fff4e6
style C fill:#fff4e6
style D fill:#ffe6e6
style E fill:#e6ffe6
style F fill:#f0e6ffMermaid
볡μ¬
ꡬ쑰λ μ€λͺ
β’
Application (μ ν리μΌμ΄μ
): νλ‘κ·Έλ¨ μ½λμμ DB μ°κ²°μ΄ νμν λ DBCPμ μμ²
β’
BasicDataSource: DBCPμ ν΅μ¬ ν΄λμ€λ‘, μ°κ²° νμ κ΄λ¦¬νλ μ§μ
μ
β’
GenericObjectPool: μ€μ 컀λ₯μ
κ°μ²΄λ€μ ν(Pool)λ‘ κ΄λ¦¬νλ λ΄λΆ ꡬ쑰
β’
Idle Connections (λκΈ° μ°κ²°): μ¬μ©λμ§ μκ³ νμμ λκΈ° μ€μΈ μ°κ²°λ€
InitialSize: μ΄κΈ°μ μμ±λλ μ°κ²° κ°μ
MaxTotal: νμμ μ μ§ν μ μλ μ΅λ μ°κ²° κ°μ
β’
Active Connections (νμ± μ°κ²°): νμ¬ μ ν리μΌμ΄μ
μμ μ¬μ© μ€μΈ μ°κ²°λ€
β’
μ°κ²° νλ¦:
1.
getConnection() νΈμΆ β νμμ μ°κ²° κ°μ Έμ€κΈ°
2.
DB 쿼리 μ€ν
3.
close() νΈμΆ β μ°κ²°μ νλ‘ λ°ν (μ€μ λ‘ λ«μ§ μκ³ μ¬μ¬μ©)




