|
@@ -0,0 +1,140 @@
|
|
|
+package com.its.op.scheduler.job;
|
|
|
+
|
|
|
+import com.its.op.dao.repository.its.database.TbDbSvrSttsRepository;
|
|
|
+import com.its.op.dto.its.database.TbDbSvrSttsDto;
|
|
|
+import com.its.op.entity.its.database.TbDbSvrStts;
|
|
|
+import com.its.utils.ItsUtils;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.scheduling.annotation.Async;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.StopWatch;
|
|
|
+
|
|
|
+import javax.annotation.PostConstruct;
|
|
|
+import java.sql.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@AllArgsConstructor
|
|
|
+@Service
|
|
|
+public class DbSvrSttsJobThread {
|
|
|
+
|
|
|
+ private final TbDbSvrSttsRepository dbSvrSttsRepo;
|
|
|
+ private final String JDBC_DRIVER = "com.tmax.tibero.jdbc.TbDriver";
|
|
|
+ private final String username = "sys";
|
|
|
+ private final String password = "tibero";
|
|
|
+
|
|
|
+ @PostConstruct
|
|
|
+ private void init() {
|
|
|
+ log.info("{}", this);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Async("schJobExecutor")
|
|
|
+ public void run() {
|
|
|
+
|
|
|
+ log.info("START: DbSvrSttsJobThread.run: {}", Thread.currentThread().getName());
|
|
|
+
|
|
|
+ StopWatch stopWatch = new StopWatch();
|
|
|
+ stopWatch.start();
|
|
|
+
|
|
|
+ List<TbDbSvrSttsDto> result = new ArrayList<TbDbSvrSttsDto>();
|
|
|
+ List<TbDbSvrStts> dbms = this.dbSvrSttsRepo.findAll();
|
|
|
+ dbms.forEach(db -> {
|
|
|
+ try {
|
|
|
+ TbDbSvrSttsDto dto = executeDbSvrStts(db);
|
|
|
+ result.add(dto);
|
|
|
+ }
|
|
|
+ catch(Exception e) {
|
|
|
+ log.error("run: Exception, {}, {}", db.getDbSvrId(), e.getMessage());
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 결과 저장
|
|
|
+ result.forEach((obj) -> {
|
|
|
+ this.dbSvrSttsRepo.updateStts(obj.getDbSvrId(), obj.getTblsNm(), obj.getTblsRmndCpct(), obj.getUseSesn(), obj.getUpdtDt());
|
|
|
+ });
|
|
|
+ stopWatch.stop();
|
|
|
+ log.info("--END: DbSvrSttsJobThread.run: {}, {} ms.", Thread.currentThread().getName(), stopWatch.getTotalTimeMillis());
|
|
|
+ }
|
|
|
+
|
|
|
+ TbDbSvrSttsDto executeDbSvrStts(TbDbSvrStts db) throws SQLException {
|
|
|
+ TbDbSvrSttsDto dto = db.toDto();
|
|
|
+ String dbUrl = String.format("jdbc:tibero:thin:@%s:%s:%s", db.getDbSvrIp(), db.getDbSvrPort(), db.getDbSvrSid());
|
|
|
+ String sql1 =
|
|
|
+ "SELECT A.TABLESPACE_NAME AS TBLS_NM, " +
|
|
|
+ " 100 - ROUND((A.TOTAL - NVL(B.FREE,0))*100/TOTAL,2) AS TBLS_RMND_CPCT " +
|
|
|
+ " FROM (SELECT X.TABLESPACE_NAME, ROUND((SUM(X.BYTES)/1024/1024),0) AS TOTAL " +
|
|
|
+ " FROM DBA_DATA_FILES X " +
|
|
|
+ " GROUP BY X.TABLESPACE_NAME) A, " +
|
|
|
+ " (SELECT Y.TABLESPACE_NAME, ROUND((SUM(Y.BYTES)/1024/1024),0) AS FREE " +
|
|
|
+ " FROM DBA_FREE_SPACE Y " +
|
|
|
+ " GROUP BY Y.TABLESPACE_NAME) B " +
|
|
|
+ " WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME(+) " +
|
|
|
+ " AND A.TABLESPACE_NAME IN ( 'ITS_HIST_DATA' " +
|
|
|
+ " , 'ITS_HIST_INDX' " +
|
|
|
+ " , 'ITS_TBS_DATA' " +
|
|
|
+ " , 'ITS_TBS_INDX' " +
|
|
|
+ " , 'UTIS_HIST_DATA' " +
|
|
|
+ " , 'UTIS_HIST_INDX' " +
|
|
|
+ " , 'X' " +
|
|
|
+ " , 'Y' " +
|
|
|
+ " , 'D' " +
|
|
|
+ " , 'D' " +
|
|
|
+ " , 'D' " +
|
|
|
+ " )";
|
|
|
+
|
|
|
+ String sql2 =
|
|
|
+ "SELECT ROUND(RUNNING / TOTAL * 100, 1) AS USE_SESN " +
|
|
|
+ " FROM (SELECT COUNT(1) AS TOTAL, SUM(DECODE(STATUS, 'RUNNING', 1, 0)) AS RUNNING FROM v$session)";
|
|
|
+
|
|
|
+ Connection conn = null;
|
|
|
+ try {
|
|
|
+ Class.forName(this.JDBC_DRIVER);
|
|
|
+ conn = DriverManager.getConnection(dbUrl, this.username, this.password);
|
|
|
+
|
|
|
+ String TBLS_NM = "";
|
|
|
+ double TBLS_RMND_CPCT = 100.0;
|
|
|
+ PreparedStatement stmt1 = conn.prepareStatement(sql1);
|
|
|
+ ResultSet rs1 = stmt1.executeQuery();
|
|
|
+ while(rs1.next()) {
|
|
|
+ String tblsNm = rs1.getString("TBLS_NM");
|
|
|
+ Double tblsRmndCpct = rs1.getDouble("TBLS_RMND_CPCT");
|
|
|
+ if (TBLS_RMND_CPCT > tblsRmndCpct) {
|
|
|
+ TBLS_NM = tblsNm;
|
|
|
+ TBLS_RMND_CPCT = tblsRmndCpct;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dto.setTblsNm(TBLS_NM);
|
|
|
+ dto.setTblsRmndCpct(String.valueOf(TBLS_RMND_CPCT));
|
|
|
+ rs1.close();
|
|
|
+ stmt1.close();
|
|
|
+
|
|
|
+ PreparedStatement stmt2 = conn.prepareStatement(sql2);
|
|
|
+ ResultSet rs2 = stmt2.executeQuery();
|
|
|
+ while(rs2.next()) {
|
|
|
+ Double useSesn = rs2.getDouble("USE_SESN");
|
|
|
+ dto.setUseSesn(String.valueOf(useSesn));
|
|
|
+ }
|
|
|
+ rs2.close();
|
|
|
+ stmt2.close();
|
|
|
+ }
|
|
|
+ catch(SQLException e) {
|
|
|
+ log.error("executeDbSvrStts: SQLException, {}, {}", db.getDbSvrIp(), e.getMessage());
|
|
|
+ throw new RuntimeException(e.getMessage(), e);
|
|
|
+ }
|
|
|
+ catch (ClassNotFoundException e) {
|
|
|
+ log.error("executeDbSvrStts: ClassNotFoundException, {}, {}", db.getDbSvrIp(), e.getMessage());
|
|
|
+ throw new RuntimeException(e.getMessage(), e);
|
|
|
+ }
|
|
|
+ finally {
|
|
|
+ if (conn != null) {
|
|
|
+ conn.close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ dto.setUpdtDt(ItsUtils.getSysTime());
|
|
|
+ return dto;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|