728x90
두 경우 모두 FactoryDao를 사용한다고 가정한다.
FactoryDao는 싱글톤 패턴을 적용했다. 따라서 getInstance, getConnection, close 함수가 존재한다.
필요할 때마다 DB Connection 생성해서 사용하기
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class FactoryDao {
private final String driverName = "com.mysql.cj.jdbc.Driver";
private final String url = "jdbc:mysql://127.0.0.1:3306/스키마이름?serverTimezone=UTC";
private final String user = "아이디";
private final String pass = "비밀번호";
private static FactoryDao instance = new FactoryDao();
private FactoryDao() {
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static FactoryDao getInstance() {
return instance;
}
public Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, pass);
}
public void close(AutoCloseable... closeables) {
for (AutoCloseable c : closeables) {
if (c != null) {
try {
c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
미리 DB Connection Pool 생성해서 사용하기
이 방식을 사용하려면 꼭! close를 하는 것에 유의해야 한다. 앞의 방식도 close가 필요하지만, 이 방식은 한정된 pool을 빌려쓰는 개념이기 때문에 close를 하지않으면 다음 connection 얻는 게 불가능하다.
앞의 방식에서 달라진 점만 짚어보려고 한다.
먼저 driverName, url, user정보를 class 내부에 설정하지 않는다.
META-INF 내의 context.xml에 이렇게 설정한다.
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="설정이름" auth="Container" type="javax.sql.DataSource"
maxTotal="100" maxIdle="30" maxWaitMillis="10000"
username="아이디" password="비밀번호" driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/스키마이름?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8"/>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
FactoryDao의 getConnection()부분을 변경한다. 기본생성자에는 아무 내용이 없어도 상관 없다.
private FactoryDao() {}
public Connection getConnection() throws SQLException {
try {
Context context = new InitialContext();
Context rootContext = (Context) context.lookup("java:comp/env");
DataSource dataSource = (DataSource) rootContext.lookup("설정이름");
return dataSource.getConnection();
} catch (NamingException e) {
e.printStackTrace();
}
return null;
}
'기록 > BACKEND' 카테고리의 다른 글
[WEB] 파라미터와 어트리뷰트 (0) | 2022.04.04 |
---|---|
[WEB] 요청과 응답의 Scope (0) | 2022.04.04 |
[WEB] Servlet (0) | 2022.03.29 |
[WEB] MVC Pattern (0) | 2022.03.29 |
[WEB] DTO Pattern (0) | 2022.03.28 |
댓글