Java home 설정

OS/Mac OS 2025. 3. 11. 23:57

home directory의 .bash_profile 파일 설정

.bash_profile 파일
JAVA_HOME
=$(/usr/libexec/java_home -v 1.8.202.08)
PATH=$PATH$JAVA_HOME/bin
export JAVA_HOME
export PATH

.zshrc 파일
(추가) export JAVA_HOME=$(/usr/libexec/java_home -v 1.8.202.08)

기존 java 21버전에서 1.8 버전으로 변경

'OS > Mac OS' 카테고리의 다른 글

[오류] Spring Tool Suite4 Lombok 설치  (0) 2023.04.29
SpringToolSuite4 can't be opened 오류  (0) 2023.03.27
Mac 부하테스트(stress test)  (0) 2020.12.27
Eclipse for mac OS Catalina  (0) 2019.12.02
MACOS Sieera able to Unidentified Apps  (0) 2018.01.22
Posted by 知彼知己百戰不殆
,

환경 : Springframework 3.1.1 Release, Oracle 11g Database, JDK 1.8, mybatis

오류 발생 상황:
대량 text 파일 데이터 (약 118만 row)를 read 후 database insert 테스트 시 종종 일정 개수만 insert 후 더 이상 진행 불가 현상 발생. lock 확인 해 보니 v$session 테이블의 WAIT_CLASS 컬럼에 Concurrency가 찍혀있었고, v$session_blockers테이블의 WAIT_EVENT_TEXT 컬럼에 library cache: mutex X 가 찍힘.

원인 : 다양한 원인이 있으나 Bulk insert로 진행하더라도 (3000건씩 insert 하도록 했었음) 394번이 넘는 insert를 해야해서 Hard Pasing쪽이 큰 원인으로 판단

해결 : 일반 sqlSessionTemplate에서 진행하지 않고, insertBatch를 활용하여 insert.
          applicationContext.xml에 Batch로 진행할 sqlSessionTemplate bean을 하나 더 생성해준 후 Executortype을 BATCH로 설정. service 단에서 batch템플릿을 injection 후 
         sqlSessionTemplateBatch(내가 설정한 변수명).insert("mapper의 namespace.메소드명", insert파라미터); 
        그리고 파일 1개당 batch flush를 해주기 위해 파일 하나가 끝날 때마다 sqlSessionTemplateBatch.flushStatements();호출
 batch insert 실행 시 10만건에 3~4초 시간 소요.

Posted by 知彼知己百戰不殆
,

개발환경 :
  - SpringFramework 3.1.1. Release
  - JDK1.8

순수 java code에서 사용할 땐 ThreadPoolExecutor을 사용했으나, 현재 프로젝트는 Spring을 사용하고 있기에 Spring에서 관리가 가능한 ThreadPoolTaskExecutor을 적용하며 OOM이 나지 않기 위해 각 스레드에서 mybatis의 resultHandler를 사용하기로 함

해당 기능 적용 목적 : 문자 발송이 승인된 건은 문자 발송할 양에 따라 쓰레드 개수를 나눠서 분할 처리
(단일 스레드 처리 시 약 13만건 발송 시 22시간 소요) => 분할처리 적용 후 약 13만 건 발송 시 4시간 30분 소요 대략 80%정도의 시간 감소 효과 발생

1. applicationContext.xml 설정
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
  <property name="corePoolSize" value="지정 스레드수"/>
  <property name="queueCapacity" value="태스크 대기 수"/>
  (이외에도 maxPoolSize 등 다른 설정할 것이 있으니 따로 확인)
</bean>

2. java Service.java 
@Autowired
private ThreadPoolTaskExecutor taskExecutor; 

(개인 프로젝트가 아니라 필요한 부분만 발췌하여 간략히 작성)
public void sendSMS() {
~~~ 처리할 양에 따른 적용할 스레드 수 계산로직 ~~~
taskExecutor.setCorePoolSize(스레드 수);
for(~~~~) {
  taskExecutor.submit(new SMSThread(필요한 파라미터 변수));
}
}

3. SMSThread.java
Runnable 인터페이스 구현
public void run() {
  mapper.selectSMSHandler(~~, new ResultHandler() {
   @Override
   public void handleResult(ResultContext context) {
     try {
        SMSdto rowData = (SMSdto) context.getResultObject();
        ~~~ row별로 읽은 데이터 처리 로직 ~~~
     } catch () {}
   }
});

 

[발생했던 문제]

1. ResultHandler를 사용했으나 오류 로그도 안 남고(? 정확하게 기억이 안남 ㅠㅠ) 읽은 row에 대해 처리 로직 수행이 안되는 경우
  => ResultHandler 안에서 try catch 구문을 사용하여 오류 확인. 기존에 테스트를 하며 현재 사용 안하는 변수가 있었는데 해당 변수에서 값을 참조하여 log찍는 곳에서 오류 발생하여 해당 변수 삭제.

2. 1건에 대한 처리는 완벽하게 수행되나 2건 째부터는 TaskRejectedExeption 발생
  => 태스크 대기 큐 설정을 안해서 그런 줄 알고 remainingCapacity()를 찍어보았으나 해당 없음.(0은 대기 큐 미사용이었으나 나의 경우 2로 출력)
       shutdown 메소드를 사용한 경우 추가적인 태스크를 받을 수 없다는 걸 확인. isShutDown()메소드로 확인 해봤더니 true로 출력....? 코드를 봤더니 기존 java 프로젝에서 테스트 하던 코드를 그대로 들고왔던 곳에서 shutdown 코드가 남아있는 것을 발견. 해당 코드 삭제 후 대기 큐에 정상적으로 들어와서 처리 완료된 것 확인

Posted by 知彼知己百戰不殆
,