我试图将Snowflake连接到基于Sping Boot 的应用程序。一切正常,但由于Snowflake中的一些疯狂的默认值,我不得不处理以下错误:https://community.snowflake.com/s/article/SAP-BW-Java-lang-NoClassDefFoundError-for-Apache-arrow
我可以通过Spring data JPA触发查询,但根本无法Map结果。解决方案要求将默认的结果集格式从ARROW更改为JSON:
Customer can use this property (jdbc_query_result_format=json) in datasouce property of Application server or session property in application like
Statement = connection.createStatement();
Statement.executeQuery("ALTER SESSION SET JDBC_QUERY_RESULT_FORMAT='JSON'");
我只是想知道如何用Spring实现这一点。在引导期间运行上面的SQL。我使用Spring Data JPA查询。
3条答案
按热度按时间rryofs0p1#
参数JDBC_QUERY_RESULT_FORMAT可以针对每个账户/用户/会话进行设置,因此,如果您总是希望为该用户设置JSON,您可以直接通过Snowflake UI设置它,只需一次:
这只会影响您的用户,并且帐户仍将ARROW作为默认值。并且您不需要始终在会话级别设置它。
ghg1uchk2#
这在现代JVM上会发生,因为Arrow希望进行低级内存分配。它会记录到stdout,希望JVM以
--add-opens=java.base/java.nio=ALL-UNNAMED
启动。适用于JDK 17的修复在Arrow Docs上描述为:
因此,如果您使用intellij/Docker,将
_JAVA_OPTIONS
的env var设置为--add-opens=java.base/java.nio=ALL-UNNAMED
可能是最好的解决方案。syqv5f0l3#
原来的问题可以通过调整应用程序中的一些内存设置轻松解决。
解决方案总结如下:
通过设置应用程序的
JAVA_OPTS
属性来增加堆内存并设置-XX:MaxDirectMemorySize
〉64 M。这背后的基本原理是Arrow格式固有地利用可用的堆内存来优化大型结果。没有足够的堆空间将导致上述错误。
我仍然需要执行更多的测试来找出堆内存、堆栈大小和这个变量→ -XX:MaxDirectMemorySize的理想值。
编辑:以下设置工作: