안그래도 DB에 관련된 지식이 완전 바닥인데 거기다 이런일까지 겪게되어 DB가 더 무서워졌다..


"ora-1000" ?.. 누구냐 넌.....



테스트 서버에선 아무 이상 없었는데 운영 서버에서는 대략 5~8시간만에 ora-1000을 내뿜으며 DB가 멘붕이 된다..


검색을 해보니 오픈커서라는게 기본으로 설정된 수치를 초과해서 글탄다. 기본 설정 수치는 300...


또.. connection, preparedStatement,, 등등 열고 닫고를 제대로 못해줘서 그런거라던데...

혹은 loop내에서 대량으로 인서트 혹은 셀렉트 할때라던가...


사실 요즘은 DB도 프레임웍을 쓰기때문에 conn이나 prestatement 이런걸 직접적으로 열고 닫는일은 없다..

직접 열고닫고 한다해도 열고닫는일을 소스상에 도배하는 일은 없을테지 -_-


사실 검색해서 나온 내용들은 너무 오래된 옛날 얘기들이라 현재로써는 문제점으로 삼을수가 없었다.

그리고 난 근본적인 원인을 찾지 못했다. 단지 방어적인 설정으로 일단 인공호흡만 죽어라 하는..;



가장 이해가 안됬던건 무언가 액션이 일어날때 반응하는 오픈커서 갯수는 테스트 서버에서는 20에서 많게는 50~60개? 정도가 쌓이는데 운영서버에서는 최소 80개 정도를 시작으로 300개까지 도달하는 시간이 5~8시간 정도 되는것 같더라..


테스트 서버에서는 300를 채울래야 채울수가 없었고 수치를 50으로 설정해서 테스트를 해서 ora-1000을 재현했다..


여기서 해볼수 있는건 오픈커서를 강제적으로 없애버리는거...


--설정된 커서 갯수 확인

show parameter open_cursors;


--50으로 설정

ALTER SYSTEM SET open_cursors=50;


-- 사용중인 해당 계정에 sid별 오픈커서 확인

select

o.sid, osuser, machine, count(*) num_curs

from

v$open_cursor o, v$session s

where

user_name = 'scott' and o.sid=s.sid

group by o.sid, osuser, machine

order by num_curs desc;


페이지를 이동할때마다 위 쿼리를 실행해보면 커서가 쌓이는걸 볼수 있다..

근데 저런게 한번 열리면 시간이 지나면 알아서 닫혀야 하는거 아닌가? 처음엔 닫히질 않더라.. 줄어들지 않으니 계속 쌓이다 보면 뻗어버리나보지.


할튼 닫아주는게 목적이였으니..


<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<property name="driverClassName" value="${database.main.driverClassName}" />

<property name="url" value="${database.main.url}" />

<property name="username" value="${database.main.username}" />

<property name="password" value="${database.main.password}" />

<!-- 수정 전 

<property name="defaultAutoCommit" value="true" />

<property name="poolPreparedStatements" value="true" /> 아마도 이것때문에 닫히질 않았을꺼라 생각됨. * 참고

<property name="maxActive" value="30" />

<property name="maxIdle" value="10" />

<property name="minIdle" value="3" />

<property name="initialSize" value="3" />

<property name="maxWait" value="10000" />

-->

<!-- 수정 후 --> 

<property name="maxActive" value="100" />

<property name="maxIdle" value="10" />

<property name="minIdle" value="3" />

<property name="initialSize" value="10" />

<property name="maxWait" value="10000" />

<property name="testOnBorrow" value="true" />

<property name="testOnReturn" value="true" />

<property name="validationQuery" value="select 1 from dual" />

<property name="testWhileIdle" value="true" />

<property name="timeBetweenEvictionRunsMillis" value="130000" /> 정해진

<property name="minEvictableIdleTimeMillis" value="120000" /> 시간에 따라

<property name="numTestsPerEvictionRun" value="100" /> 100개씩검사

<property name="removeAbandonedTimeout" value="30" /> 30초 동안 사용하지 않았을때

<property name="removeAbandoned" value="true" /> 삭제

<property name="logAbandoned" value="false" />

</bean>




이 방법이 맞는지도 모르겠고 저렇게 짧은 시간에 커넥션을 확인해서 강제적으로 삭제해주는게 서버에 어떠한 영향을 미칠지.. 그것 조차도 모른다.

