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 知彼知己百戰不殆
,

개발 환경 : 
  -SpringFramework 3.1.1. Release

1. applicationContext.xml 파일 설정(굵은/붉은 글씨들은 각자의 상황에 맞게 변경 가능한 변수명 개념)

<bean id ="dataSource1" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
  <property name="driverClass" vlaue="oracle.jdbc.OracleDriver"/>
  < property name="url" vlaue="jdbc:oracle:thin:@IP:PORT:SID"/>
  <property name="username" vlaue="아이디"/>
  <property name="password" vlaue="비밀번호"/>
</bean>

<bean id="dataSource2" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
  <property name="driverClass" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
  <property name="url" value="jdbc:sqlserver://IP:PORT;databaseName=데이터베이스명;trustServerCertificate=true"/>
  <property name="username" value="아이디"/>
  <property name="password" value="비밀번호"/>  
</bean>
 

<bean id="sqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource1"/>
  <property name="mapperLocations" value="classpath*:매퍼가 들어가 있는 패키지명/*.xml"/>
</bean>
<bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource2"/>
  <property name="mapperLocations" value="classpath*:2번째DB를 연결할 매퍼가 들어가 있는 패키지명/*.xml"/>
</bean>

<bean id="sqlSessionTemplate1" class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg ref="sqlSessionFactory1"></constructor-arg>
</bean>
<bean id="sqlSessionTemplate2" class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg ref="sqlSessionFactory2"></constructor-arg>
</bean>

<bean id="1MapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="1번 database연결할 패키지위치"/>
  <property name="sqlSessionTemplateBeanName" value="sqlSessionTemplate1"/>
</bean>
<bean id="2MapperScannerConfigurer" class="~~~>
  ~~~~
</bean>

<bean id="transactionManager1" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource1"/>
</bean>
<bean id="transactionManager2" class="~~나머지는 동일>
</bean>

<tx:annotation-driven transaction-manager="transactionManager1"/>
<tx:annotation-driven ~~동일/>

발생했던 오류 상황

1. 2번째 Database를 사용하는 mapper bean injection 시 2개의 sessionFactory가 발견되어 매칭 불가 상황

  => mapper에 2번째 DB sessionFactory를 강제 주입(Qualifier 어노테이션 이용)
<bean id="Mapper bean명" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="dataSource2를 사용하는 Mapper 인터페이스 위치"/>
  <property name="sqlSessionFactory" ref=sqlSessionFactory2"/>
</bean>
 그리고 mapper interface위에 Qualifier("Mapper bean명") 설정하여 해결 완료

Posted by 知彼知己百戰不殆
,

환경 : (Local) Oracle 11g,  (Remote) SQL Server 2019

 ORA-28545 : NET8 오류

ORA-28513 : 이기종 원격 대리 프로세스 내부에 오류가 발생

모두 내 실수였다.

1. tnsnames.ora에 IP와 PORT 정확한지 반드시 확인
    tnsnames.ora파일에서 HOST와 PORT는 remote SQL Server의 IP와 PORT가 아니라 자신(Oracle, Local) IP와 PORT

2. db_home/hs/admin/init{TNS명}.ora 파일의 확장자 확인
    (initdg4odbc.ora)파일을 그대로 복붙 했더니 오류났을 때의 파일명은 .ora.ora로 확장자가 2개가 들어가서 문제 발생.ㅠㅠ 정말 찾기 힘들었다.

Posted by 知彼知己百戰不殆
,

환경 : Oracle 11g (local),   SQL Server 2019(Remote),   Springfamework

필요사항 : Oracle에 입력된 데이터를 SQL Server로 insert

오류 : db link를 이용한 insert 시 ORA-02025 오류 발생

