일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 백준
- 토비의 스프링 정리
- Kotlin
- Stack
- mysql
- 보조스트림
- thread
- 자바
- Java
- JPA
- IntellJ
- GC
- Collection
- jvm
- K8s
- gradle
- 토비의 스프링
- 스프링
- MSA
- spring
- list
- 쿠버네티스
- OS
- 자바 ORM 표준 JPA 프로그래밍
- Real MySQL
- 스트림
- 이스티오
- Stream
- SpringBoot
- redis
- Today
- Total
목록분류 전체보기 (152)
인생을 코딩하다.

5장, 인덱스5.1 디스크 읽기 방식5.1.1 저장 매체서버에 사용되는 데이터를 저장할 수 있는 매체는 크게 3가지로 나뉜다.내장 디스크(Internal Disk)DAS(Direct Attached Storage)NAS(Network Attached Storage)SAN(Storage Area Nework)5.2 인덱스란?DBMS에서 인덱스는 데이터의 저장(INSERT, UPDATE, DELETE) 성능을 희생하고 그 대신 데이터의 읽기 속도를 높이는 기능이다. 인덱스를 역할로 구분해본다면 PK와 보조 키로 구분할 수 있다.PK : 레코드를 대표하는 칼럼의 값으로 만들어진 인덱스보조키 : PK를 제외한 나머지 모든 인덱스PK를 제외한 나머지 모든인덱스는 보조 인덱스라고 분류한다, 유니크 인덱스는 PK와 ..

트랜잭션과 잠금트랜잭션MySQL에서의 트랜잭션트랜잭션은 작업의 완전성을 보장해주는 것이다. 즉 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용 되는 현상이 발생하지 않게 만들어주는 기능이다. 트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합됐을 떄만 의미있는 개념은 아니다. 트랜잭션은 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이상의 쿼리가 있든 관계없이 논리적인 작업 셋 자체가 100% 적용되거나(COMMIT을 실행했을 때) 또는 아무것도 적용되지 않아야(ROLLBACK 또는 트랜잭션을 ROLLBACK 시키는 오류가 발생했을 때)함을 보장해 주는 것이다.주의사항일반적으로 데이터베이스 커넥션은 개수가 제한적이라서 각 단위..

MySQL 아키텍처 MySQL의 전체 구조 MySQL 서버는 크게 MySQL 엔진과 스토리지 엔진으로 구분해서 볼 수 있다. MySQL 엔진 클라이언트로부터 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 SQL파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룬다. 요청된 SQL 문장을 분석하거나 최적화하는 등 DBMS 두뇌에 해당하는 처리를 수행한다. 스토리지 엔진 실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분은 스토리지 엔진이 전담한다. MYSQL 서버에서 MySQL 엔진은 하나지만 스토리지 엔진은 여러개를 동시에 사용할 수 있다. 다음 예제와 같이 테이블이 사용할 스토리지 엔진을 지정하면 이후 테이블의 모든 읽기 작업이나 변경 작업은 정의..

Connection Pool을 사용하지 않으면, DB 서버 접속을 위한 과정을 HTTP요청이 있을 때마다 DB서버에 지속적으로 접근하는 작업이 반복적으로 필요하다. DB서버에 최초로 연결하여 Connection 객체를 생성는 작업은 비용적인 측면에서 큰 성능 저하를 이야기 한다. 이것이 반복되면 더 큰 성능 저하를 불러온다. 이와 같은 문제를 사전에 방지하기 위해 사용하는것이 바로 Connection Pool이다. Connection Pool은 WAS 실행시 일정량의 Connection 객체를 미리 생성하여 Pool 이라는 공간(캐시)에 저장해둔다. 그리고 DB연결 요청이 있을때 마다 Pool 에서 Connection 객체를 꺼내서 사용하고 사용이 끝나면 다시 Pool에 반납한다. 다들 여기까지는 보통 ..

