2021년 12월 21일 화요일

오라클SQL튜닝도구 Autotrace, 실행계획, 통계정보, db block gets vs consistent gets, 읽기일관성,Current Mode, 오라클교육/오라클교육/자바교육/자바학원/오라클학원/ORACLe동영상

 

오라클SQL튜닝도구 Autotrace, 실행계획, 통계정보, db block gets vs consistent gets, 읽기일관성,Current Mode, 오라클교육/오라클교육/자바교육/자바학원/오라클학원/ORACLe동영상


http://ojc.asia/bbs/board.php?bo_table=LecOrccleTun&wr_id=163 


오라클SQL튜닝도구 Autotrace, 실행계획, 통계정보, db block gets vs consistent gets, 읽기일관성,Current Mode

오라클SQL튜닝도구 Autotrace, 실행계획, 통계정보, db block gets vs consistent gets, 읽기일관성,Current Mode오라클 SQL 튜닝SQL*Plus 튜닝 도구 AutotraceDB BLOCK GETS vs CONSISTENT GETS실습 ORACLE 19CSQL*Plus에서 Autotrace를

ojc.asia



https://youtu.be/CK4UzRwkDVs

https://youtu.be/9rvdwAcz4D0

https://youtu.be/2DjEl1PYzWo

https://youtu.be/e9lZ0oZNZDo




https://youtu.be/oR_UKxk_HO4


https://youtu.be/b-IxbRmwpGE

오라클 SQL 튜닝



SQL*Plus 튜닝 도구 Autotrace

DB BLOCK GETS vs CONSISTENT GETS



실습 ORACLE 19C





SQL*Plus에서 Autotrace를 이용하여 Oracle Optimizer가 만드는 실행계획과 통계정보를 얻을 수 있는데 DML문의 성능 튜닝을 위한 방법으로 자주 이용된다. 



SET AUTOTRACE를 사용하기 위해선 실행 계획용 테이블(PLAN_TABLE)이 존재해야 하며 구문을 활성화하기 위해 SET AUTOTRACE ON, 비활성화 하기 위해 SET AUTOTRACE OFF하면 된다. 참고로 SET AUTOTRACE에서 사용할 수 있는 옵션은 다음과 같다.

SET AUTOTRACE OFF : 기본값으로 AUTOTRACE를 수행하지 않는다.
SET AUTOTRACE ON EXPLAIN : 실행계획만을 출력
SET AUTOTRACE ON STATISTICS : 통계정보만을 출력
SET AUTOTRACE ON : 옵티마이저의 실행계획과 통계정보, 질의의 실행 결과를 함께 출력
SET AUTOTRACE TRACEONLY [EXPLAIN] : SET AUTOTRACE ON과 유사하지만 옵티마이저의 실행계획과 통계정보만 출력, 쿼리 결과는 출력하지 않는다. 만약 EXPLAIN이라고 하면 실행계획만 출력, STATISTICS라고 하면 통계정보만 출력 한다.


Creating the PLUSTRACE Role

C:\> sqlplus / as sysdba


SQL> @C:\db_home\sqlplus\admin\plustrce.sql

SQL> drop role plustrace;
drop role plustrace
          *
1행에 오류:
ORA-01919: 롤 'PLUSTRACE'(이)가 존재하지 않습니다

SQL> create role plustrace;
롤이 생성되었습니다.

SQL> grant select on v_$sesstat to plustrace;
권한이 부여되었습니다.

SQL> grant select on v_$statname to plustrace;
권한이 부여되었습니다.

SQL> grant select on v_$session to plustrace;
권한이 부여되었습니다.

SQL> grant plustrace to dba with admin option;
권한이 부여되었습니다.

SQL> set echo off

Granting the PLUSTRACE Role

SQL> grant plustrace to scott; -- AutoTrace를 사용할 계정
권한이 부여되었습니다.

SQL> conn scott/tiger        -- AutoTrace를 사용할 계정
연결되었습니다.


Creating a PLAN_TABLE



SQL> @C:\db_home\rdbms\admin\utlxplan.sql

테이블이 생성되었습니다.

