簡體   English   中英

GraalVM 原生鏡像和 Oracle ojdbc11-21.1

[英]GraalVM native-image and Oracle ojdbc11-21.1

我目前正在嘗試使用 GraalVM 的本機映像工具和 Oracle 驅動程序。 源代碼編譯生成exe文件,沒有錯誤。 但是當我啟動程序時,它會得到一個 java.lang.RuntimeException: Missing character set id 170 not loaded at image build time。

我正在使用字符集 NLS_CHARACTERSET = EE8MSWIN1250 連接到數據庫。 當我使用帶有 NLS_CHARACTERSET = AL32UTF8 的數據庫時,連接工作正常。

我在 Windows 10 6 計算機上使用 GraalVM CE 21.0.0.2(構建 11.0.10+8-jvmci-21.0-b06 和 ojdbc11-21.1.0.0.jar)

下面是錯誤消息和源代碼。 我使用了來自https://github.com/oracle/oracle-db-examples/blob/master/java/jdbc/ConnectionSamples/DataSourceSample.java的示例代碼

Exception in thread "main" java.lang.RuntimeException: Missing character set id 170 not loaded at image build time at oracle.sql.CharacterSet.make(CharacterSet.java:121) at oracle.jdbc.driver.DBConversion.init(DBConversion .java:184) at oracle.jdbc.driver.DBConversion.(DBConversion.java:137) at oracle.jdbc.driver.T4CConnection.doCharSetNegotiation(T4CConnection.java:2607) at oracle.jdbc.driver.T4CConnection.connect(T4CConnection .java:2176) 在 oracle.jdbc.driver.T4CCon nection.logon(T4CConnection.java:644) at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:1069) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:90) at oracle.jdbc.driver .OracleDriver.connect(OracleDriver.java:681) at oracle.jdbc.datasource.impl.OracleDataSource.getPhysicalConnection(OracleDataSource.java:569) at oracle.jdbc.datasource.impl.OracleDataSource.getConnection(OracleDataSource.java:355) at oracle.jdbc.datas ource.impl.OracleDataSource.getConnectionInternal(OracleDataSource.java:2014) at oracle.jdbc.datasource.impl.OracleDataSource.getConnection(OracleDataSource.java:330) at oracle.jdbc.datasource.impl.OracleDataSource.getConnection(OracleDataSource.java: 291) 在 DataSourceSample.main(DataSourceSample.java:24)

DataSourceSample.java

/* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.*/
import java.sql.SQLException;
import java.util.Properties;

import oracle.jdbc.pool.OracleDataSource;
import oracle.jdbc.OracleConnection;
import java.sql.DatabaseMetaData;

public class DataSourceSample {  
  final static String DB_URL= "jdbc:oracle:thin:@****:1525/****";
  final static String DB_USER = "****";
  final static String DB_PASSWORD = "****";

  public static void main(String args[]) throws SQLException {
    Properties info = new Properties();     
    info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, DB_USER);
    info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, DB_PASSWORD);          
    info.put(OracleConnection.CONNECTION_PROPERTY_DEFAULT_ROW_PREFETCH, "20");    

    OracleDataSource ods = new OracleDataSource();
    ods.setURL(DB_URL);    
    ods.setConnectionProperties(info);

    try (OracleConnection connection = (OracleConnection) ods.getConnection()) {
      DatabaseMetaData dbmd = connection.getMetaData();       
      System.out.println("Driver Name: " + dbmd.getDriverName());
      System.out.println("Driver Version: " + dbmd.getDriverVersion());
      System.out.println("Default Row Prefetch Value is: " + 
         connection.getDefaultRowPrefetch());
      System.out.println("Database Username is: " + connection.getUserName());
      System.out.println();
    }   
  }
}

我不是 100% 確定這是罪魁禍首,但這里是關於原生圖像和字符集的一般概念。

默認情況下,本機圖像不包含所有可能的字符集,您可以使用以下選項對其進行配置:

-H:+AddAllCharsets

另一個可能的選項是在 class 中初始化 CharSet onject,該 class 配置為在構建本機映像時進行初始化。 然后字符集 object 將保存在“圖像堆”中,並在運行時可用。

以下是說明此行為的示例應用程序: https://github.com/shelajev/workshop/tree/main/3

當然它可能會有所不同,但我認為這應該可以解決您遇到的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM