是Hibernate,PostgreSQL还是Spring Boot:尝试衡量JDBC REF_CURSOR支持级别时出现意外错误:null

时间:2014-10-16 14:44:46

标签: hibernate postgresql jdbc spring-boot

在我的项目中使用PostgreSQL JDBC驱动程序时,我得到一个奇怪的错误,指出"尝试测量JDBC REF_CURSOR支持级别的意外错误:null"

它导致我的应用程序在启动时持续八十到三百秒之间挂起。启动后一切正常。我使用以下驱动程序版本:

(Gradle Dependency风格) ' org.postgresql:在PostgreSQL:9.3-1102-jdbc41'

我的应用程序是一个Spring Boot应用程序,在启动该应用程序时会发生挂起。

打开Hibernate日志记录后,我看到了错误。完整日志如下所示。

http://pastebin.com/CAjSyQw9

在它粘贴到该粘贴中的日志的最后一行之后,应用程序挂起八十到三百秒,通常平均约100秒。应用程序仍然可以正常启动并按预期工作。

这种错误是否与JDBC驱动程序有关?

关于此主题here也存在类似的问题。

编辑1:

看起来我的粘贴垃圾桶的第69和70行发生了一些非常奇怪的事情。看起来我的org.postgresql.Dialect的指定方言正在被改为某些MySQL的东西。

[org.hibernate.dialect.Dialect] : [MySQL5] -> [org.hibernate.dialect.MySQL5Dialect] (replacing [org.hibernate.dialect.MySQL5Dialect])
2014-10-16 08:05:50.561 DEBUG 36916 --- [ost-startStop-1] o.h.b.r.s.internal.StrategySelectorImpl  : Registering named strategy selector [org.hibernate.dialect.Dialect] : [MySQL5InnoDB] -> [org.hibernate.dialect.MySQL5InnoDBDialect] (replacing [org.hibernate.dialect.MySQL5InnoDBDialect])

3 个答案:

答案 0 :(得分:8)

我有同样的问题。我修复了它......通过添加答案here中定义的System属性来解决它。

这与Hibernate和Postgresql如何查找数据库元数据有关。如果数据库中有许多数据类型,则该过程可能需要很长时间,因为每种数据类型都需要SQL往返信息。下面定义的System属性绕过整个元数据检索,并使用Postgresql的Hibernate默认值。

-Dhibernate.temp.use_jdbc_metadata_defaults=false

希望这有助于其他人。

答案 1 :(得分:1)

我遇到了类似的问题。

要使用 Spring boot 进行修复,请使用:

SELECT

这对我有用。

答案 2 :(得分:0)

我不是一个Java人,但有点谷歌搜索告诉我,REF_CURSOR的东西在4.2中放入JDBC,你似乎正在运行4.0

所以 - 它无法找到" supportsRefCursors"方法并返回null,记录异常。

您是否需要将您的Hibernate版本与您的JDBC版本相匹配?

这是否解释了延迟,我不知道。尝试记录SQL - 然后你可以看到真正发生的事情。