여기까지 하면 SQL*Plus에서 TRACE 하기위한 plustrace 롤을 SCOTT이 부여 받았고 , 실행계획을 저장할 테이블인 PLAN_TABLE도 생성된다.

-- 아래 set autotrace on은 SQL문이 실행될 때 마다 실행 계획과 통계정보, 그리고 SQL의 실행 결과까지 보기 위해서 이며 set autotrace trace라고만 하면 결과는 보여주지 않고 실행 계획과 통계정보만 보여주고 기능을 해제하기 위해서는 OFF라고 하면된다.
--쿼리 실행 결과는 안 나온다.
SQL>set autotrace trace   

SQL> select * from emp;
14 개의 행이 선택되었습니다.

Execution Plan
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    14 |   532 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          8  consistent gets
          0  physical reads
          0  redo size
       1467  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         14  rows processed

SQL> set autotrace off   --Autotrace 기능 해제

SQL> select count(*) from emp;

  COUNT(*)
----------
        14

SQL> set timing on;
SQL> set autotrace traceonly statistics ;
– 결과는 보여주지 않고 통계정보, 쿼리실행시간만 보여준다.
SQL> select * from emp where empno = 7369;

경   과: 00:00:00.02

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          2  consistent gets
          0  physical reads
          0  redo size
        985  bytes sent via SQL*Net to client
        387  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


SQL> set autotrace on; 
 
SQL> select deptno, min(sal) from emp
    group by deptno
    having min(sal) > (select min(sal) from emp
                         where deptno = 30)
    order by deptno;

    DEPTNO   MIN(SAL)
---------- ----------
        10       1300

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   FILTER
   2    1     SORT (GROUP BY)
   3    2       TABLE ACCESS (FULL) OF 'EMP'
   4    1     SORT (AGGREGATE)
   5    4       TABLE ACCESS (FULL) OF 'EMP'


Statistics
----------------------------------------------------------
        //재귀호출의 횟수, SQL 파싱과 최적화 과정등에서 발생하게 되는 Data Dictionary 조회,
        // 테이블의 존재나 권한체크(사용자가 테이블에 대해 SELECT 권한 등이 있는지)    
        //하드파싱 시증가. Recursive Call을 최소화 하기 위해서는, 바인드 변수를 사용하여 
        //하드파싱 발생 자체를 줄이는 것이 효과적이다       
        191  recursive calls    
        //현재의 블록이 요구된 횟수
        //DML or SELECT FOR UPDATE등에 의한 Current Mode로 읽힌 블록 수 
         5  db block gets          
        //한 블록에 대해 요구된 consistent read 횟수
        //SELECT했을 때 읽기 일관성 모드로 읽힌 블록 수(Consistent Mode)
        28  consistent gets              
        //디스크로부터 읽어들인 데이터 블록의 총 개수
        7  physical reads 
        // 리두로그가 만들어진 크기(SIZE)             
        0  redo size         
        // Client에 보내진 바이트수
        448  bytes sent via SQL*Net to client       
        // Client로부터 받은 바이트 수
        503  bytes received via SQL*Net from client             
        //클라이언트에 송/수신된 Net메시지 합계 수
        //SQL*Pluss라면 Set Arraysize 설정에 따라 달라진다.
        2  SQL*Net roundtrips to/from client
       // 메모리에서 일어난 소트의 수
       3  sorts (memory)      
       // 디스트에서 일어난 소트의 수    
       0  sorts (disk)     
        //연산을 하는 동안 처리한 ROW의 수       
       1  rows processed 


DB BLOCK GETS vs CONSISTENT GETS


Consistent Mode : 읽기 일관성이 보장된 상태에서 데이터 블록을 읽는 것인데 대부분 SELECT 쿼리가 해당된다. 쿼리가 시작된 시점을 기준으로 일관성있게 읽어 들이며 읽는 도중에 값이 바뀌더라도 쿼리 시작시점의 값으로 읽는다. 그러므로 SCN(System Change Number)의 값을 확인하면서 읽는데 데이터값이 변경된 후 Commit되면 SCN번호가 증가되므로 이 경우에는 Rollback Segment에서 과거의 블록을 읽어들인다. AUTOTRACE에서는 consistent gets로 표시된다.


