336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

퍼옴글 : https://jun7222.tistory.com/310


스프링 프레임워크 + tomcat 8.0 + oracle 11g 에서 혼자 로컬로 DB를 사용할 때는 아무 문제가

없다가 여러 인원이 DB서버 하나를 사용하게 될 때 발생했던 오류

close()를 해줘야 하는데 안하는게 쌓이다 보니 결국 오류가 뿜음..


ORA-12519, Error preloading the connection pool, no appropriate service handler found 보인다.



경고: Unexpected exception resolving reference

java.sql.SQLException: Error preloading the connection pool

at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2084)

Caused by: java.sql.SQLException: Listener refused the connection with the following error:

ORA-12519, TNS:no appropriate service handler found

at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:419)

org.apache.tomcat.dbcp.dbcp2.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)

... 22 more

Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:

ORA-12519, TNS:no appropriate service handler found

 

at oracle.net.ns.NSProtocol.connect(NSProtocol.java:386)

at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1054)

at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:308)

... 31 more

경고: Unexpected exception resolving reference

java.sql.SQLException: Error preloading the connection pool

at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2084)

at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getLogWriter(BasicDataSource.java:1587)

Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:

ORA-12519, TNS:no appropriate service handler found

 

at oracle.net.ns.NSProtocol.connect(NSProtocol.java:386)

at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1054)

at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:308)

... 79 more



오류 해결방법

1. close()를 해준다.


2. SELECT * FROM V$SESSION WHERE OSUSER != 'SYSTEM';  으로 점유하는 것을

확인하여 이상이 있는지 체크





이 글에서 소개할 방법은 3번

3. processes의 할당량을 늘려준다.


select * from v$resource_limit where resource_name = 'processes';

위 내용을 입력하여 현재 사용중인 수가 할당보다 많으면 위 오류를 나온다.


현재 32 최대 36 할당 100 




먼저, cmd를 실행한다.

sqlplus /nolog

SQL> conn /as sysdba


SQL>alter system set processes=200 scope=spfile;

               값은 적당하게~


SQL> shutdown immediate;

SQL> startup;




재시작까지 완료되고 다시 확인을 하면




위처럼 allocation, limit 값이 늘어난 걸 확인할 수 있다.



출처: https://jun7222.tistory.com/310 [leverage 블로그]

'DATABASE > ORACLE' 카테고리의 다른 글

ORACLE PROCEDURE 쿼리 COMMIT 또는 ROLLBACK  (0) 2017.02.16
ORACLE FOR LOOP구문  (0) 2017.02.16
ORACLE WHILE문과 LOOP문  (0) 2017.02.16
ORACLE 프로시저 IF문과 EXCEPTION처리방법  (0) 2017.02.16
ORACLE PLSQL  (0) 2017.02.12
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



CREATE OR REPLACE PROCEDURE ADJDK.ADD_BOARD(IN_VAR IN VARCHAR2)
IS
BEGIN
    --BEGIN
        UPDATE BOARDTABLE
        SET B_TITLE = B_TITLE || IN_VAR
        WHERE B_NUM = 1;
    COMMIT;
END ADD_BOARD;
/

EXEC ADD_BOARD('1');



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.





CREATE OR REPLACE PROCEDURE ADJDK.TEST10(V_SU IN NUMBER) --선언문(매개변수)
IS
    IN_SU NUMBER(3) NOT NULL := 1;
    NOT_ONE_ERROR EXCEPTION; --에러를 정의합니다.
BEGIN
    DBMS_OUTPUT.PUT_LINE(IN_SU);
    FOR cnt IN (SELECT * FROM BOARDTABLE ORDER BY B_DATE ASC) LOOP    --FOR문을 조건은 쿼리입니다.
        DBMS_OUTPUT.PUT_LINE('현재 값은'||cnt.B_NUM||'입니다.');
    END LOOP;
   
    --cnt는 변수 IN 시작값..끝나는 값입니다.(밑에 매개변수대로 하면 1부터 3까지합니다.)
    FOR cnt IN 1..V_SU LOOP                                           --FOR문을 도는 조건은 NUMBER형 변수입니다.
        DBMS_OUTPUT.PUT_LINE('현재값은 '||cnt||'입니다.(LOOP)');
    END LOOP;
   
    EXCEPTION  --에러 시작
        WHEN NOT_ONE_ERROR THEN --해당 에러라면 밑에 구문처리합니다.
            DBMS_OUTPUT.PUT_LINE('입력한 숫자는 1이 아닙니다.');
        WHEN OTHERS THEN  --다른 에러라면 밑에 구문을 처리합니다.
            DBMS_OUTPUT.PUT_LINE('예외발생');
   
END TEST10; --프로시저 마침
/

EXEC TEST10(3); --실행구문

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



CREATE OR REPLACE PROCEDURE ADJDK.TEST10(V_SU IN NUMBER) --선언문(매개변수)
IS
    IN_SU NUMBER(3) NOT NULL := 1;
    NOT_ONE_ERROR EXCEPTION; --에러를 정의합니다.
