GitHub - DiUS/java-faker: Brings the popular ruby faker gem to Java
Brings the popular ruby faker gem to Java. Contribute to DiUS/java-faker development by creating an account on GitHub.
github.com
Java에서 테스트데이터를 편하게 만들때 사용할 수 있는 라이브러리다.
현재 중고차 판매시스템에서 중고차 100만대 회원 50만건을 만들어보려한다.
Faker 사용법은 위 링크를 참조하면 간단하게 사용할 수 있다.
문제점 1
커넥션 비용
@Test
void createCar() {
for (int i = 0; i < 300000; i++) {
Car car = Car.builder()
.carType(getRandom(carTypes))
.year(String.valueOf(faker.number().numberBetween(1990, 2023)))
.gasMileage(String.valueOf(faker.number().numberBetween(6, 21)))
.mileage(String.valueOf(faker.number().numberBetween(2000, 230000)))
.price(faker.number().numberBetween(100000, 2000000))
.fuel(getRandom(fuels))
.enginCondition(getRandom(conditions))
.exteriorCondition(getRandom(conditions))
.interiorCondition(getRandom(conditions))
.brand(getRandom(brands))
.status(PurchaseStatus.ON_SALE)
.registrationDate(LocalDateTime.now())
.build();
carDao.save(car);
}
}
carDao 객체를 통해 중고차를 하나하나 넣어보려했다.
문제점은 약 3만건 정도 쓰다가 서버가 죽어버린다.
아무래도 Connection을 30만건 모두 열었다 닫았다를 반복하기때문에 네트워크 비용이 매우 크다고 예상을했다.
그래서 커넥션 하나에 30만건을 모두 쓰기로 결정했다.
con.setAutoCommit(false)로 설정하고 한꺼번에 commit했다.
@Test
void createCars() throws SQLException {
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/used_car?useSSL=false", "", "");
for (int i = 0; i < 300000; i++) {
con.setAutoCommit(false);
String InsertQuery = " INSERT INTO cars(brand, car_type, year,gas_mileage, mileage, price, fuel," +
"exterior_condition, interior_condition, engine_condition," +
" status, registration_date)VALUES (?, ?, ?, ?, ?, ?, ?,?,?,?,?,?);";
PreparedStatement ps = con.prepareStatement(InsertQuery, PreparedStatement.RETURN_GENERATED_KEYS);
//Parameter Setting
ps.setString(1, getRandom(brands));
ps.setString(2, getRandom(carTypes));
ps.setString(3, String.valueOf(faker.number().numberBetween(1990, 2023)));
ps.setString(4, String.valueOf(faker.number().numberBetween(6, 21)));
ps.setString(5, String.valueOf(faker.number().numberBetween(2000, 230000)));
ps.setInt(6, faker.number().numberBetween(100000, 2000000));
ps.setString(7, getRandom(fuels));
ps.setString(8, getRandom(conditions));
ps.setString(9, getRandom(conditions));
ps.setString(10, getRandom(conditions));
ps.setString(11, PurchaseStatus.ON_SALE.name());
ps.setTimestamp(12, Timestamp.valueOf(LocalDateTime.now()));
ps.executeUpdate();
}
con.commit();
}
일단 서버가 죽지않고 30만건이 모두 잘 INSERT됐다.
커넥션을 열고 닫는다는것은 비용이 매우 비싸다는 사실을 인지해야한다.
DB에 커넥션하기위해선 TCP연결과같이 3-way handshaking 을 이용한 패킷교환이 이루어져야한다.
그래서 DBCP를 이용해 커넥션을 따로 생성해두는 이유다.
'Java' 카테고리의 다른 글
[WAS를 만들어보자 (3)] HttpMessageBody 추출하기 (1) | 2024.03.23 |
---|---|
[WAS를 만들어보자 (2)] HTTP 메세지 출력하기 (0) | 2024.03.23 |
[WAS를 만들어보자 (1)] 자바로 TCP/IP 통신하기 (0) | 2024.03.23 |
Exception Performance Cost (0) | 2023.07.05 |
사이드프로젝트::BlackJack 되돌아보기 (0) | 2023.04.27 |