Current Mode : SQL 시작시점이 아닌 실제 블록을 액세스하는 그 시점의 최종값을 읽어들이는데 AUTOTRACE에서는 db block gets로 표시된다. SELECT FOR UPDATE 또는 DML 또는 디스크 소트가 필요할 정도의 대용량 정렬시 나타난다.


아래의  Update문을 보자.



Update emp
Set sal = sal + 100
Where deptno = 10;


이 경우 수정될 데이터를 찾기 위해 먼저 deptno가 10인 데이터를 읽기 일관성 모드(Consistent Mode)로 읽고 실제 값을 변경하는 시점에 Current Mode로 다시 읽어서 그때의 SAL 값에 100을 더해 변경한다. 이때 deptno=10 데이터를 찾을 때 읽어들이는 blocks은 consistent gets에 나타나고, 실제 변경을 하려고 Current Mode로 읽은 블록은 db block gets에 나타난다.


추가로 한가지 더 이해할 부분은 수정할 데이터를 조회하는 Consistent Mode로 읽을 때는 block단위로 I/O가 발생하므로 읽은 블록수가 표시된다. 또 실제 수정하기 위해 Current Mode로 읽을 때는 수정될 데이터를 찾기 위해 블록을 읽으므로 수정될 데이터 건수와 블록을 읽은 수가 비슷하게 나타나며 Consistent Mode로 읽은 블록수는 수정하기 위해 데이터를 읽은 블록보다 대체로 더 큰값을 가진다.


[실습]



SAL 값은 1000 이 됩니다. 


세션A에서 update 실행 후 commit 하기 전에 다른 세션B에서 또 update를 실행 했습니다.

세션B는 A가 update를 실행하면서 commit을 하지 않았고 Lock을 걸어서 B는 대기하는데, A가 Commit을 한 이후 B의 update 구문은 실행이 됩니다. B가 update를 실행할 때 7369의 SAL은 900이므로 consistent mode로 900을 읽고 current mode로도 900읽어 1000으로 변경 합니다.



#오라클 #SQL튜닝, #Autotrace, #실행계획, #통계정보, #dbblockgets, #consistentgets, #읽기일관성, #CurrentMode, #오라클교육, #오라클동영상, #ORACLE교육, #오라클학원, #ORACLE학원, 오라클 SQL튜닝, Autotrace, 실행계획, 통계정보, dbblockgets, consistentgets, 읽기일관성, CurrentMode, #오라클교육, 오라클동영상, ORACLE교육, 오라클학원, ORACLE학원, 

2021년 12월 19일 일요일

[오라클학원/오라클교육동영상]오라클커서공유, CURSOR_SHARING 파라미터, 커서란? 소프트파싱,하드파싱, Literal SQL, Bind SQL, 리터럴SQL, 바인드변수SQL

 [오라클학원/오라클교육동영상]오라클커서공유, CURSOR_SHARING 파라미터, 커서란? 소프트파싱,하드파싱, Literal SQL, Bind SQL, 리터럴SQL, 바인드변수SQL


오라클커서공유, CURSOR_SHARING 파라미터, 커서란? 소프트파싱,하드파싱, Literal SQL, Bind SQL, 리터럴SQL, 바인드변수SQLORACLE SQL 튜닝CURSOR_SHARING 파라미터ORACLE 19CCURSOR_SHARING 파라미터는 오라클 커서를 공유하는 방식을 셋팅하는데 기본값은 EXACT로 두 SQL문이 정확히 일치해야…

ojc.asia






CURSOR_SHARING 파라미터는 오라클 커서를 공유하는 방식을 셋팅하는데 기본값은 EXACT로 두 SQL문이 정확히 일치해야만 SQL 커서를 공유합니다. 

 

