是Hibernate、PostgreSQL还是Spring Boot:试图衡量JDBC引用游标支持级别时出现意外错误:null

是Hibernate、PostgreSQL还是Spring Boot:试图衡量JDBC引用游标支持级别时出现意外错误:null,hibernate,postgresql,jdbc,spring-boot,Hibernate,Postgresql,Jdbc,Spring Boot,在我的项目中使用PostgreSQL JDBC驱动程序时,我遇到了一个奇怪的错误:“试图衡量JDBC REF_游标支持级别时出现意外错误:null” 它会导致我的应用程序在启动80到300秒之间挂起。启动后一切正常。我正在使用以下驱动程序版本: (渐变依赖样式) 'org.postgresql:postgresql:9.3-1102-jdbc41' 我的应用程序是一个Spring启动应用程序,挂起发生在启动该应用程序时 打开Hibernate日志记录后,我看到了错误。完整日志位于以下粘贴位置

在我的项目中使用PostgreSQL JDBC驱动程序时,我遇到了一个奇怪的错误:“试图衡量JDBC REF_游标支持级别时出现意外错误:null”

它会导致我的应用程序在启动80到300秒之间挂起。启动后一切正常。我正在使用以下驱动程序版本:

(渐变依赖样式) 'org.postgresql:postgresql:9.3-1102-jdbc41'

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

打开Hibernate日志记录后,我看到了错误。完整日志位于以下粘贴位置

在它到达该粘贴中日志的最后一行之后,应用程序将挂起80到300秒,通常平均挂起100秒左右。应用程序仍然可以正常启动,并按预期工作

这种错误似乎是JDBC驱动程序的问题吗

在这个话题上有一个类似的问题

编辑1: 看起来在我的粘贴箱粘贴的第69行和第70行发生了一些非常奇怪的事情。看起来我指定的方言org.postgresql.dial正在被改成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])

我不是一个Java人,但通过谷歌搜索,我发现REF_CURSOR的东西是在4.2版本中被放入JDBC的,而您似乎正在运行4.0

因此-它找不到“supportsRefCursors”方法并返回null,记录异常

您需要将Hibernate版本与JDBC版本或类似的版本相匹配吗


我不知道这是否能解释延迟的原因。尝试记录SQL-然后您可以看到真正发生了什么。

我也遇到了同样的问题。我修好了…呃。。。通过添加答案中定义的系统属性,解决了这个问题

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

-Dhibernate.temp.use\u jdbc\u metadata\u defaults=false


希望这对其他人有所帮助。

我遇到了类似的问题

要使用弹簧靴来修复它,请使用:

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

这对我很有用。

我已经在调试时记录了Hibernate。当你说log SQL时,我还需要做什么?如果你不能在JDBC级别记录它,你可以在PostgreSQL本身中打开语句日志记录。我想我发现了这个问题。如果你看一下我的Pastebin paste的第69行和第70行,你会发现它试图用MySQL做一些奇怪的替换。也许写下确切的细节作为答案并接受它。我还没有解决这个问题。我倾向于认为这是我的数据库驱动程序和服务器上安装的PostgreSQL版本之间的版本不兼容。当我连接到本地机器上的一个数据库时,它有一个9.3版本的PosgreSQL数据库,我没有问题。当我连接到9.2数据库时,我遇到了一个问题。再过几天,我可能会写一个答案。你为什么在Postgres中使用MySQL5方言?@a_horse_和_no_name我不是故意在PostgreSQL中使用MySQL方言。在application.properties文件中,我将其设置为
org.hibernate.dialent.PostgreSqlDialent
,因此它突然变为MySQL方言毫无意义。我想知道Spring数据、Spring引导或Spring JPA之间是否发生了意外情况。@您找到了解决方案吗?我正在经历同样奇怪的变化,改为
mysql5dialent
,而不是(指定的)
postgressqldialent
。我找到的唯一解决方案是,当我使用我公司的移动VPN客户端时,我发现了错误。当我将java应用程序放在VPN后面的一台Unix服务器上时,由于一些奇怪的原因,一切都正常工作。所以这不是一个真正的解决方案,只是对我有用的东西。