커널 수준의 쓰레드 쓰레드 패키지를 운영체제에서 관리한다. 각 응용 프로그램들은 운영체제에 영향을 많이 받게 되므로 이식성이 낮다. 사용자 수준의 쓰레드 쓰레드 패키지를 사용자 영역에 두고 운영체제 커널은 단일 프로세스만을 관리한다. 쓰레드 패키지를 런타임 시스템에서 운영한다. 운영체제 입장에서는 런타임 시스템도 하나의 프로세스로 인식한다. 쓰레드를 운영하지 않는 운영체제제에서 실행할 수 있으므로 이식성이 뛰어나다. 쓰레드 운영 방식 @커널 수준의 쓰레드 @사용자 수준의 쓰레드 커널 개입이 크다. 커널 개입이 작다. 런 타임 시스템이 필요 없고 커널이 직접 한다. 런 타임 시스템이 필요하다. 속도가 느리다. 속도가 빠르다. 문맥 교환이 많다. 문맥 교환이 적다. 독자적 알고리즘이 필요없다. 독자적 알고리..

I/O작업이 blocking 방식으로 구현되면 하나의 클라이언트가 I/O작업을 진행하면 해당 쓰레드가 진행하는 작업을 중지하게 된다. 영향을 미치지 않게 하기 위해서 클라이언트 별로 Thread를 만들어 연결시켜주어야 한다. Thread가 많아지면 시간 할당량은 작아진다. 시간할당량이 작으면 동시에 수행되는 느낌을 가질 수 있다. 하지만 문제가 있다. 이 문제는 java 1.4이후로 NIO가 나오기 전 blocking I/O의 큰 단점이였다. 이 경우에 Thread 수는 접속자 수가 많아질 수록 Thread 수도 많아지게 된다. Thread가 많으면 CPU의 Context Switching 및 interrupt 횟수와 오버헤드 증가하게 된다. 이러한 것들이 발생할 때 cpu는 일하지 못한다. 때문에, 실..
프로세스가 수행 중에 다른 프로세스를 수행하기 위하여 현재 수행 중인 프로세스를 중단하거나 외부 입력장치에 의해 프로세스가 중단되는 상태를 인터럽트라고 한다. 사용자에 의해서 새로운 프로그램이 실행 될 때, 현재 실행 중인 프로세스의 상태를 잠시 중단하고, 새로운 프로그램을 실행 시키는 과정이다. 잠시 중단한 프로세스의 상태는 다시 실행을 시작하기 위해 중단되었던 시점의 정보를 저장한다. 인터럽트는 입출력 연산, 하드웨어 실패, 프로그램 오류 등에 의해서 발생한다. 인터러브가 발생한 경우, 진행 중인 프로그램의 재개에 필요한 레지스터 문맥을 저장한다. 레지스터 문맥은 PCB에 저장한다. 프로세스 상태 전이도 위의 그림에서 준비 상태, 실행 상태, 실행 상태 전, I/O 등 모든 중단 형태를 인터럽트라고 ..
블로킹 큐(Blocking Queues) 특정 상황에 쓰레드를 대기하도록 하는 큐이다. 큐에서 element를 빼려고 시도했는데(디큐) 큐가 비어있다거나, 큐에 엘레멘트를 넣으려 했는데(인큐) 큐에 넣을 수 있는 공간이 없다거나 할 때 디큐/인큐 호출 쓰레드를 대기하도록 한다. 비어있는 큐에서 엘레멘트를 빼려고 시도하는 쓰레드의 대기 상태는 다른 쓰레드가 이 큐에 element를 넣을 때까지 지속된다. 꽉 찬 큐에 element를 넣으려 시도하는 쓰레드의 대기 상태는 다른 쓰레드가 큐에서 element를 빼거나 큐를 정리하여(clean) 큐의 공간이 확보될 때까지 지속된다. 블로킹 큐는 put과 take라는 핵심 메소드를 갖고 있고, 더불어 offer와 poll이라는 메소드도 갖고 있다. 만약 큐가 가득..