만약 PL/SQL에서 “select * from emp where deptno = 10” 이라는 SQL문과 “select * from emp where deptno = 20” 두 SQL문장이 사용되었다면 이는 서로 다른 SQL로 인식을 해서 각각 하드 파싱을 하고 쿼리 성능이 저하 됩니다. 이런식으로 작성된 SQL문을 Literal SQL문 이라고 합니다. 위 두 SQL문장을 동일한 SQL문장으로 인식시키기 위해서는(커서를 공유) CURSOR_SHARING 파라미터 값을 “FORCE”로 주시면 되고. 이는 실습을 통해 확인 해 보겠습니다.

 

다음 예제를 통해 리터럴 SQL과 바인드 변수 SQL 사용에 따른 하드파싱과 소프트 파싱의 차이에 대해서 알아 보세요~

 

–Shared Pool의 SQL Area를 클리어 합니다. 이후 실행되는 SQL문장은 하드파싱을 하게 됩니다.
ALTER SYSTEM FLUSH SHARED_POOL;

– DBMS_OUT 출력을 활성화 합니다. SQL Developer등에서 출력 결과를 확인할 수 있습니다.
SET SERVEROUTPUT ON;

– 리터럴 SQL을 사용한 예
DECLARE
  v_sql VARCHAR2(500);
  v_cnt NUMBER;
BEGIN
  FOR I IN 1..5 LOOP
    v_sql := 'SELECT /*+ LITERAL */ COUNT(*) FROM MYEMP1 
                  WHERE EMPNO = ' || i;
    DBMS_OUTPUT.PUT_LINE(v_sql);
    EXECUTE IMMEDIATE v_sql INTO v_cnt;
    DBMS_OUTPUT.PUT_LINE(v_cnt);
  END LOOP;
END;
/

– Shared Pool의 SQL Area에서 위에서 실행한 SQL문장의 개수 및 총실행 횟수를 조회 합니다. 5번 각각 하드 파싱 되었고 총 실행횟수도 1임을 확인 합니다.
SELECT SUBSTR(sql_text,1,60) "SQL", COUNT(*),
        SUM(EXECUTIONS) "총실행횟수"
 FROM V$SQLAREA
 WHERE SQL_TEXT LIKE '%LITERAL%'
 GROUP BY SUBSTR(sql_text,1,60)
 HAVING COUNT(*) > 0
 ORDER BY 2;
 
 
 ALTER SYSTEM FLUSH SHARED_POOL;
 
– 바인드 변수 SQL형태로 작성된 예문 입니다.
 DECLARE
  v_sql VARCHAR2(500);
  v_cnt NUMBER;
BEGIN
  FOR i IN 1..5 LOOP
    v_sql := 'SELECT /*+ BIND */ COUNT(*) FROM MYEMP1 
                  WHERE EMPNO = :1';
    DBMS_OUTPUT.PUT_LINE(V_SQL);
    EXECUTE IMMEDIATE v_sql INTO v_cnt USING i;
    DBMS_OUTPUT.PUT_LINE(v_cnt);
  END LOOP;
END;
/

– Shared Pool의 SQL Area에서 위에서 실행한 SQL문장의 개수 및 총실행 횟수를 조회 합니다. 1번 하드 파싱 되었고 총 실행횟수가 5임을 확인 합니다.
SELECT SUBSTR(sql_text,1,60) "SQL", COUNT(*),
        SUM(EXECUTIONS) "총실행횟수"
 FROM V$SQLAREA
 WHERE SQL_TEXT LIKE '%BIND%'
 GROUP BY SUBSTR(sql_text,1,60)
 HAVING COUNT(*) > 0
 ORDER BY 2;



Oracle 8.1.6에서 소개된 CURSOR_SHARING 변수는 각각의 문장들에 대해 Bind 변수로 처리하지 않더라도 내부적으로 바인드 변수로 처리하여 각각의 Cursor에 대해 공유가 가능하도록 했습니다. 실제 이 기능은 Bind 변수를 쓰는 것보다는 빠르지 않지만 Literal SQL문을 이용하는 것보다 20~30% 성능 향상이 있는 것으로 검증 되었으며 오라클12C이후 사용가능한 두 파라미터는 EXACT, FORCE이다.

 

