- version

Spring Framework 4.3.20.RELEASE

hibernate-entitymanager-4.2.21.Final

 

- 동작 순서

org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean 에서 afterPropertiesSet() 후에 [spring-orm-4.3.20.RELEASE]

org.hibernate.ejb.EntityManagerFactoryImpl 에서 init() 하고 [hibernate-entitymanager-4.2.21.Final]

org.hibernate.cfg.Configuration 에서 buildSessionFactory() 해서 [hibernate-core-4.2.21.Final]

org.hibernate.internal.sessionFactoryImpl 에서 init() 시 [hibernate-core-4.2.21.Final]

ddl-auto 설정을 적용하게 된다.

해당 설정은

org.hibernate.tool.hbm2ddl.SchemaUpdate 에서 execute() 와 같이 설정 조건에 의하여 분기처리되서 수행된다. [hibernate-core-4.2.21.Final]

 

- 참고 자료

HHH000299: Could not complete schema update
org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Access denied for user 'certpin'@'localhost' (using password: YES))
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1225) ~[commons-dbcp-1.2.2.jar:1.2.2]
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880) ~[commons-dbcp-1.2.2.jar:1.2.2]
at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:70) ~[hibernate-entitymanager-4.2.21.Final.jar:4.2.21.Final]
at org.hibernate.tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.prepare(SuppliedConnectionProviderConnectionHelper.java:51) ~[hibernate-core-4.2.21.Final.jar:4.2.21.Final]
at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:219) ~[hibernate-core-4.2.21.Final.jar:4.2.21.Final]
at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:203) ~[hibernate-core-4.2.21.Final.jar:4.2.21.Final]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:509) ~[hibernate-core-4.2.21.Final.jar:4.2.21.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1799) ~[hibernate-core-4.2.21.Final.jar:4.2.21.Final]
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:96) ~[hibernate-entitymanager-4.2.21.Final.jar:4.2.21.Final]
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915) [hibernate-entitymanager-4.2.21.Final.jar:4.2.21.Final]
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:900) [hibernate-entitymanager-4.2.21.Final.jar:4.2.21.Final]
at org.springframework.orhttp://m.jpa.vendor.SpringHibernateEjbPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateEjbPersistenceProvider.java:51) [spring-orm-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:360) [spring-orm-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:384) [spring-orm-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:371) [spring-orm-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:336) [spring-orm-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1689) [spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1627) [spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) [spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:481) [spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312) [spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) [spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308) [spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) [spring-beans-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1080) [spring-context-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:857) [spring-context-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) [spring-context-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443) [spring-web-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325) [spring-web-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) [spring-web-4.3.20.RELEASE.jar:4.3.20.RELEASE]
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4763) [catalina.jar:8.5.81]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5232) [catalina.jar:8.5.81]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [catalina.jar:8.5.81]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1427) [catalina.jar:8.5.81]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1417) [catalina.jar:8.5.81]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_301]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_301]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_301]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_301]

 

'DB' 카테고리의 다른 글

트랜잭션 격리 수준  (0) 2023.08.24
[Oracle Database 19c] restart  (0) 2023.05.25
[HikariCP] Configuration  (0) 2022.03.25
블로그 이미지

uchacha

개발자 일지

,

트랜잭션 격리 수준

DB 2023. 8. 24. 11:19

- @참고(oracle jdbc transaction): https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html

- @참고(트랜잭션 격리 수준): https://creampuffy.tistory.com/175

- @참고(트랜잭션 격리 수준과 lock): https://suhwan.dev/2019/06/09/transaction-isolation-level-and-lock/

- @참고(mysql phantom row 처): https://dev.mysql.com/doc/refman/8.0/en/innodb-next-key-locking.html

 

- The interface Connection includes five values the represent the transaction isolation levels you can use in JDBC:

 

- READ UNCOMMITED