아직은 4~5일 정도 문제없이 버텨주고 있고 오픈커서 역시 40~50개 정도가 유지되고 있다는 얘기만 들었다.


이런 문제에 대해 도움을 받고싶어도.. 어디다 물어봐야 하는지도 모르겄다 -_-


"mysql  -u 사용자명 -p 데이터베이스이름"
"mysql -u root -p" 라고 입력합니다.

아직 계정을 만들지 않았으므로 루트 계정을 사용해서 mysql에 접속하였습니다.
비번은 mysql 설치했던 그 비밀번호를 적어줍니다.


외부접속 허용.

mysql을 처음 설치하고 로컬이 아닌 외부에서 mysql 에 접속하려고 하면 
ERROR 1130 (HY000): Host '121.165.82.xxx' is not allowed to connect to this MySQL server
와 같은 에러를 내며 접속이 안된다.

mysql 에서 사용하는 아이디에는 접속이 허용가능한 네트워크를 지정할 수 있는데
이게 처음 root 에는 localhost 로만 설정되어 있어 로컬에서 밖에 접속을 할 수 없다.

이를 해결하기위해선 로컬에서 mysql 에 접속한다음 mysql 데이타베이스에서
mysql> grant all privileges on *.* to root@"%" identified by '????????' with grant option;
라고 치면 된다 ???? 부분은 root 의 암호다.



오라클 엔플쓰다가 xe쓰니까 먼가 이상해서 색다른 디비를 알아보던차.. 큐브리드를 사용해봤는데.. 첨엔 괜찮았다.....

아니 근데 이게 왠걸.. 하이바네이트에서 foreign key를 못잡아준다...... 설정을 잘못했나 싶어서 오라클에서 스키마 export해봤지만.. 큐브리드에서는 못잡는다....

Date타입도 년월일만 인식하고... 시간분초... 제대로 사용할수 없다.
TIMESTAMP도 insert는 다 되는데 출력은 안된다........

아직 하이버네이트측과 큐브리드 측이 친하지 않은건지............
빨리 친해지길 바래 -_-;;

postgresql 을 써봐야 하나.....

'Database > Hibernate' 카테고리의 다른 글

Hibernate Log4j 설정.  (0) 2009.10.24
CRUD Test.  (0) 2009.10.24
SchemaExport.  (0) 2009.10.24
Hibernate Code Generation..  (0) 2009.10.23
Hibernate 도전!  (0) 2009.10.22

log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

가장 많이 쓰일듯 싶다. 실행된 쿼리문을 로그로 찍는것과.. 넘어온 파라미터 값을 확인할 수 있다.

### log just the SQL (hibernate.cfg.xml 설정과 겹친다. hibernate.show_sql = false 한다.)
log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
(log4j 1.2.15 쓰는데.. debug로 하면 안나오더라..)
log4j.logger.org.hibernate.type=TRACE

### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=info

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
log4j.logger.org.hibernate.cache=info

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace

'Database > Hibernate' 카테고리의 다른 글

큐브리드 foreign key.....  (0) 2010.07.04
CRUD Test.  (0) 2009.10.24
SchemaExport.  (0) 2009.10.24
Hibernate Code Generation..  (0) 2009.10.23
Hibernate 도전!  (0) 2009.10.22
Schema Export 보기.

이제 디비에 insert, update, del.... 간단한 테스트를 해봅니다.
해보니까 알아서 쿼리문 사용하고.. 편하긴 편한거 같은데... (뭔가 찝찝..)

일단 지저분한 테스트 코드로 데이터를 넣어봤습니다. 말그대로 Insert 하는것이고..
그냥 객체 생성해서 save하면 끝나는거 같네요. 물론 하이버네이트에는 많은 기능들이 있을테지만..
save뿐이 모르기에 ^^


테스트 돌려보니 역시나 콘솔창에서 알아서 쿼리문을 만들어서 집어넣는거 같습니다.
음.. 넘어온 파라미터들까지 볼 수 있으면 좋을텐데요.........
어딘가 그런 설정이 있을거 같은데.. 없으려나 ㅎㅎ [ Log4j 설정 보기 ]


삭제와 수정을 해보기에 앞서 DB에서 객체를 가져오는거 먼저...
(일단 매번 session을 얻어오고 transaction.. try ~ catch 해주는 중복 코드는 인터페이스와
추상클래스로 제거했습니다.)