오라클11g,12C, 19C에서 CURSOR_SHARING 파라미터의 기본값은 EXACT인데 기본값이 아닌 FORCE인 경우 SQL문장이 리터럴 SQL 형태로 작성되었다면 시스템에서 생성한 바인드 변수(:SYS_B_0)로 리터럴 값을 자동 변형 한다.

 

CURSOR_SHARING 값이 기본값(EXACT)이 아닌 경우 즉 FORCE인 경우 아래와 같은 절차로 SQL구문을 파싱한다.

 

“select * from emp where deptno = 10” 이라는 SQL문장이 이미 실행되었고 “select * from emp where deptno = 20” 문장을 실행한다고 했을 때

 

  1. Shared Pool 안에서 공백, 대소문자까지 완벽하게 동일한 SQL 문장이 있는지 검사한다. 만약 동일한 SQL문장이 있으면 파싱트리 및 실행계획을 공유해서 사용하고 4번으로, 없다면 다음 2번을 수행한다.
  2. Shared Pool에서 유사한 SQL문장을 찾는다. (예를 들면 where절의 상수값만 다른 경우), 만약 유사한 SQL문장이 없다면 Hard Parsing을 수행하여 파싱트리, 실행계획을 만들고 4번으로, 이미 있다면 다음 3번을 수행한다.
  3. 남은 과정은 실행한 SQL문장(where deptno = 20)의 실행 계획이 상수값만 다른 상태로 존재하는 처음에 실행된 SQL문장(where deptno = 10)의 실행계획을 공유할 수 있는지를 확인하는 것인데 만약 공유 불가능하다면 Hard Parsing을 적용하여 새로운 실행계획을 만들고 공유가능 하다면 실행계획을 공유한 다음 4번을 진행한다.
  4. 공유 SQL Area에 SQL문장 및 파싱트리, 실행계획을 공유시킵니다.
  5. 실행 계획대로 로우 소스 트리(파싱 트리)에 따라 SQL문을 실행 합니다.

 

위에서 작성한 실습에 이어서 CURSOR_SHARING 파라미터를 사용하여 실습합니다.

 

– 상수값이 하드코딩된 리터럴 SQL 구문을 커서가 공유될 수 있도록 셋팅 합니다.
– CURSOR_SHARING 파라미터의 기본값은EXACT로 리터럴 SQL 형태로 작성된 구문은 sQL 커서를 공유할 수 없습니다(동일한 SQL로 인식되지 않습니다)
ALTER SESSION SET CURSOR_SHARING = FORCE;

–Shared Pool의 SQL Area를 클리어 합니다. 이후 실행되는 SQL문장은 하드파싱을 하게 됩니다.
ALTER SYSTEM FLUSH SHARED_POOL;

– 리터럴 SQL을 사용하여 SQL을 작성 합니다.
DECLARE
  v_sql VARCHAR2(500);
  v_cnt NUMBER;
BEGIN
  FOR I IN 1..5 LOOP
    v_sql := 'SELECT /*+ LITERAL */ COUNT(*) FROM MYEMP1 
                  WHERE EMPNO = ' || i;
    DBMS_OUTPUT.PUT_LINE(v_sql);
    EXECUTE IMMEDIATE v_sql INTO v_cnt;
    DBMS_OUTPUT.PUT_LINE(v_cnt);
  END LOOP;
END;
/

– Shared Pool의 SQL Area에서 위에서 실행한 SQL문장의 개수 및 총실행 횟수를 조회 합니다. 1번 하드 파싱 되었고 총 실행횟수가 5임을 확인 합니다. 커서가 공유되었습니다!
SELECT SUBSTR(sql_text,1,60) "SQL", COUNT(*),
        SUM(EXECUTIONS) "총실행횟수"
 FROM V$SQLAREA
 WHERE SQL_TEXT LIKE '%LITERAL%'
 GROUP BY SUBSTR(sql_text,1,60)
 HAVING COUNT(*) > 0
 ORDER BY 2;

#오라클커서, #커서공유, #CURSOR_SHARING, #커서란?, #소프트파싱,#하드파싱, #LiteralSQL, #Bind SQL, #리터럴SQL, #바인드변수SQL, #오라클교육, #오라클동영상, #오라클학원, 오라클커서, 커서공유, CURSOR_SHARING, 커서란?, 소프트파싱,하드파싱, LiteralSQL, Bind SQL, 리터럴SQL, 바인드변수SQL, 오라클교육, 오라클동영상, 오라클학원,  



