db에 path 라는 컬럼 안에 디렉토리 경로가 적재되어 있다.
실제 path 컬럼안에 있는 경로로 가면 파일이 적재되어 있다.
여기서 디렉토리는 하나의 디렉토리(구분 없음)에 모여 있다.
EXT는 총 10자리로 앞에 8자리는 YYYYMMDD 이다.
앞 YYYYMMDD 를 db에서 가지고 와서 해당 디렉토리를 생성 후,
디렉토리를 해당 경로에 다운로드하고,
db에 적재된 디렉토리 경로를 수정하는 코드이다.
conn은 타솔루션의 연결 정보이다.
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
public class UpdateBatch {
Connection conn = null;
ResultSet rs = null;
PreparedStatement psmt = null;
private int count = 0;
private static final int THREAD_COUNT = 8;
private static final Logger logger = LogManager.getLogger(InsertBatch.class);
private String dbUrl;
private String dbUser;
private String dbPassword;
private String start_date;
private String end_date;
private String volumeId;
public static void main(String args[]) {
Configurator.initialize(null, "/home/xtorm/DeleteBatch/log4j2.xml");
InsertBatch dc = new InsertBatch();
dc.initializeDbProperties();
dc.selectEXT();
dc.discon();
logger.info("총 업데이트 수 :" + dc.getCount());
}
private void initializeDbProperties() {
try (FileInputStream fis = new FileInputStream("../conf/db.properties")) {
Properties prop = new Properties();
prop.load(fis);
this.dbUrl = prop.getProperty("url");
this.dbUser = prop.getProperty("user");
this.dbPassword = prop.getProperty("passwd");
this.start_date=prop.getProperty("start_date");
this.end_date = prop.getProperty("end_date");
this.volumeId = prop.getProperty("volumeid");
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void selectEXT() {
ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
List<String> EXTList = new ArrayList<>();
try {
logger.info("DB 연결 시도... url: " + dbUrl + " user: " + dbUser + " pwd: " + dbPassword);
conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
logger.info("DB 연결 성공!");
System.out.println(start_date + " ~ " + end_date);
String sql = "SELECT EXT FROM EXT2 WHERE EXT BETWEEN ? AND ? AND VOLUMEID = ?";
try {
psmt = conn.prepareStatement(sql);
psmt.setString(1, start_date);
psmt.setString(2, end_date);
psmt.setString(3, volumeId);
rs = psmt.executeQuery();
while (rs.next()) {
EXTList.add(rs.getString("EXT"));
}
logger.info("전체 대상 건수: " + EXTList.size());
System.out.println("전체 대상 건수: " + EXTList.size());
for (String EXT : EXTList) {
// Runnable을 메서드 호출로 생성
Runnable task = createDownloadTask(EXT);
executor.submit(task);
}
} catch (SQLException e) {
logger.error("SQLException occurred", e);
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
logger.error("SQLException while closing ResultSet", e);
}
}
if (psmt != null) {
try {
psmt.close();
} catch (SQLException e) {
logger.error("SQLException while closing PreparedStatement", e);
}
}
}
} catch (SQLException e) {
logger.error("SQLException occurred", e);
} finally {
executor.shutdown();
while (!executor.isTerminated()) {
// 스레드 풀 종료 대기
}
}
}
// Runnable을 생성하는 메서드
private Runnable createDownloadTask(final String EXT) {
return new Runnable() {
@Override
public void run() {
download(EXT);
}
};
}
private void download(String EXT) {
String downPath = "/home/data/" + EXT.substring(0, 8) + "/0/" + EXT;
File file = new File(downPath).getParentFile();
if (!file.exists()) {
if (file.mkdirs()) {
System.out.println("Directory created: " + file.getAbsolutePath());
} else {
System.out.println("Failed to create directory: " + file.getAbsolutePath());
}
}
int ret = uePage1.getContent(downPath);
try (Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword)) {
updateDownPathToDB(conn, EXT, downPath);
} catch (SQLException e) {
logger.error("SQLException while updating DB", e);
}
}
con.close();
}
private synchronized void updateDownPathToDB(Connection conn, String EXT, String downPath) {
if (downPath.contains(EXT)) {
String sql = "UPDATE EXT2 SET path = ? WHERE EXT = ? and volumeid = ?";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, downPath);
stmt.setString(2, EXT);
stmt.setString(3, volumeId);
int rowsUpdated = stmt.executeUpdate();
if (rowsUpdated > 0) {
logger.info("File path updated for EXT: " + EXT);
incrementCount(); // update count 총 건수 측정
}
} catch (SQLException e) {
e.printStackTrace();
}
} else {
logger.warn("File path does not contain EXT. Update skipped for EXT: " + EXT);
}
}
private synchronized void incrementCount() {
this.count++;
}
public int getCount() {
return count;
}
private void discon() {
if (con != null) {
con.close();
con = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
public class UpdateBatch {
Connection conn = null;
ResultSet rs = null;
PreparedStatement psmt = null;
private int count = 0;
private static final int THREAD_COUNT = 8;
private static final Logger logger = LogManager.getLogger(InsertBatch.class);
private String dbUrl;
private String dbUser;
private String dbPassword;
private String start_date;
private String end_date;
private String volumeId;
public static void main(String args[]) {
Configurator.initialize(null, "/home/xtorm/DeleteBatch/log4j2.xml");
InsertBatch dc = new InsertBatch();
dc.initializeDbProperties();
dc.selectEXT();
dc.discon();
logger.info("총 업데이트 수 :" + dc.getCount());
}
private void initializeDbProperties() {
try (FileInputStream fis = new FileInputStream("../conf/db.properties")) {
Properties prop = new Properties();
prop.load(fis);
this.dbUrl = prop.getProperty("url");
this.dbUser = prop.getProperty("user");
this.dbPassword = prop.getProperty("passwd");
this.start_date=prop.getProperty("start_date");
this.end_date = prop.getProperty("end_date");
this.volumeId = prop.getProperty("volumeid");
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void selectEXT() {
ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
List<String> EXTList = new ArrayList<>();
try {
logger.info("DB 연결 시도... url: " + dbUrl + " user: " + dbUser + " pwd: " + dbPassword);
conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
logger.info("DB 연결 성공!");
System.out.println(start_date + " ~ " + end_date);
String sql = "SELECT EXT FROM EXT2 WHERE EXT BETWEEN ? AND ? AND VOLUMEID = ?";
try {
psmt = conn.prepareStatement(sql);
psmt.setString(1, start_date);
psmt.setString(2, end_date);
psmt.setString(3, volumeId);
rs = psmt.executeQuery();
while (rs.next()) {
EXTList.add(rs.getString("EXT"));
}
logger.info("전체 대상 건수: " + EXTList.size());
System.out.println("전체 대상 건수: " + EXTList.size());
for (String EXT : EXTList) {
// Runnable을 메서드 호출로 생성
Runnable task = createDownloadTask(EXT);
executor.submit(task);
}
} catch (SQLException e) {
logger.error("SQLException occurred", e);
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
logger.error("SQLException while closing ResultSet", e);
}
}
if (psmt != null) {
try {
psmt.close();
} catch (SQLException e) {
logger.error("SQLException while closing PreparedStatement", e);
}
}
}
} catch (SQLException e) {
logger.error("SQLException occurred", e);
} finally {
executor.shutdown();
while (!executor.isTerminated()) {
// 스레드 풀 종료 대기
}
}
}
// Runnable을 생성하는 메서드
private Runnable createDownloadTask(final String EXT) {
return new Runnable() {
@Override
public void run() {
download(EXT);
}
};
}
private void download(String EXT) {
String downPath = "/home/data/" + EXT.substring(0, 8) + "/0/" + EXT;
File file = new File(downPath).getParentFile();
if (!file.exists()) {
if (file.mkdirs()) {
System.out.println("Directory created: " + file.getAbsolutePath());
} else {
System.out.println("Failed to create directory: " + file.getAbsolutePath());
}
}
int ret = uePage1.getContent(downPath);
try (Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword)) {
updateDownPathToDB(conn, EXT, downPath);
} catch (SQLException e) {
logger.error("SQLException while updating DB", e);
}
}
con.close();
}
private synchronized void updateDownPathToDB(Connection conn, String EXT, String downPath) {
if (downPath.contains(EXT)) {
String sql = "UPDATE EXT2 SET path = ? WHERE EXT = ? and volumeid = ?";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, downPath);
stmt.setString(2, EXT);
stmt.setString(3, volumeId);
int rowsUpdated = stmt.executeUpdate();
if (rowsUpdated > 0) {
logger.info("File path updated for EXT: " + EXT);
incrementCount(); // update count 총 건수 측정
}
} catch (SQLException e) {
e.printStackTrace();
}
} else {
logger.warn("File path does not contain EXT. Update skipped for EXT: " + EXT);
}
}
private synchronized void incrementCount() {
this.count++;
}
public int getCount() {
return count;
}
private void discon() {
if (con != null) {
con.close();
con = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
처음 사용해보는 thread라서 안 맞는 게 많을 수 있다.
'Java' 카테고리의 다른 글
| 암호화 알고리즘 (1) | 2026.01.31 |
|---|---|
| [java] 통계 시스템 제작 # 01 (0) | 2025.07.09 |
| [Java] thread 생성 방식 - (Runnable + Thread) (1) | 2025.06.17 |
| [java] 서버에서 db2 데이터 이관 (0) | 2024.08.12 |