해결 : 1. SQL developer에서 db link를 이용하여 하드 코딩 후 단건 insert 시도 -> 성공
           2. SQL developer에서 db link를 이용하여 하드 코딩 후 Oracle DB에서 데이터 select 후 insert 시도 -> ORA-02025 오류 발생 
           3. " SQL 문의 모든 데이터베이스가 Oracle 서버인 경우에만 원격 업데이트를 수행할 수 있습니다. "라는 Oracle 홈페이지 내용 확인. https://docs.oracle.com/en/error-help/db/ora-02025/?r=23ai

 

ORA-02025 - Database Error Messages

The user's SQL statement references tables from multiple databases. The remote database is not Oracle V7 or above, and can perform updates only if it can reference all tables in the SQL statement.

docs.oracle.com

           4. table select 후 건건이 insert.... (일단 사용자 요구가 급해서 서비스 오픈 후 추후 수정해야 할 것 같다 ㅠㅠ)

Posted by 知彼知己百戰不殆
,

본점 라이센스가 SQL Server 2019라고 해서 부랴부랴 기존 셋팅된 것들을 2019로 그대로 이관해야 했다.

환경 : (local) SQL Server 2019
          (remote) Oracle 11g

기존에는 SQL Server 2022 -> Oracle 이었는데 이번엔 버전이 다운된 2019에서 Oracle이었다.

2019랑 2022는 크게 바뀐 내용이 없어서 별 문제 없겠지 했는데, 또 linked server 설정 시 무한 에러 발생 ㅠㅠㅠ

7302 오류 발생 ㅠㅠ.....

4일간 삽질 후 일단 작년에 Local PC에 Oracle 설치 시 64bit로 설치했는데, 이번 설치는 32bit로 설치가 돼있었다.(당연히 64bit 파일이겠거니....)

SQL Server 7302 Error code 발생 시

1. SQL Server에 설치한 Oracle Client bit 확인

2. SSMS -> Provider -> OraOLEDB.Oracle 속성 -> Allow InProcess 체크 확인

Posted by 知彼知己百戰不殆
,

대고객 문자 발송 시스템 개발 중 트랜잭션 설계를 하며 트랜잭션 전파 속성, DB pessimistic lock 을 테스트 중이다.

삽질 내용 : 로직(Required) 윗단에 for update wait로 lock을 잡아놓고 밑에 DB update 로직을 REQUIRES_NEW로 처리하면 당연히 될거라 생각. 그런데 계속 멈춤 현상이 발생. 왜 그럴까 생각해보니 이미 한 트랜잭션에서 select lock을 잡아놓고 새로운 트랜잭션에서 Update를 하려고 하니 당연히 lock 걸려 있으니 안되는게 정상...

DB pessimistic lock 기능 잘 작동되네...ㅋ

Posted by 知彼知己百戰不殆
,

상황 : local Database임에도 불구하고 sqlplus / as sysdba 접속 시 insufficient privilege 에러가 발생

해결 : 유저&그룹(Users and Groups) 들어가서 Users 폴더의 현재 실행중인 계정 속성창에서 
          Member Of(그룹) 탭에서 Add 버튼 클릭, advanced 클릭, Find Now 클릭, Search results에서 
         ora_dba 추가

Posted by 知彼知己百戰不殆
,

문제 : 스프링프레임워크를 사용 중인 프로젝트에서 오류 발생 시 rollback 처리가 되지 않음

원인 분석:
1. 메소드에 transactional 어노테이션이 추가되어 있으므로 당연히 오류 발생 시 rollback 될거라 생각했으나, 일단 기본 어노테이션 속성은 예기치 못한 오류에 대해서 rollback하므로 어노테이션에 rollback속성 지정
2. rollback 속성을 지정했음에도 rollback이 실행되지 않았고, 그대로 DB update로 이어짐
3. transaction이 생성되지 않고 그냥 처리된단 생각이 들어 application-context.xml 확인

해결 방안 : <tx:annotation-driven transaction-manager="transactionManager"/> 설정이 없어 추가

참고: annotation-driven: 등록된 bean 중 transactional 어노테이션이 붙은 것들에 transaction 적용

Posted by 知彼知己百戰不殆
,