BEGIN
    DBMS_OUTPUT.PUT_LINE(IN_SU);
    WHILE IN_SU <= V_SU LOOP    --WHILE문을 도는 조건입니다.
        DBMS_OUTPUT.PUT_LINE('현재 값은'||IN_SU||'입니다.');
        IN_SU := IN_SU + 1;     --IN_SU를 +1씩 해줍니다.
        EXIT WHEN IN_SU > V_SU; --해당 조건이면 while문을 탈출합니다.
    END LOOP;
   
    IN_SU := 1;
    LOOP
        DBMS_OUTPUT.PUT_LINE('현재값은 '||IN_SU||'입니다.(LOOP)');
        IN_SU := IN_SU + 1;     --IN_SU를 +1씩 해줍니다.
        EXIT WHEN IN_SU > V_SU; --해당 조건이면 while문을 탈출합니다.
    END LOOP;
   
    EXCEPTION  --에러 시작
        WHEN NOT_ONE_ERROR THEN --해당 에러라면 밑에 구문처리합니다.
            DBMS_OUTPUT.PUT_LINE('입력한 숫자는 1이 아닙니다.');
        WHEN OTHERS THEN  --다른 에러라면 밑에 구문을 처리합니다.
            DBMS_OUTPUT.PUT_LINE('예외발생');
   
END TEST10; --프로시저 마침
/

EXEC TEST10(3); --실행구문

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



CREATE OR REPLACE PROCEDURE TEST10(V_SU IN NUMBER) --선언문(매개변수)
IS
    NOT_ONE_ERROR EXCEPTION; --에러를 정의합니다.
BEGIN
    --DMBS_OUTPUT.DISABLE;
   
    IF V_SU = 1 THEN DBMS_OUTPUT.PUT_LINE('입력수는 1입니다.');
    ELSE RAISE NOT_ONE_ERROR; --에러로 넘어갑니다.
    END IF;
   
    EXCEPTION  --에러 시작
        WHEN NOT_ONE_ERROR THEN --해당 에러라면 밑에 구문처리합니다.
            DBMS_OUTPUT.PUT_LINE('입력한 숫자는 1이 아닙니다.');
        WHEN OTHERS THEN  --다른 에러라면 밑에 구문을 처리합니다.
            DBMS_OUTPUT.PUT_LINE('예외발생');
   
END TEST10; --프로시저 마침
/

exec TEST10(2); --실행구

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

 

//테스트용 테이블생성

CREATE TABLE testTable(
    NUM NUMBER PRIMARY KEY,
    NAME VARCHAR2(30) NOT NULL
);

 

select * from testTable

 

INSERT INTO testTable VALUES(2, 'test2')

 

//밑에 있는 함수 호출

SELECT numadd() FROM DUAL

 

//함수 구문 (into를 이용해서 쿼리에 있는 것을 변수에 넣었습니다

CREATE OR REPLACE FUNCTION numAdd
RETURN NUMBER IS //NUMBER형식 리턴
MAXNUM testTable.NUM%TYPE; //testTable의 NUM칼럼 형식 변수
F_NUM NUMBER(4);                 //숫자4자리
F_NAME VARCHAR(30);            //문자 30(한글2, 영어1)
CURSOR C1                          //커서를 넣습니다. 넣는 기준은 밑에 쿼리이고, F_NUM, F_NAME형식입니다.
IS
    SELECT NUM, NAME INTO F_NUM, F_NAME FROM testTable;

BEGIN
    SELECT NULLIF(MAX(NUM)+1, 1) INTO MAXNUM FROM testTable;  //NULLIF( MYSQL 에서는 IFNULL입니다.)
    
    DBMS_OUTPUT.PUT_LINE(MAXNUM||'check'); //문자열
    OPEN C1; //CURSOR 사용준비
    LOOP  //돌립니다.
        FETCH C1 INTO F_NUM, F_NAME; //1개씩 가져옵니다 각각 F_NUM, F_NAME에 넣습니다.
        EXIT WHEN C1%NOTFOUND;  //나오는 조건은 C1을 찾을수 없으면 나옵니다.
        DBMS_OUTPUT.PUT_LINE(F_NUM || F_NAME||'dasdfasdf');
    END LOOP;  //루프문의 끝입니다.
    return MAXNUM;  //리턴
END numAdd;  //함수끝
/

 

---------------------------------------------------------------------- 

//해당 쪽에 문자열을 붙여주는 프로시저

CREATE OR REPLACE PROCEDURE testA

IS
BEGIN
    UPDATE testTable
    SET name = name || '2';

COMMIT;

END testA;
/

 

//프로시저 호출하기

EXECUTE testA();

 

----------------------------------------------------------------------

//dbms_output.put_line주석 보여주기

SET SERVEROUTPUT ON;

 

//간단한 block

begin
    dbms_output.put_line('확인');
end;
/

+ Recent posts