java Sping Boot - Snowflake JDBC -应用程序加载时自动更改会话

yxyvkwin  于 2023-04-10  发布在  Java
关注(0)|答案(3)|浏览(126)

我试图将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查询。

rryofs0p

rryofs0p1#

参数JDBC_QUERY_RESULT_FORMAT可以针对每个账户/用户/会话进行设置,因此,如果您总是希望为该用户设置JSON,您可以直接通过Snowflake UI设置它,只需一次:

ALTER USER <youruser> SET JDBC_QUERY_RESULT_FORMAT='JSON';

这只会影响您的用户,并且帐户仍将ARROW作为默认值。并且您不需要始终在会话级别设置它。

ghg1uchk

ghg1uchk2#

这在现代JVM上会发生,因为Arrow希望进行低级内存分配。它会记录到stdout,希望JVM以--add-opens=java.base/java.nio=ALL-UNNAMED启动。
适用于JDK 17的修复在Arrow Docs上描述为:

# Directly on the command line
java --add-opens=java.base/java.nio=ALL-UNNAMED -jar ...

# Indirectly via environment variables
env _JAVA_OPTIONS="--add-opens=java.base/java.nio=ALL-UNNAMED" java -jar ...

因此,如果您使用intellij/Docker,将_JAVA_OPTIONS的env var设置为--add-opens=java.base/java.nio=ALL-UNNAMED可能是最好的解决方案。

syqv5f0l

syqv5f0l3#

原来的问题可以通过调整应用程序中的一些内存设置轻松解决。
解决方案总结如下:
通过设置应用程序的JAVA_OPTS属性来增加堆内存并设置-XX:MaxDirectMemorySize〉64 M。
这背后的基本原理是Arrow格式固有地利用可用的堆内存来优化大型结果。没有足够的堆空间将导致上述错误。
我仍然需要执行更多的测试来找出堆内存、堆栈大小和这个变量→ -XX:MaxDirectMemorySize的理想值。
编辑:以下设置工作:

"JAVA_OPTS": "-Xss230k -XX:ReservedCodeCacheSize=100m -Xmx1800m -XX:MaxDirectMemorySize=1500m"

6 instances of the app running in parallel.

2GB RAM per instance ie. 12GB RAM in total (probably an overkill but it snowflake driver does eat up a lot of ram in general)

相关问题