关于Java:在createClob()方法引发错误时禁用上下文LOB创建

Disabling contextual LOB creation as createClob() method threw error

我正在将Hibernate 3.5.6与Oracle 10g一起使用。 我在初始化期间看到以下异常,但应用程序本身运行正常。 发生此异常的原因是什么? 以及如何纠正?

例外
createClob()方法引发错误时,禁用上下文LOB创建:java.lang.reflect.InvocationTargetException

信息
Oracle版本:Oracle数据库10g企业版10.2.0.4.0
JDBC驱动程序:Oracle JDBC驱动程序,版本:11.1.0.7.0


通过在下面添加属性来禁用此警告。

对于Spring应用程序:

1
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false

普通JPA:

1
hibernate.temp.use_jdbc_metadata_defaults=false


如您所见,此异常不是真正的问题。它发生在引导期间,当Hibernate尝试从数据库中检索一些元信息时。如果这使您烦恼,可以将其禁用:

1
hibernate.temp.use_jdbc_metadata_defaults false


查看源代码中的评论:

Basically here we are simply checking
whether we can call the
java.sql.Connection methods for LOB
creation added in JDBC 4. We not only
check whether the java.sql.Connection
declares these methods, but also
whether the actual java.sql.Connection
instance implements them (i.e. can be
called without simply throwing an
exception).

因此,它正在尝试确定是否可以使用一些新的JDBC 4方法。我猜您的驱动程序可能不支持新的LOB创建方法。


为了隐藏异常:

对于Hibernate 5.2(和Spring Boot 2.0),您可以使用其他人指出的use_jdbc_metadata_defaults属性:

1
2
# Meant to hide HHH000424: Disabling contextual LOB creation as createClob() method threw error
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false

或者,如果您不希望上述设置有任何副作用(有条评论警告我们有关Oracle的某些副作用,但我不知道它是否有效),您可以仅禁用此类异常的日志记录:

1
2
3
4
logging:
   level:
      # Hides HHH000424: Disabling contextual LOB creation as createClob() method threw error
      org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl: WARN

摆脱异常

1
INFO - HHH000424: Disabling contextual LOB creation as createClob() method threw error :java.lang.reflect.InvocationTargetException

hibernate.cfg.xml文件中,添加以下属性

1
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>


使用Hibernate 4.3.x / 5.0.x对此进行更新-您可以将此属性设置为true:

1
<prop key="hibernate.jdbc.lob.non_contextual_creation">true</prop>

摆脱该错误信息。效果相同,但没有"引发异常"详细信息。
有关详细信息,请参见LobCreatorBuilder源。


只需在application.properties中添加以下行

1
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults: false

如其他评论所述

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

到目前为止,看起来此设置不会引起任何问题。


如果您设置:

1
hibernate.temp.use_jdbc_metadata_defaults: false

当您的表名包含保留字(如user)时,可能会给您带来PostgreSQL的麻烦。插入后,它将尝试使用以下命令查找ID序列:

1
select currval('"user"_id_seq');

这显然会失败。至少对于Hibernate 5.2.13和Spring Boot 2.0.0.RC1而言。还没有找到其他方法来阻止此消息,因此现在忽略它。


将JDBC驱动程序更新到最新版本可以消除讨厌的错误消息。

你可以在这里下载:

http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

但是需要免费注册。


使用Spring Boot 2.1.x时,在启动应用程序时会出现此警告消息。

如此处所示,由于相关属性默认情况下设置为true,而现在为false,因此在较早版本中可能不会出现此问题:

https://github.com/spring-projects/spring-boot/issues/12007

因此,解决此问题就像在spring application.property文件中添加以下属性一样简单。

1
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true


发生问题是因为您没有选择适当的JDBC。只需下载并使用针对oracle 10g(而非11g)的JDBC。


当我的Web应用程序是在Linux中由访问权限不足的用户登录启动时遇到此错误的。这个错误

org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000424:
Disabling contextual LOB creation as createClob() method threw error :
java.lang.reflect.InvocationTargetException

通常在其他错误/异常之前,尤其是来自应用服务器的错误/异常之前
对于Tomcat:

org.apache.catalina.LifecycleException: Failed to initialize component ...

要么

java.lang.UnsatisfiedLinkError: ... cannot open shared object file: No such file or directory

解:

  • 停止您的Web应用程序当前实例。

  • 以超级用户或具有足够访问权限(即root)的用户登录

  • 重新启动您的Web应用程序或再次调用上一个功能。


  • 对于任何使用Spring Boot 2面临此问题的人

    默认情况下,Spring引导使用的是hibernate 5.3.x版本,我在pom.xml中添加了以下属性

    1
    <hibernate.version>5.4.2.Final</hibernate.version>

    错误消失了。错误原因已在上面的帖子中进行了解释


    如果将@Temporal注释与java.sql。*类一起使用,请删除它。


    检查您是否不在VPN上。我有同样的问题,但意识到我正在连接到远程数据库!