Dirty Read 가 발생한다.

    - Dirty Read: 트랜잭션이 2개 이상 열릴 때, 나중에 열린 트랜잭션에서 앞선 트랜잭션의 rollback 될 값일 수도 있는 commit 되지 않은 값을 읽을 수 있다. 

 

- READ COMMITED 

Non Repeatable Read 가 발생한다.

    - Non-Repeatable Read: 트랜잭션이 2개 이상 열릴 때, 나중에 열린 트랜잭션에서 commit 을 한 경우 먼저 열린 트랜잭션에서 같은 값을 반복해서 조회했을 때 값이 변한다.

오라클의 기본 트랜잭션 격리 수준이다.

 

- REPEATABLE READ

InnoDB 가 아닐 경우, Phantom Read 가 발생한다.

    - Non-Repeatable Read 가 발생하지 않는 이유: 각 트랜잭션언 트랜잭션 ID로 관리된다.

    선 트랜잭션 A가 트랜잭션을 열면, A commit 전에 후 트랜잭션 B가 열렸을 때 A의 새로운 값은 버퍼풀에, 기존 값은 언두 로그에 기록한다.

    A 가 commit 되면 버퍼풀의 새로운 값을 디스크에 기록되고,

    언두 로그의 기존 값은 열려있는 다른 트랜잭션인 B가 참조하며, B에서도 commit 이 일어날 시에 삭제 된다.

    - Phantom Read: Non-Repeatable Read 가 한 트랜잭션 내에서 하나의 레코드 값에 대하여 반복 조회시 다른 값을 조회할 수 있는 경우라면, Phantom Read는 한 트랜잭션 내에서 조회 시 결과 레코드 수가 달라질 수 있음을 말한다.

InnoDB의 기본 트랜잭션 격리 수준이다. InnoDB에서는 next-key 잠금 알고리즘을 이용해서 Phantom Read 를 방지한다.

 

- SERIALIZABLE

InnoDB의 경우 Gap lock 이 걸려서 조건에 해당하는 새로운 row 가 추가되는 것을 방지한다. 

SERIALIZABLE isolation level은 데이터를 안전하게 보호할 수 있지만 굉장히 쉽게 deadlock 에 걸릴 수 있다. 따라서 신중히 계산하고 사용해야한다.

 

 

블로그 이미지

uchacha

개발자 일지

,

[Oracle Database 19c] restart

DB 2023. 5. 25. 16:57

상황

oracle database 19c 를 centos 7에 설치 후 

- @설치 참고: https://oracle-base.com/articles/19c/oracle-db-19c-installation-on-oracle-linux-7

잘 사용하다가 docker 를 설치하기 위해 시스템을 재부팅했더니 oracle 이 꺼져있었다.

 

따라서 위 설치 참고 링크에서 

installation 이 완료 된 후 database 및 listener 를 실행하기 위한 start_all.sh 를 만들어서 실행 시켰다.

 

방법

모든 작업은 oracle 을 설치할때 생성한 oracle 계정으로 실행되었다.

1. /home/oracle/scripts 에 

설치했을 때의 ~/.bash_profile 을 참고하여 setEnv.sh 파일을 생성하고,

- setEnv.sh

더보기
cat > /home/oracle/scripts/setEnv.sh
# Oracle Settings
export TMP=/tmp
export TMPDIR=$TMP

export ORACLE_HOSTNAME=ol7-19.localdomain
export ORACLE_UNQNAME=cdb1
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19.0.0/dbhome_1
export ORA_INVENTORY=/u01/app/oraInventory
export ORACLE_SID=cdb1
export PDB_NAME=pdb1
export DATA_DIR=/u02/oradata

export PATH=/usr/sbin:/usr/local/bin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

 

2. start_all.sh, stop_all.sh 파일을 생성 한 후 실행권한을 주었다.

- start_all.sh

더보기
cat > /home/oracle/scripts/start_all.sh
#!/bin/bash
. /home/oracle/scripts/setEnv.sh