- get : 호출 시점에서 select 쿼리 실행.
- load : 객체의 값이 실제로 필요한 시점에 쿼리 실행.

정말 간단합니다...........
나머지 수정과 삭제를 해봐야 하는데.. select 된 객체를 넣어주면 끝납니다.....


당연한 얘기지만.. 가져와서 수정을 하네요.
근데 이렇게 되면 매번 수정을 하기 위해선 select를 무조건 실행해야합니다.

그럼 이렇게 해보는건?? (사실 전 첨에 이렇게 했었습니다만..........)



결과는...


저도 되지 않을까 싶었는데.. board.hbm.xml에 설정하기를 writer 컬럼은 not-null로 설정해서
업데이트 할때에도 넣어줘야 하나보드라구요. 수정이 필요없는 데이터까지 억지로 넣어줘야 하는..
할튼 그 방법은 좀 별로인듯 싶네요.

그리고 이 방법을 쓰려면 equals 메서드를 구현해줘야 한다는거 같네요.
그건.. 예전 설정 파일에서 mata 속성을 설정했던적이 있는데 저 상태로 generation하면
도메인 객체에 저 메서드들이 오버라이딩 된다고 했었습니다.



이런식으로 오버라이딩 되서 만들어집니다.
이 메서드가 없다면 위 방식의 업데이트는 이루어지지 않습니다.



Delete부분은 Update와 같기때문에... 알아서;;

정말 기본적인 CRUD 해봤는데 아직 하이버네이트에 기능들을 다 몰라서 이정도뿐이 안되는군요.
일단 여기서는 HQL을 쓰지 않았습니다.

공부.. 해도 해도 끝이 없습니다.... ㅅㅂ;;

'Database > Hibernate' 카테고리의 다른 글

큐브리드 foreign key.....  (0) 2010.07.04
Hibernate Log4j 설정.  (0) 2009.10.24
SchemaExport.  (0) 2009.10.24
Hibernate Code Generation..  (0) 2009.10.23
Hibernate 도전!  (0) 2009.10.22
이전 맵핑 설정 / Generation 보기.

하이버네이트 설정... sessionFactory 얻어오기.. 그리고 도메인 객체까지 Generation 했습니다.
그것을 바탕으로 DB 스키마 생성을 해보도록 하겠습니다.

비교적 간단합니다.

sc.create(false, true);


첫번째 인자값은 script를 확인 할껀지..
두번째 인자값은 실제 DB에 스키마를 생성할껀지 조건입니다.



Junit으로 실행 후 실제 DB 확인 결과 앞전에 board.hbm.xml 에 설정했던대로 테이블이 생성됬습니다.



이번에는 sql문을 확인해보겠습니다.


이런식으로 콘솔창에서 확인해볼수 있습니다. 근데 각 쿼리문에 ';' 이 빠졌네요.

실행해서 확인된 쿼리문은 hibernate.cfg.xml에서 mapping resource에 등록된 맵핑 파일에 대해서만 출력합니다.

이번엔 쿼리문 확인과 그 sql 쿼리문을 파일로 저장해보겠습니다.


sc.setDelimiter(";"); // 각 쿼리문에 ';' 추가.
sc.setOutputFile("src/schema.sql"); // 저장 위치 지정.
sc.create(true, false); // DB와 상관없이 스크립트 관련해서 생성합니다.

CRUD Test.

'Database > Hibernate' 카테고리의 다른 글

큐브리드 foreign key.....  (0) 2010.07.04
Hibernate Log4j 설정.  (0) 2009.10.24
CRUD Test.  (0) 2009.10.24
Hibernate Code Generation..  (0) 2009.10.23
Hibernate 도전!  (0) 2009.10.22
이전 하이버네이트 설정 보기.

맵핑 파일을 자바 코드로 만드는 방법입니다.
일단 맵핑 파일을 작성해야 합니다.


 여지껏 해오던 간단한 게시판을 작성해보겠습니다.

작성방법은 그리 어렵지 않습니다. id는 Primary Key 정도로 생각하시면 되고,
property는 실제 모델 객체에 데이터라고 보시면 되요. 물론 그 안에 DB 컬럼 같이 하면되구요.



제일 처음에 설정 파일 내용에 맵핑파일을 추가해주세요.


그러면 아래와 같이 클래스 Board가 인식되야 합니다.




