{"id":774,"date":"2024-11-06T12:18:24","date_gmt":"2024-11-06T11:18:24","guid":{"rendered":"https:\/\/ilmarkerm.eu\/blog\/?p=774"},"modified":"2024-11-06T12:18:24","modified_gmt":"2024-11-06T11:18:24","slug":"ordsgraphql-with-graalvm-21-for-dbas","status":"publish","type":"post","link":"https:\/\/ilmarkerm.eu\/blog\/2024\/11\/ordsgraphql-with-graalvm-21-for-dbas\/","title":{"rendered":"ORDS+GraphQL with GraalVM 21, for DBAs"},"content":{"rendered":"\n<p>I&#8217;m forced to write my first JavaScript related post \ud83d\ude41 Oh, well.<\/p>\n\n\n\n<p>ORDS version at the time of writing is 24.3.<\/p>\n\n\n\n<p>Oracle Rest Data Services (ORDS) does support (currently read-only) GraphQL protocol for serving data from Oracle rest enabled tables. You can read more about it here: <a href=\"https:\/\/oracle-base.com\/articles\/misc\/oracle-rest-data-services-ords-graphql\" data-type=\"link\" data-id=\"https:\/\/oracle-base.com\/articles\/misc\/oracle-rest-data-services-ords-graphql\">https:\/\/oracle-base.com\/articles\/misc\/oracle-rest-data-services-ords-graphql<\/a><\/p>\n\n\n\n<p>To get GraphQL support working, ORDS need to be running using GraalVM JDK &#8211; but it&#8217;s not as simple as switching the JDK &#8211; GraalVM also needs to support JavaScript polyglot engine. When I started looking into this world I was properly confused, starting with naming &#8211; <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-rest-data-services\/24.3\/ordig\/installing-REST-data-services.html#GUID-B5048C9D-5C8A-4591-AD9B-4B145DE20E1E\">ORDS 24.3 installation checklist still requires GraalVM Enterprise Edition<\/a> and when going to search for it find man-bear-pigs like GraalVM-EE-23-for-JDK-17. Properly confusing for a non-developer like me.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.jvm-weekly.com\/p\/graalvm-ee-is-dead-long-live-oracle\">Luckily naming has been significantly simplified recently and GraalVM EE is dead<\/a><\/p>\n\n\n\n<p>Naming starting from GraalVM for JDK21 is simplified, but what has gone much more complicated is installing JavaScript polyglot libraries for GraalVM. With GraalVM for JDK 17 there was a command &#8220;gu install&#8221; for it, but <a href=\"https:\/\/github.com\/oracle\/graal\/issues\/6855\" data-type=\"link\" data-id=\"https:\/\/github.com\/oracle\/graal\/issues\/6855\">it has been removed starting from GraalVM for JDK 21<\/a>.<\/p>\n\n\n\n<p><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-rest-data-services\/24.3\/ordig\/installing-REST-data-services.html#GUID-B5048C9D-5C8A-4591-AD9B-4B145DE20E1E\" data-type=\"link\" data-id=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-rest-data-services\/24.3\/ordig\/installing-REST-data-services.html#GUID-B5048C9D-5C8A-4591-AD9B-4B145DE20E1E\">ORDS installation checklist 24.3 acknowledges it<\/a>, but <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-rest-data-services\/24.3\/orddg\/extending-ords-functionality-plugins.html#GUID-786560A1-82E7-4D12-A910-05DBB8FA0981\" data-type=\"link\" data-id=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-rest-data-services\/24.3\/orddg\/extending-ords-functionality-plugins.html#GUID-786560A1-82E7-4D12-A910-05DBB8FA0981\">then gives some strange XML code on how to install them<\/a>. Not helpful for non-developers, like me. This XML is intended to describe dependencies for Java project (using Maven), so during build the dependencies would be fetched automatically. But I have nothing to build &#8211; GraphQL support is already in ORDS, I just need the dependencies downloaded.<\/p>\n\n\n\n<p>I think, if the extra libraries are needed for ORDS built in functionality to work, ORDS should include them by default.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installation steps<\/h2>\n\n\n\n<p>I know pretty much all software can be downloaded using Oracle provided yum repositories, but here I&#8217;m doing everything manually, to be able to control the versions precisely. And not to mess with RPM-s, unzipping this is so much easier and predictable and more usable across all possible Linux distributions.<\/p>\n\n\n\n<p>All software is placed under <strong>\/home\/ords<\/strong> in my example.<\/p>\n\n\n\n<p>First lets download GraalVM for JDK 21 itself. Oracle has started to offer non-website-clicking &#8220;script friendly&#8221; URLs that always point to the latest version, <a href=\"https:\/\/www.oracle.com\/java\/technologies\/jdk-script-friendly-urls\/\" data-type=\"link\" data-id=\"https:\/\/www.oracle.com\/java\/technologies\/jdk-script-friendly-urls\/\">you can get them here<\/a>. I&#8217;m not going to use ANY latest URL Oracle offers on purpose, since I&#8217;m an automation guy I need to be able to download predictable and internally tested versions of the software <strong>and be able to validate the downloaded software against known checksum value.<\/strong><\/p>\n\n\n\n<p>Download the software, all versions are current at the time of writing, but of course are very soon out of date<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># GraalVM for JDK21\nhttps:&#47;&#47;download.oracle.com\/graalvm\/21\/archive\/graalvm-jdk-21.0.5_linux-x64_bin.tar.gz\n\n# Maven\nhttps:\/\/dlcdn.apache.org\/maven\/maven-3\/3.9.9\/binaries\/apache-maven-3.9.9-bin.tar.gz\n\n# ORDS\nhttps:\/\/download.oracle.com\/otn_software\/java\/ords\/ords-24.3.0.262.0924.zip<\/code><\/pre>\n\n\n\n<p>In Ansible something like this, also unzipping them. Take it as an example, and not copy it blindly<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Facts\ngraalvm_download_url: \"<a href=\"https:\/\/download.oracle.com\/graalvm\/21\/archive\/graalvm-jdk-21.0.5_linux-x64_bin.tar.gz\">https:\/\/download.oracle.com\/graalvm\/21\/archive\/graalvm-jdk-21.0.5_linux-x64_bin.tar.gz<\/a>\"\ngraalvm_download_checksum: \"sha256:c1960d4f9d278458bde1cd15115ac2f0b3240cb427d51cfeceb79dab91a7f5c9\"\ngraalvm_install_dir: \"{{ ords_install_base }}\/graalvm\"\n\nmaven_download_url: \"https:\/\/dlcdn.apache.org\/maven\/maven-3\/3.9.9\/binaries\/apache-maven-3.9.9-bin.tar.gz\"\nmaven_download_checksum: \"sha512:a555254d6b53d267965a3404ecb14e53c3827c09c3b94b5678835887ab404556bfaf78dcfe03ba76fa2508649dca8531c74bca4d5846513522404d48e8c4ac8b\"\nmaven_install_dir: \"{{ ords_install_base }}\/maven\"\n\nords_download_url: \"<a href=\"https:\/\/download.oracle.com\/otn_software\/java\/ords\/ords-24.3.0.262.0924.zip\">https:\/\/download.oracle.com\/otn_software\/java\/ords\/ords-24.3.0.262.0924.zip<\/a>\"\nords_installer_checksum: \"sha1:6e8d9b15faa232911fcff367c99ba696389ceddc\"\nords_install_dir: \"{{ ords_install_base }}\/ords\"\nords_install_base: \"\/home\/ords\"\n\n# Tasks\n- name: Download GraalVM\n  ansible.builtin.get_url:\n      url: \"{{ graalvm_download_url }}\"\n      dest: \"{{ ords_install_base }}\/graalvm.tar.gz\"\n      checksum: \"{{ graalvm_download_checksum }}\"\n      use_proxy: \"{{ 'yes' if http_proxy is defined and http_proxy else 'no' }}\"\n  environment:\n      https_proxy: \"{{ http_proxy }}\"\n  register: graalvm_downloaded\n- name: Unzip GraalVM\n  ansible.builtin.unarchive:\n      remote_src: yes\n      src: \"{{ ords_install_base }}\/graalvm.tar.gz\"\n      dest: \"{{ graalvm_install_dir }}\"\n      extra_opts:\n          - \"--strip-components=1\"\n  when: graalvm_downloaded is changed\n# Download maven\n- name: Download Maven\n  ansible.builtin.get_url:\n      url: \"{{ maven_download_url }}\"\n      dest: \"{{ ords_install_base }}\/maven.tar.gz\"\n      checksum: \"{{ maven_download_checksum }}\"\n      use_proxy: \"{{ 'yes' if http_proxy is defined and http_proxy else 'no' }}\"\n  environment:\n      https_proxy: \"{{ http_proxy }}\"\n  register: maven_downloaded\n- name: Unzip maven\n  ansible.builtin.unarchive:\n      remote_src: yes\n      src: \"{{ ords_install_base }}\/maven.tar.gz\"\n      dest: \"{{ maven_install_dir }}\"\n      extra_opts:\n          - \"--strip-components=1\"\n  when: maven_downloaded is changed\n# Download ORDS\n- name: Download ORDS\n  ansible.builtin.get_url:\n      url: \"{{ ords_download_url }}\"\n      dest: \"{{ ords_install_base }}\/ords-latest.zip\"\n      checksum: \"{{ ords_installer_checksum }}\"\n      use_proxy: \"{{ 'yes' if http_proxy is defined and http_proxy else 'no' }}\"\n  environment:\n      https_proxy: \"{{ http_proxy }}\"\n  register: ords_downloaded\n- name: Unzip ORDS installer\n  ansible.builtin.unarchive:\n      remote_src: yes\n      src: \"{{ ords_install_base }}\/ords-latest.zip\"\n      dest: \"{{ ords_install_dir }}\"\n  when: ords_downloaded is changed<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Now the complicated part, adding GraalVM JavaScript polyglot libraries<\/h2>\n\n\n\n<p>Create pom.xml file in some directory with contents. 24.1.1 is the current JavaScript engine version, you can see the available versions in <a href=\"https:\/\/mvnrepository.com\/artifact\/org.graalvm.polyglot\/polyglot\">https:\/\/mvnrepository.com\/artifact\/org.graalvm.polyglot\/polyglot<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\">\n  &lt;modelVersion>4.0.0&lt;\/modelVersion>\n  &lt;groupId>eu.ilmarkerm.ords&lt;\/groupId>\n  &lt;artifactId>ords-graaljs-download&lt;\/artifactId>\n  &lt;version>1.1.1&lt;\/version>\n  &lt;url>https:\/\/ilmarkerm.eu&lt;\/url>\n  &lt;name>POM to download GraalVM JavaScript engine&lt;\/name>\n  &lt;dependencies>\n    &lt;dependency>\n        &lt;groupId>org.graalvm.polyglot&lt;\/groupId>\n        &lt;artifactId>polyglot&lt;\/artifactId>\n        &lt;version>24.1.1&lt;\/version>\n    &lt;\/dependency>\n    &lt;dependency>\n        &lt;groupId>org.graalvm.polyglot&lt;\/groupId>\n        &lt;!-- Language: js -->\n        &lt;artifactId>js&lt;\/artifactId>\n        &lt;version>24.1.1&lt;\/version>\n        &lt;type>pom&lt;\/type>\n    &lt;\/dependency>\n  &lt;\/dependencies>\n&lt;\/project><\/code><\/pre>\n\n\n\n<p>Execute maven to download the required libraries and place them under ORDS libraries<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/home\/ords\/maven\/bin\/mvn dependency:copy-dependencies -DoutputDirectory=\/home\/ords\/ords\/lib\/ext -DuseBaseVersion=true<\/code><\/pre>\n\n\n\n<p>It will download files like these (polyglot 24.1.1):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>collections-24.1.1.jar\nicu4j-24.1.1.jar\njniutils-24.1.1.jar\njs-language-24.1.1.jar\nnativebridge-24.1.1.jar\nnativeimage-24.1.1.jar\npolyglot-24.1.1.jar\nregex-24.1.1.jar\ntruffle-api-24.1.1.jar\ntruffle-compiler-24.1.1.jar\ntruffle-enterprise-24.1.1.jar\ntruffle-runtime-24.1.1.jar\nword-24.1.1.jar<\/code><\/pre>\n\n\n\n<p>Start ORDS (using GraalVM JDK) and then ORDS support for GraphQL is ready to be used.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>I&#8217;m not a java developer, so things might be wrong here \ud83d\ude42<\/p>\n\n\n\n<p>But I do hope the situation improves over the next couple of ORDS versions.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;m forced to write my first JavaScript related post \ud83d\ude41 Oh, well. ORDS version at the time of writing is 24.3. Oracle Rest Data Services (ORDS) does support (currently read-only) GraphQL protocol for serving data from Oracle rest enabled tables. You can read more about it here: https:\/\/oracle-base.com\/articles\/misc\/oracle-rest-data-services-ords-graphql To get GraphQL support working, ORDS need [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[16,4,66],"class_list":["post-774","post","type-post","status-publish","format-standard","hentry","category-blog-entry","tag-java","tag-oracle","tag-ords"],"_links":{"self":[{"href":"https:\/\/ilmarkerm.eu\/blog\/wp-json\/wp\/v2\/posts\/774","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ilmarkerm.eu\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ilmarkerm.eu\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ilmarkerm.eu\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ilmarkerm.eu\/blog\/wp-json\/wp\/v2\/comments?post=774"}],"version-history":[{"count":5,"href":"https:\/\/ilmarkerm.eu\/blog\/wp-json\/wp\/v2\/posts\/774\/revisions"}],"predecessor-version":[{"id":779,"href":"https:\/\/ilmarkerm.eu\/blog\/wp-json\/wp\/v2\/posts\/774\/revisions\/779"}],"wp:attachment":[{"href":"https:\/\/ilmarkerm.eu\/blog\/wp-json\/wp\/v2\/media?parent=774"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ilmarkerm.eu\/blog\/wp-json\/wp\/v2\/categories?post=774"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ilmarkerm.eu\/blog\/wp-json\/wp\/v2\/tags?post=774"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}