createClob () 메서드로 인해 컨텍스트 LOB 생성을 비활성화하면 오류가 발생했습니다.
Oracle 10g와 함께 Hibernate 3.5.6을 사용하고 있습니다. 초기화 중에 아래 예외가 표시되지만 응용 프로그램 자체가 제대로 작동합니다. 이 예외의 원인은 무엇입니까? 어떻게 수정할 수 있습니까?
예외
상황 별 LOB 생성 비활성화 createClob()
메서드로 인해 오류가 발생했습니다.java.lang.reflect.InvocationTargetException
정보
Oracle 버전 : Oracle Database 10g Enterprise Edition 릴리스 10.2.0.4.0 JDBC 드라이버 : Oracle JDBC 드라이버, 버전 : 11.1.0.7.0
아래에 속성을 추가하여이 경고를 비활성화하십시오.
Spring 애플리케이션의 경우 :
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
일반 JPA :
hibernate.temp.use_jdbc_metadata_defaults=false
아시다시피이 예외는 실제 문제가 아닙니다. Hibernate가 데이터베이스에서 일부 메타 정보를 검색하려고 할 때 부팅 중에 발생합니다. 이것이 귀찮다면 비활성화 할 수 있습니다.
hibernate.temp.use_jdbc_metadata_defaults false
소스 의 주석을 살펴보면 :
기본적으로 여기서는 JDBC 4에 추가 된 LOB 생성을 위해 java.sql.Connection 메소드를 호출 할 수 있는지 확인하고 있습니다. java.sql.Connection이 이러한 메소드를 선언하는지 여부뿐만 아니라 실제 java.sql.Connection이 있는지 여부도 확인합니다. 인스턴스가이를 구현합니다 (예 : 단순히 예외를 던지지 않고 호출 될 수 있음).
그래서 새로운 JDBC 4 메소드를 사용할 수 있는지 확인하려고합니다. 드라이버가 새로운 LOB 생성 방법을 지원하지 않을 수 있습니다.
예외를 제거하려면
INFO - HHH000424: Disabling contextual LOB creation as createClob() method threw error :java.lang.reflect.InvocationTargetException
에서 hibernate.cfg.xml
파일 속성을 아래에 추가
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
예외를 숨기려면 :
Hibernate 5.2 (및 Spring Boot 2.0)의 경우 다른 사람들이 지적한 use_jdbc_metadata_defaults 속성을 사용할 수 있습니다 .
# Meant to hide HHH000424: Disabling contextual LOB creation as createClob() method threw error
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
또는 위의 설정에서 부작용을 일으키지 않으려면 (일부 Oracle 부작용에 대해 경고하는 주석이 있습니다. 유효한지 여부는 모르겠습니다) 다음과 같이 예외 로깅을 비활성화 할 수 있습니다. :
logging:
level:
# Hides HHH000424: Disabling contextual LOB creation as createClob() method threw error
org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl: WARN
Hibernate 4.3.x / 5.0.x를 사용하기 위해 이것을 업데이트하십시오-이 속성을 true로 설정할 수 있습니다 :
<prop key="hibernate.jdbc.lob.non_contextual_creation">true</prop>
그 오류 메시지를 제거합니다. 동일한 효과이지만 "예외 발생"세부 사항이 없습니다. 자세한 내용은 LobCreatorBuilder 소스를 참조하세요.
application.properties에 아래 줄을 추가하십시오.
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false
JDBC 드라이버를 최신 버전으로 업데이트하면 불쾌한 오류 메시지가 제거되었습니다.
여기에서 다운로드 할 수 있습니다.
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
하지만 무료 등록이 필요합니다.
설정하는 경우 :
hibernate.temp.use_jdbc_metadata_defaults: false
테이블 이름에 user와 같은 예약어가 포함되어 있으면 PostgreSQL에 문제가 발생할 수 있습니다. 삽입 후 다음을 사용하여 ID 시퀀스를 찾으려고 시도합니다.
select currval('"user"_id_seq');
분명히 실패 할 것입니다. 이것은 적어도 Hibernate 5.2.13 및 Spring Boot 2.0.0.RC1에서. 이 메시지를 방지하는 다른 방법을 찾지 못 했으므로 이제 무시하십시오.
적절한 JDBC를 선택하지 않았기 때문에 문제가 발생합니다. 11g가 아닌 Oracle 10g 용 JDBC를 다운로드하여 사용하십시오.
다른 의견에서 언급했듯이
hibernate.temp.use_jdbc_metadata_defaults = false
... 성가신 메시지를 수정하지만 다른 많은 놀라운 문제로 이어질 수 있습니다. 더 나은 솔루션은 다음과 같이 컨텍스트 LOB 생성을 비활성화하는 것입니다.
hibernate.jdbc.lob.non_contextual_creation = true
이렇게하면 Hibernate (내 경우에는 5.3.10.Final)가 JDBC 드라이버 검사를 건너 뛰고 다음 메시지를 출력합니다.
HHH000421: Disabling contextual LOB creation as hibernate.jdbc.lob.non_contextual_creation is true
지금까지는이 설정이 문제를 일으키지 않는 것 같습니다.
I hit this error when my web app was started in Linux by user logged in with insufficient access rights. This error
org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
usually preceded by other errors / exceptions, especially from your application server i.e for Tomcat:
org.apache.catalina.LifecycleException: Failed to initialize component ...
or
java.lang.UnsatisfiedLinkError: ... cannot open shared object file: No such file or directory
Solution:
Stop your web apps current instance.
Login with super user or those with sufficient access rights i.e root
Restart your web app or call previous function again.
For anyone who is facing this problem with Spring Boot 2
by default spring boot was using hibernate 5.3.x version, I have added following property in my pom.xml
<hibernate.version>5.4.2.Final</hibernate.version>
and error was gone. Reason for error is already explained in posts above
Remove @Temporal annotations if you use it with java.sql.* classes.
Check if you are not on a VPN. I had the same issue but realized the db I was connecting to remote!
'program story' 카테고리의 다른 글
Android : 프로그래밍 방식으로 Java 코드에서 Spinner 채우기 (0) | 2020.10.11 |
---|---|
구분되지 않는 공백이있는 ReactJS 렌더링 문자열 (0) | 2020.10.11 |
Android : 대화 상자의 EditText가 소프트 키보드를 표시하지 않습니다. (0) | 2020.10.11 |
OFFSET / FETCH NEXT에서 총 행 수 가져 오기 (0) | 2020.10.11 |
Python 요청 라이브러리 리디렉션 새 URL (0) | 2020.10.11 |