그러면 이제 자바 코드로 변환할 수 있습니다.




프로젝트를 지정하고 코드로 변환할 곳을 지정합니다.
src로 하면 되고 패키지 경로는 설정 파일에 명시되어 있었죠..




Domain code를 선택하고 Java 5 버전 syntax를 사용합니다.



Apply -> Run 하게 되면..



저렇게 자바 파일이 생성됩니다. 내용은 직접 Generator해서 확인하기 바랍니다.

Schema 생성하기.

'Database > Hibernate' 카테고리의 다른 글

큐브리드 foreign key.....  (0) 2010.07.04
Hibernate Log4j 설정.  (0) 2009.10.24
CRUD Test.  (0) 2009.10.24
SchemaExport.  (0) 2009.10.24
Hibernate 도전!  (0) 2009.10.22
그나마 iBATIS를 쪼금 쓸줄 알겠다 싶었더니.. 왠걸 하이버네이트를 배우게 되었다....
일단 모르는것 투성이인 상태로 블로깅 하게 된점 정말 안타깝고 혹시라도 이 글을 보시는 분들께 죄송하단 말씀드려요 ^^;;
(
조언이라도 좀 해주시던가! ㅋ)

테스트 환경은 예전부터 해오던.. Dyna...Web... Proj...t 에서.. 해봤습니다.

앞으로도 계속 스프링 기반으로 웹 프로젝트를 공부할꺼라서 기존 라이브러리에 추가했는데..
hibernate3.jar만 추가하면 되는가 싶었는데 실행해보니 모가 없다고 에러나서
에러에 맞게 라이브러리 추가해보았습니다. (헛.. 맨 위 dom4j도 없으면 안되요 ^^)



hibernate tool을 설치했다면 저런 메뉴가 있을겁니다. Configuration 파일을 먼저 생성합니다.



설정파일은 WEB-INF에 위치할것이며 아래처럼 아는부분만 일단 입력했습니다.
저는 Driver class 셀렉트 박스에 아무것도 없어서 직접 쳤습니다.
그러니까 Connection Url은 셀렉트박스에서 선택 가능하더군여;;

제일 아래 Create a console.... 꼭 체크 ^^



아래와 비슷한 내용의 설정 파일이 생성됬을겁니다. 그 외에 없는 내용은 추가적으로 넣었습니다.
보면 아시겠지만 정확히는 모릅니다. 앞으로 공부해야겠죵~

* hibernate.hbm2ddl.auto
 create : sessionFactory가 작동할때 스키마를 삭제하고 다시 생성.
 create-drop : sessionFactory가 끝날때 스키마 삭제.
 update : 도메인 객체와 DB 스키마를 비교해 변경된 내용이 있으면 도메인 객체에 맞춰 스키마 변경
             (근데 해봐도 안됨 ;; 둘중에 하나라도 틀리면 에러 토해냄.. 어떻게 하는건지 ^^)
 validate : sessionFactory 시작할때 도메인 객체와 DB 스키마가 같은지 확인.



그러면 저 설정파일로 sessionFactory[각주:1]를 가져올수 있는지 테스트 해봅니다.
Junit3.8.2 버전으로 테스트 했습니다.



Junit도.. 아직 어색하네요 ^^;;



예상했던데로 정상 실행 되는군여..


hibernate.cfg.xml 파일이 src폴더에 있다면 이렇게 해도 됩니다.
conf = new configuration().configure();

Mapping File 작성 방법 보기.

  1. 바이트 코드 프로세싱이나 코드 생성이 아니라, 하이버네이트는 클래스의 퍼시스턴스 프로퍼티를 얻어오기 위해서 런타임 리플렉션을 이용한다. 저장되는 객체는 퍼시스턴스 필드와 필드 간의 관계에 대한 정보를 제공하는 매핑(mapping) 문서에 정의가 된다. 매핑 문서는 애플리케이션이 동작하면 컴파일되고, 클래스에 필요한 정보를 가진 프레임워크를 제공한다. 뿐만 아니라 매핑 문서는 데이터베이스 스키마 또는 Stub 자바 소스 파일생성 등의 기능을 이용할 때 사용된다. 매핑 문서의 컴파일된 컬렉션으로부터 SessionFactory 객체가 생성된다. SessionFactory는 Session 인터페이스로 퍼시스턴스 클래스를 관리하기 위한 매커니즘을 제공한다. Session 클래스는 퍼시스턴스 데이터 저장과 애플리케이션 간의 인터페이스를 제공한다. Session 인터페이스는 JDBC 연결을 래핑(wrapping)하고 있다. 이 JDBC 연결은 사용자에 혹은, 하이버네이트로부터 관리될 수 있다. [본문으로]

