結合DBC(MySQL、STS、Maven)—DBPP(HikariCP)


🚀 既存コードの問題
  public void select(){                
      String sql = "select * from tbl_board where bno > ?";   
        
      try {
      @Cleanup Connection connection=ConnectionUtil.INSTANCE.getConnection();
      @Cleanup PreparedStatement preparedStatement = connection.prepareStatement(sql);
      preparedStatement.setInt(1, 4);
      @Cleanup ResultSet resultSet = preparedStatement.executeQuery();
        
      while(resultSet.next()) {
            resultSet.getInt(1);
            resultSet.getString(2);
            resultSet.getString(3);
      }
        
      }catch(SQLException e) {
          e.printStackTrace();
      }        
  }

  • 上記のselectメソッドを使用するユーザーがいると仮定します.
  • ConnectionUtilのgetConnectionで新しい接続を受信します.
  • 保留中の作業が完了した場合は、接続(@Cleanup)を閉じます.
    一人で金庫に入って金を持って出る.

  • +同時に複数の人が接続していたら?
    百人が同時に金庫に入って、お金を持って出てきた.

  • +クエリー(select)のほか、短時間で他のクエリーも使用されます.
    ->誰かが送金して、照会して、振り込んで、また照会して...
    ->ただ「コード上」で、以上の4つの業務が金庫に入ってから、一度に完了するのではなく、金庫に入って送金し、出てから中に入って調べ、出てから中に入って振り替えて...

  • +1つのサービスが2つ以上のクエリー文で構成されている場合?
    -> ..?!??!
  • 🚀 データベース接続プール(DBPP)の使用理由
  • 上記の理由によるデータベースのオーバーロードを防止するため(エラーが発生する場合は再接続が必要)
  • .
  • インタフェースを所定数「予め」作成し、Poolを形成する.
  • は事前に作成されているので、生成に時間はかかりません.
  • poolで借りて、まだ・・・」再利用します.
  • が借りられないと「待機」状態になります.
  • ライブラリ
  • を追加
    <!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
    <dependency>
    	<groupId>com.zaxxer</groupId>
    	<artifactId>HikariCP</artifactId>
    	<version>5.0.0</version>
    </dependency>
  • 空登録
  • <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    	<property name="driverClassName"
    		 value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy">
            </property>
            
    	<property name="jdbcUrl" value="jdbc:log4jdbc:mysql://localhost:3306/****" >
    	</property>
        
    	<property name="username" value="****"></property>
    	<property name="password" value="****"></property>
    </bean>
    
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    	<constructor-arg ref="hikariConfig" />
    </bean>
  • ドライバが情報(url、id、pw)にロードおよび戻る接続を含む.
  • というデータソースの接続プール
  • を作成します.
  • 既存コードに対する修正
  • ConnectionUtil.Javaの削除
  • ドライバのロードとHikariConfigは関連情報を提供するため、
  • .
  • には、
  • という集合のデータソースがあります.

  • SampleDAOの変更

  • 登録されているdataSourceという空の自動インジェクションを単一ジェネレータに
    (@Component+@AllArgConstructor+component-scan(コードスキップ)

  • connection = dataSource.getConnection()
  • @Component
    @AllArgsConstructor
    public class SampleDAO {
        
        private DataSource dataSource;
        
        public void select(){                
            String sql = "select * from tbl_board where bno > ?";   
            
            try {
            @Cleanup Connection connection=dataSource.getConnection();
            @Cleanup PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, 4);
            @Cleanup ResultSet resultSet = preparedStatement.executeQuery();
            
            //생략
            
            }catch(SQLException e) {
                e.printStackTrace();
            }        
        }
    }
    
  • テストコードの変更
    既存のenumを使用して単一トーンを実現->beanを使用して
  • を実現
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})
    public class Tests {
        
        @Setter(onMethod_ = @Autowired)
        private SampleDAO dao;
        
        @Test
        public void test1() throws Exception {
            //SampleDAO.INSTANCE.select();
            dao.select();
        }
    }