2021년 12월 18일 토요일

JPA 엔티티 매니저(Entity Manager), 영속성 컨텍스트(Persistence Context), 스프링교육, JPA교육, JPA동영상교육, JAVA교육, Spring교육, 자바학원교육

 














JPA 엔티티 매니저(Entity Manager), 영속성 컨텍스트(Persistence Context) 


엔티티 매니저(Entity Manager)


  • JPA EntityManagerFactory


  • 데이터베이스와의 상호 작용을 위한 EntityManager를 생성하기 위해 사용되는데 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한번만 생성하고 공유해서 사용한다.
  • Thread-Safe함, 여러 쓰레드에서 동시에 접근해도 안전하다.
  • 하이버네이트에서의 SessionFactory와 같은 역할을 한다.


  • JPA EntityManager


  • 도메인 객체를 테이블로 변환하고 엔티티와 관련된 저장, 조회, 수정, 삭제와 같은 일을 한다. DB에서 엔티티를 가져오거나 생성, 삭제, 수정하는 일은 모두 EntityManager를 통해 이루어 진다.
  • 여러 쓰레드에서 동시에 접근하면 동시성 문제가 발생할 수 있으므로 쓰레드간 공유하면 안된다.
  • 하이버네이트의 Session과 같은 역할을 한다.
  • 엔티티 저장 요청시 엔티티 객체를 생성하여 DB에 저장하며 SQL과 같은 CRUD 오퍼레이션을 제공한다.
  • EntityManager의 인스턴스는 영속성 컨텍스트(Persistence Context)를 나타내며  EntityManagerFactory를 통해서 얻는다.



  • 트랜잭션 범위 EntityManager : 트랜잭션 기간동안 엔티티는 attach 상태이고 종료 후 자동으로 detach 상태가 된다.



  • 확장 범위 EntityManager : 여러 트랜잭션을 걸쳐 라이프 사이클이 지속되며 유상태 세션빈과 함께 사용되며 빈 인스턴스가 살아있는 동안 계속된다. 빈 자체가 제거되거나 EntityManager가 종료되어야 끝난다.



  • JPA EntityManager Interface


  • persist(Object entity) : 엔티티를 DB로 저장
  • merge(T entity) : EntityManager의 영속성 컨텍스트로 준영속(detached) 객체를 병합시킴
  • remove(Object entity) : DB에서 엔티티를 삭제
  • find(Class<T> entityClass, Object primaryKey) : 주키로 엔티티 인스턴스를 찾는다.
  • flush() : EntityManager의 영속성 컨텍스트안의 엔티티를 DB와 동기화 한다. 트랜잭션을 커밋하거나 JPQL 쿼리를 실행하면 자동으로 flush 된다. persist(), merge(), remove() 결과가 즉시 DB에 반영되지 않는다.
  • setFlushMode(FlushModeType flushMode) : EntityManager의 영속성 컨텍스트의 flush 모드를 설정한다.(AUTO, COMMIT) 기본적인 DB flush 모드는 AUTO이며 EntityManager가 필요할 때 자동으로 flush()를 호출한다. 트랜잭션 범위 EntityManager의 경우 트랜잭션 종료 시점에 flush() 호출되며 확장 범위 EntityManager의 경우 영속성 컨텍스트가 close 되는 시점에 flush()가 호출된다. 현재까지 반영되지 않은 변경은 다음 질의어 수행 전에 flush()가 호출된다. COMMIT 모드는 커밋 시에만 flush()가 호출된다.
  • getFlushMode() : 현재의 flush 모드를 리턴한다.
  • refresh(Object entity) : DB의 엔티티를 리셋, DB로부터 관리 중인 모든 엔티티를 다시 읽어오는 것이며 refresh() 전에 항상 merge() 하며 persist() 오퍼레이션 호출 후 바로 DB에 반영되지 않는 상황에서 사용할 수 있다.
  • createQuery(String jpsqString) : JPQL문을 이용하여 동적 질의문 생성
  • createNamedQuery(String name) : 이름있는 질의 인스턴스 생성
  • createNativeQuery(String sqlString) : 원시 SQL문을 이용하여 동적 질의 생성
  • close() : EntityManager를 종료한다.
  • isOpen() : EntityManager의 오픈여부 확인
  • getTransaction() : 트랜잭션 객체를 검색한다.
  • joinTransaction() : 기존 JTA 트랜잭션 조인을 요청한다.



