개발 무지렁이

[Java] JDBC드라이버 의존성을 추가하고, Connection 객체를 생성해 ConnectionPool 구현하기 본문

Backend/자바

[Java] JDBC드라이버 의존성을 추가하고, Connection 객체를 생성해 ConnectionPool 구현하기

Gaejirang-e 2023. 8. 6. 19:32

⭐.ConnectionPool.java

  public class ConnectionPool {
      private List<Connection> connectionpool;
      private List<Connection> usedConnections = new ArrayList<>();
      static ResourceBundle rb;
      private static int INITIAL_POOL_SIZE = 3;

      static {
          rb = null;
          rb = ResourceBundle.getBundle("mysql", Locale.KOREA);
          try {
              Class.forName("com.mysql.cj.jdbc.Driver");
          } catch (ClassNotFoundException e) {
              e.printStackTrace();
          }
      }

      public ConnectionPool(List<Connection> connectionPool) {
          this.connectionPool = connectionPool;
      }

      // Connection 객체 create
      private static Connection createConnection(String url, String user, String password) thorows SQLException {
          return DriverManager.getConnection(url, user, password);
      }

    // ConnectionPool create (INTIAL_POOL_SIZE만큼의 크기를 가지는)
      public static ConnectionPool create() throws SQLException {
          String url = rb.getString("url");
          String user = rb.getString("user");
          String password = rb.getString("password");

          List<Connection> pool = new ArrayList<>(INITIAL_POOL_SIZE);
          for(int i = 0; i < INITIAL_POOL_SIZE; i++) { //POOL_SIZE만큼의 Connection 객체를 미리 만들어 놓는다.
            pool.add(createConnection(url, user, password));                                                        
        }
        return new ConnectionPool(pool); //connectionPool 멤버필드 초기화
      }

    public Connection getConnection() { //db와 연결
        Connection connection = connectionPool.remove(connectionPool.size()-1); //사용되고 있는 Connection 객체를 connectionPool에서 빼주고,
        userConnections.add(connection); //사용되고 있는 Connection 객체를 더해준다
        return connection; //연결에 성공하면 연결된 Connection 객체를 반환, 이 객체를 사용하여 db와 통신 가능
    }

    public boolean releaseConnection(Connection connection) {
        connectionPool.add(connection); //사용된 Connection객체를 connectionPool에 반환
        return usedConnections.remove(connection);
    }

    public int getSize() { //전체 Connection객체 수
        return connectionPool.size() + usedConnections.size();                                                            
    }

    public int getUseSize() { //사용 가능한 Connection객체 수
        return connectionPool.size();                                                            
    }
  }

⭐. resources/mysql.properties

  url=jdbc:mysql://localhost:3306/shopdb?useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Seoul
  user=user01
  password=123456
> 🦔 ResourceBundle은 텍스트 리소스를 관리해주는 클래스다 (with 다국어 지원)
properties 파일에 저장된 텍스트 리소스를 로드하여 애플리케이션에서 사용할 수 있게 해준다. ResourceBundle.getBundle("mysql", Locale.KOREA); // 📂resources 디렉터리 내부에 있는 파일을 감지

> 🦔 DriverManager는 'JDBC드라이버'를 관리하는 클래스다.
JDBC드라이버를 등록 및 데이터베이스와 연결생성하고 관리한다.

☁️ JDBC 드라이버 의존성 추가 in Maven🦣
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
  </dependency>
Comments