'Database > Hibernate' 카테고리의 다른 글

큐브리드 foreign key.....  (0) 2010.07.04
Hibernate Log4j 설정.  (0) 2009.10.24
CRUD Test.  (0) 2009.10.24
SchemaExport.  (0) 2009.10.24
Hibernate Code Generation..  (0) 2009.10.23

 

F1

Toad 도움말 파일의 SQL Editor 부분이 표시됩니다.

F2

전체 화면 Editor Editor/Results 패널 표시 장치 사이를 전환합니다.

<SHIFT>F2

전체 화면 그리드를 전환합니다.

F3

다음으로 일치하는 것을 찾습니다.

<SHIFT>F3

이전에 일치하는 것을 찾습니다.

F4

팝업 창의 테이블, , 프로시저, 함수, 또는 패키지를 설명합니다.

F5

스크립트로 실행합니다.

F6

커서를 Editor Results 패널 사이로 전환합니다.

F7

모든 텍스트를 지웁니다.

F8

이전 SQL 문을 재호출합니다(SQL Statement Recall 창을 불러옵니다).

F9

실행문을 실행합니다.

<CTRL>F9

실행(구문 분석) 없이 실행문을 검사합니다.

<SHIFT>F9

커서 위치에서 현재 실행문을 실행합니다.

F10

오른쪽 클릭 메뉴를 표시합니다.

F11

Script 같은 실행(=F5)

F12

편집기 내용을 지정된 외부 편집기로 전달합니다.

<CTRL>A

모든 텍스트를 선택합니다.

<CTRL>C

복사

<CTRL>D

프로시저 인수를 표시합니다.

<CTRL>E

현재 실행문에서 Explain Plan 실행합니다.

<CTRL>F

텍스트를 찾습니다(Find Text 창을 불러옵니다).

<CTRL>G

라인으로 이동합니다(Goto Line 창을 불러옵니다).

<CTRL>L

텍스트를 소문자로 변환합니다.

<CTRL>M

Make Code Statement

<CTRL>N

이름이 지정된 SQL 문을 재호출합니다(SQL Statement Recall 창을 불러옵니다).

<CTRL>O

텍스트 파일을 엽니다.

<CTRL>P

Strip Code Statement

<CTRL>R

검색 바꾸기(Find and Replace Text 창을 불러옵니다)

<CTRL>S

파일을 저장합니다.

<SHIFT><CTRL>S

파일을 다른 이름으로 저장합니다.

<CTRL>T

드롭다운을 표시합니다.

<CTRL>U

텍스트를 대문자로 변환합니다.

<CTRL>V

붙여넣기

<CTRL>X

잘라내기

<SHIFT><CTRL>Z

마지막으로 취소한 작업을 재실행합니다.

<ALT><UP>

이전 실행문을 표시합니다.

<ALT><DOWN>

다음 실행문을 표시합니다(<ALT><UP> 사용한 사용)

<ALT><PgUp>

이전 탭으로 이동

<ALT><PgDn>

다음 탭으로 이동

<CTRL><ALT><PgUp>

이전 결과 패널 탭으로 이동

<CTRL><ALT><PgDn>

다음 결과 패널 탭으로 이동

<CTRL><HOME>

데이터 그리드에서는 위의 레코드셋으로 이동하며, 결과 그리드에서는 커서가 위치한 행의 번째 열로 이동하고, 편집기에서는 텍스트의 번째 열과 번째 행으로 이동합니다.

<CTRL><END>

데이터 그리드에서는 레코드셋의 끝으로 이동하며, 편집기에서는 텍스트의 마지막 열과 마지막 행으로 이동합니다. 단원의 "주의" 참조하십시오.

<CTRL><SPACE>

코드 완성 템플릿을 활성화합니다.

<CTRL><TAB>

MDI Child 창의 콜렉션을 순환합니다.

<CTRL><ENTER>

커서 이치에서 현재 SQL 문을 실행합니다.

<CTRL>. (마침표)

테이블 이름을 자동으로 완성합니다.


+ Recent posts