일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- 자바
- 백준 알고리즘
- 문법 정리
- SQL
- dynamic query
- 학점
- 파이썬 소스
- 티스토리
- oracle
- MongoDB
- 초대장
- 프로젝트
- smart cast
- 알고리즘
- spring
- c#
- 운영체제
- 리눅스
- 오라클
- jsp
- JVM
- 유사코드
- 파이썬
- 오라클 디비
- hyperledger
- gradle
- auto configure
- 자바 프로젝트
- K6
- resilience4j
- Today
- Total
목록Programming/데이터베이스 (34)
모종닷컴
MySQL에서 사용되는 메모리 공간은 글로벌 메모리 영역과 로컬 메모리 영역으로 구분할 수 있다. 글로벌 메모리 영역의 모든 메모리 공간은 MySQL 서버가 시작되면서 운영체제로부터 할당된다. 운영체제에 따라 100퍼센트 할당해 줄 수도 있고, 공간을 예약만 해두고 필요할 때 조금씩 할당할 수도 있다. 글로벌 메모리 영역 글로벌 메모리 영역은 아래와 같이 이루어져 있다. 테이블 캐시 InnoDB 버퍼 풀 InnoDB 어댑티브 해시 인덱스 InnoDB 리두 로그 버퍼 클라이언트 스레드의 수와 무관하게 하나의 메모리 공간만 할당된다. 필요에 따라 2개 이상의 메모리 공간을 할당받을 수도 있지만, 클라이언트의 스레드 수와는 무관하며, 생성된 글로벌 영역이 N개라도 모든 스레드에 공유된다. 로컬 메모리 영역 로..
MySQL 스레딩 구조 MySQL 서버는 프로세스 기반이 아닌 스레드 기반으로 동작한다. 그리고 이 스레드는 크게 포그라운드 스레드와 백그라운드 스레드로 나뉜다. 41개의 백그라운드 스레드와 3개의 포그라운드 스레드로 총 44개의 스레드가 실행중이다. 위는 MySQL 서버가 전통적으로 가지고 있는 스레드 모델이며, 서버의 설정이나 어떤 에디션을 사용하는지에 따라 다를 수 있다. 포그라운드 스레드 = 클라이언트 스레드 MySQL 서버에 접속된 클라이언트의 수만큼 존재하며 클라이언트 사용자가 요청하는 쿼리 문을 처리 사용자가 작업을 마치고 커넥션을 종료하면 해당 커넥션을 담당하던 스레드는 스레드 캐시로 되돌아간다 스레드 캐시에 일정 개수 이상의 대기 중인 스레드가 있으면 스레드 캐시에 넣지 않고 스레드를 종..
MySQL 서버는 사람의 머리역할을 담당하는 MySQL 엔진과 손발 역할을 담당하는 스토리지 엔진으로 구분할 수 있다. 그리고 손과 발의 역할을 담당하는 스토리지 엔진은 핸들러 API를 만족하면 누구든지 스토리지 엔진을 구현해서 MySQL 서버에 추가해서 사용할 수 있다. MySQL 아키텍처 MySQL 서버는 일반적인 다른 DBMS에 비해 구조가 살짝 독특하다. 이러한 구조는 다른 DBMS에서는 가질 수 없는 이점도 있지만 반대로 문제가 되기도 한다. 아래의 사진에서 SQL 파서, SQL 옵티마이저, 캐시 & 버퍼, CRUD 인터페이스와 + 보이지는 않지만 커넥션 핸들러를 포함하여 MySQL 엔진이라 부르며, MySQL 엔진 + 스토리지 엔진 = MySQL 서버라 부른다. 아래 파일 시스템 부분은 운영체..
N+1 Selects 문제N+1 문제란 ? 조회를 위해 select 쿼리(1번)를 날렸다가 관련 컬럼을 얻기 위해 N번의 셀렉트(N번)를 하게 되는 상황. 같은 결과를 낼지라도, 그 쿼리를 수행하는데에 있어 몇 번의 쿼리를 해야하는지에 따라 성능이 달라진다. 마이바티스의 association에서 Nested Select, Nested Results를 예로 들 수 있다. Nested Select 는 결과에서 다시 한번 참조를 하기 위해 다음 Select구문을 실행하는 것을 말하고, Nested Results는 조인된 결과물에 대해 반복적으로 사용하여 결과를 맵핑하는 방법을 말한다. 예시를 보도록 하겠다. (참고 : http://www.mybatis.org/mybatis-3/ko/sqlmap-xml.html..
MyBatis Insert not working insert 구문을 계속 실행시켰지만 데이터베이스에 적용도 안되고 오류도 안나기에 무엇이 잘못된지 한참 찾아다녔다 결론적으로 SqlSession을 commit()시켜주니 적용이 되었는데, 당연히 JDBC처럼 auto commit이 되어있을 거란 생각을 했었다.. 궁금해서 코드를 따라가보니 일단 SqlSessionFactory는 DefaultSqlSessionFactory였고, 이 팩토리의 opensession(boolean autoCommit)부분을 쭈욱 따라가보니 DefaultSqlSession에서 autoCommit이 설정안되있다는 것을 알게되었다. autoCommit을 설정하고 싶다면 다음과 같이 sqlSession을 생성할 때 true로 설정해야한다
ACID Atomicity : 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장.Consistency : 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지.Isolation : 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것.Durabillity : 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함. 특히 격리성과 관련된 문제점들 중 대표적인 3가지가 아래에 있다. 격리성 관련 문제점 (1) Dirty Read : 다른 트랜잭션이 커밋되지 않은 변경된 데이터를 읽게되고, 변경된 데이터가 롤백으로 인해 변경 전으로 돌아갔지만, 이미 다른 트랜잭션이 변경된 데이터를 읽게 된 것. (2) Non-Repeatable Read ..
오라클XE를 설치하면 부팅시 자동으로 켜져서 은근히 불편함을 느끼게 된다.. 메모리도 많이 잡아먹고, 톰캣 포트랑도 엇갈려서 계속 바꿔주기도 귀찮고 ㅋ 시작 -> '서비스' 검색 -> OracleServiceXE 랑 OracleXETNSListener를 찾아서 자동에서 수동으로 변경시켜주자.
◆유저 액세스 제어 1.유저 생성(sys 계정으로 접속) Create user demo identified by demo; 2.권한 부여 grant create session , create table , create sequence ,create view to demo; 권한 부여를 할 때 매번 위와 같이 작성하는 것에 한계를 느낌 3.롤 생성 create role manager; 4.생성 롤에 권한 부여 grant create table, create view to manager; 5.테스트 create user alice identified by alice; grant manager to alice; 6.암호 변경 Alter user demo identified by employ; 7.객체 권한(n..
◆스키마 객체 관리 테이블 컬럼 삭제 alter table dept80 drop column job_id; 테이블 컬럼 변경 alter table dept80 modify last_name varchar2(30); 테이블 컬럼 추가 alter table dept80 add job_id varchar(9); unused : 데이터를 사용하지 않겠다고 설정.: 데이터가 사라지는 것은 아님. 데이터가 엄청 많을 때 지우는 시간동안 서비스가 제대로 이루어 지지 않기 때문에 나중에 삭제하려고 unused체크 alter table dept80 set unused (last_name); unused 체크한 것 삭제하기 alter table dept80 drop unused columns; 테이블 제약 조건 변경 AL..
◆시퀀스 시퀀스 = 정수 값을 생성하는 데이터베이스 객체 시퀀스 특징1) 고유 번호를 자동으로 생성 -> Primary key로 자주 사용2) 공유할 수 있는 객체3) 시퀀스 값이 메모리에서 캐시된 경우 엑세스 속도 향상 시퀀스 생성 Create sequence seq_emp increment by 1 – 부를 때마다1씩 증가 start with 1 –시작 번호는 1 maxvalue 100 –최대 값 100 nocache nocycle;--캐시를 사용하지 않고, 사이클을 사용하지 않음 시퀀스 확인 Select * from user_seqeunce 시퀀스 적용 Insert into t_emp values(seq_emp.nextval); --처음 실행하면 당연히 1이 들어감 Insert into t_emp ..