export ORAENV_ASK=NO
. oraenv
export ORAENV_ASK=YES

dbstart $ORACLE_HOME

 

 

- stop_all.sh

더보기
cat > /home/oracle/scripts/stop_all.sh
#!/bin/bash
. /home/oracle/scripts/setEnv.sh

export ORAENV_ASK=NO
. oraenv
export ORAENV_ASK=YES

dbshut $ORACLE_HOME

 

- 실행 권한 주기

chown -R oracle:oinstall /home/oracle/scripts
chmod u+x /home/oracle/scripts/*.sh

 

3. ORACLE_HOME 이 잘 세팅되어있는지 확인해보고, 값이 없으면 bash_profile을 다시 적용해주었다.

> echo $ORACLE_HOME
설정해 두었던 /u01/app/oracle/product/19.0.0/dbhome_1 이 나오지 않는 경우

> source ~/.bash_profile

 

4. /etc/oratab 파일을 listener 와 database 를 실행하도록 확인 후 수정해주었다.

SOLARIS 제외한 UNIX platform 에선 ORATAB=/etc/oratab 이며,

$ORACLE_SID:$ORACLE_HOME:<N|Y|W>
example> main:/usr/lib/oracle/emagent_10g:Y

W 는 dbstart 가 ASM 인스턴스가 돌아간 후에 database 가 자동 시작되게 하는 거라고 한다.

 

 

5. 확인작업으로 

ps -ef | grep pmon 을 통해 oracle database 가 돌 때 같이 도는 oracle process monitor 가 작동중인지 확인했으며,

lsntctl status 를 통해 리스터의 현 상태를 확인해 볼 수 있다.

sqlplus / as sysdba 로 접속해볼 수도 있다.

 

상황

oracle 은 동작하는데 DBeaver client 에서 접속이 안될때,

- @oracle 접속 안되는 이유: https://jhnyang.tistory.com/entry/DB-Sql-developer-%EC%97%90%EB%9F%AC-The-Network-Adapter-could-not-establish-the-connection-%EC%9B%90%EC%9D%B8%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0%EB%B2%95

SID, Service Name 설정 및 방화벽 설정을 차례로 체크해보다가 방화벽에 의한 것임을 알고 

방화벽에 1521 포트를 열어주었다.

> systemctl status firewalld
> firewall-cmd --permanent --zone=public --add-port=1521/tcp
> firewall-cmd --reload
> firewall-cmd --permanent --zone=public --list-ports
1521/tcp

 

블로그 이미지

uchacha

개발자 일지

,

[HikariCP] Configuration

DB 2022. 3. 25. 16:57

- @참고: https://github.com/brettwooldridge/HikariCP#artifacts

 

유용하게 쓰일만한 설정 몇가지를 짚어본다.

 

⏳connectionTimeout

이 property는 client가 pool로부터 connection을 기다리는 최대 miliseconds를 통제한다. 사용 가능한 connection을 받지 못하고 이 시간이 초과되면, SQLException이 thrown 된다.

최소 connection timeout 시간은 250 ms 이다.

Default: 30000 (30 sec)

 

⏳idleTimeout

이 property는 connection이 pool에서 놀게 허용하는 최대 시간을 조정한다.

오직 minimumIdlemaximumPoolSize 보다 작게 정의된 경우에만 적용된다. 

pool size가 minimumIdle과 같아지면 idle connection이 해제 되지 않는다.

연결이 idle(유휴) 상태에서 만료되는지되는 지 여부는 최대 +30초 변동성 및, 평균 +15초의 변동성이 있다. 이 시간 전에는 만료되지 않는다.

값이 0이면 idle connection은 절대 pool에서 제거 되지 않는다.

최소 값은 1000ms(10 sec) 이며, Default: 600000ms(10 min) 이다.

 

⏳keepaliveTime

이 property는 HikariCP가 database 나 network infrastructure에 의해 time out 되지 않게 하기 위해 얼마나 자주 connection을 살리기 위해 시도할 건지를 통제한다.

이 값은 maxLifetime 값보다 작아야 한다. (살아있는지 물으려면 죽기 전이여야 할 것이다.)

"keepalive"은 오직 idle connection에만 발생한다. 

connection이 "keepalive" 시간이 되면, connection은 pool에서 제거 되고, "pinged" 된 후 다시 pool로 반환된다.

"ping"은 다음 중 하나다.

JDBC4의 isValid() 메소드 호출이거나 connectionTestQuery 의 실행이다.

최소 값은 30000ms (30 sec) 이고, 분 단위가 가장 바람직하다. Default: 0 (disabled. 즉, 비활성화되는 값이다.)

 

⏳maxLifetime

이 property는 pool에 있는 connection의 최대 lifetime을 통제한다.

이 값을 세팅하길 강력히 추천하고, database나 infrastructure에서 부과한 connection time limit 보다 몇초 짧아야 한다.

0 값은 infinite lifetime 이며, idleTimeout 에 따른다.

최소 값은 30000ms (30 sec) 이며, Default: 180000 (30 min) 이다.

 

🔢minimumIdle

이 property는 HikariCP가 pool에 유지하는 idle connection의 최소 숫자를 통제한다.

만약 idle connection이 이 값 아래로 떨어지고 pool 의 총 connection 이 maximumPoolSize 미만이면, HikariCP 는 재빨리, 효과적으로 connction을 추가한다.

그러나, 최대 성능과 급증한 요구에 대한 응답을 위해, 이 값을 설정하지 말고, HikariCP가 고정 connection pool을 행하게 하는 걸 추천한다.

기본값: maximumPoolSize 값이다.

 

🔢maximumPoolSize

이 property는 idle 과 사용중인 connection을 통틀어 도달 가능한 최대 pool size를 통제한다. 기본적으로 이 값은 database backend에 대한 실제 connection 의 최대 개수를 결정한다.

합리적인 값은 실행환경에 의해 결정된다.

pool 이 이 사이즈에 도달하고, 사용가능한 idle connection이 없으면, getConnection() 호출은 time out 되기 까지 connectionTimeout milliseconds 만큼 block 된다.

블로그 이미지

uchacha

개발자 일지

,

[MySQL] collation

DB/SQL 2022. 2. 15. 16:41

- @참고: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=seuis398&logNo=220851196727

 

 

'DB > SQL' 카테고리의 다른 글

[MySQL] Safe update mode off  (0) 2020.11.10
[PostgreSQL] 설치, 사용자 추가 및 DB 생성, Client Tool  (0) 2020.06.08
블로그 이미지

uchacha

개발자 일지

,

[MySQL] Safe update mode off

DB/SQL 2020. 11. 10. 15:00

- @참고: jun7222.tistory.com/371

 

상황

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.

MySQL에서 default로 column을 delete할 때 where 절을 쓰지 않고는 지워지지 않게 세팅이 되어있다.

이를 바꾸기 위해선 MySQL Safe mode를 off 해줘야 한다.

 

해결

방법1. MySQL Workbench에서 변경하는 방법

Edit > Preferences > SQL Editor 페이지에서 밑에 Safe Updates (rejects UPDATEs and DELETEs with no restrictions) 체크 해제

Query > Reconnect to Server

 

방법2. 쿼리로 변경하는 방법

SET SQL_SAFE_UPdates=0;

 

'DB > SQL' 카테고리의 다른 글

[MySQL] collation  (0) 2022.02.15
[PostgreSQL] 설치, 사용자 추가 및 DB 생성, Client Tool  (0) 2020.06.08
블로그 이미지

uchacha

개발자 일지

,

'DB > SQL' 카테고리의 다른 글

[MySQL] collation  (0) 2022.02.15
[MySQL] Safe update mode off  (0) 2020.11.10
블로그 이미지

uchacha

개발자 일지

,