영속성 컨텍스트(Persistence Context)


  • EntityManager가 관리하는 엔티티를 영구적으로 저장하는 공간으로 EntityManager(Session)를  생성할 때 하나가 만들어지는데 엔티티 매니저가 엔티티를 관리할 때 영속성 컨텍스에 보관하고 관리한다. 
  • 현재 관리되는 모든 엔티티 인스턴스의 집합을 영속성 컨텍스트(Persistence Context)라고 한다. EntityManager를 통해 접근 가능하며 EntityManager에 의해 관리되는 엔티티 컨테이너의 집합이다.
  • 어떤 엔티티 오브젝트에 대한 검색에서 영속성 컨텍스트안에 이미 존재한다면(Managed Entity) DB까지 갈 필요가 없는 것이므로 영속성 컨텍스트가 EntityManager에 대한 1차 캐시(로컬 캐시)와 같은 역할을 한다. (항상 DB에서 엔티티에 해당 되는 레코드를 다시 읽어들이는 refresh는 제외)
  • 영속성 컨텍스트의 주요 역할은 데이터베이스 엔티티 객체가 동일한 EntityManager 내의 하나 이상의 메모리 내 엔티티 객체로 표현되는지 확인하는 것이다. 모든 EntityManager는 고유한 자신만의 영속성 컨텍스트를 관리하므로 어떤 데이터베이스 객체가 서로 다른 EntityManager 인스턴스에서 다른 메모리상의 엔터티 객체로 나타낼 수 있다. 그러나 동일한 EntityManager를 사용하여 동일한 데이터베이스 객체를 두 번 이상 검색하면 항상 동일한 메모리 내의 엔터티 객체가 생성되어야 한다.
  • JPA에서 영속성 컨텍스트에 엔티티를 보관할때 최초 상태를 복사해서 저장하는데 이것을 스냅샷이라 한다. 플러시 시점에 스냅샷과 엔티티를 비교해서 변경된 엔티티를 찾는다. (플러시란 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것이다.)
  • 자동변경감지 : 영속상태의 객체가 영속성 컨텍스트에서 관리되는데 이 영속상태의 객체의 어떤 속성이 변경됨을 자동으로 감지한다. 이 영속객체는 작업단위가 종료되는 시점에 DB와 동기화 된다.
  • 1차 캐시 : 영속성 컨텍스트에서 관리하는 영속객체는 영속성 컨텍스트에서 모두 기억하는데 어떤 key를 기준으로 Entity 객체를 조회한 경우 DB의 실제 데이터를 조회하기 전에 영속성 컨텍스트 내부의 영속객체를 먼저 조회한다. 없는 경우에만 DB에서 조회하고 이를 반복 가능한 읽기라고 하며 성능상 이점이 있다.
  • 객체동일성 : 자바쪽과 DB쪽 모두 일치하는 경우 동일하게 간주한다. 즉 자바에서 “==“ 연산자로 비교했을 때도 같아야 하며 DB에서 key로 비교했을 때도 일치해야 동일하다는 것이다.






#엔티티매니저, #EntityManager, #영속성컨텍스트, #JPA교육, #JPA강좌, #JPA학원, #엔티티, #JPA엔티티, #JPAEnrity, #JPA동영상, #스프링교육, #자바교육, #스프링학원, #자바학원, 엔티티매니저, EntityManager, 영속성컨텍스트,JPA교육, JPA강좌, JPA학원, 엔티티, JPA엔티티, JPAEnrity, JPA동영상, 스프링교육, 자바교육, 스프링학원, 자바학원,

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...