【问题标题】:GraalVM native-image and Oracle ojdbc11-21.1GraalVM 原生镜像和 Oracle ojdbc11-21.1
【发布时间】:2021-03-02 07:50:50
【问题描述】:

我目前正在尝试使用 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 64 位计算机上使用 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的示例代码

线程“main”java.lang.RuntimeException 中的异常:在 oracle.jdbc.driver.DBConversion 的 oracle.sql.CharacterSet.make(CharacterSet.java:121) 的图像构建时未加载缺少的字符集 id 170。 init(DBConversion.java:184) 在 oracle.jdbc.driver.DBConversion.(DBConversion.java:137) 在 oracle.jdbc.driver.T4CConnection.doCharSetNegotiation(T4CConnection.java:2607) 在 oracle.jdbc.driver.T4CConnection。在 oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:1069) 在 oracle.jdbc.driver.T4CDriverExte 在 oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:644) 连接(T4CConnection.java:2176) nsion.getConnection(T4CDriverExtension.java:90) 在 oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:681) 在 oracle.jdbc.datasource.impl.OracleDataSource.getPhysicalConnection(OracleDataSource.java:569) 在 oracle.jdbc .datasource.impl.OracleDataSource.getConnection(OracleDataSource.java:355) 在 oracle.jdbc.datasource.impl.OracleDataSource.getConnectionInternal(OracleDataSource.java:2014) 在 oracle.jdbc.datasource.impl.OracleDataSource.getConnection(OracleDataSource.java :330) 在 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();
    }   
  }
}

【问题讨论】:

    标签: java oracle jdbc graalvm-native-image


    【解决方案1】:

    我不能 100% 确定这是罪魁祸首,但这里是关于原生图像和字符集的一般概念。

    默认情况下,本机图像不包含所有可能的字符集,您可以使用以下选项对其进行配置:

    -H:+AddAllCharsets
    

    另一个可能的选项是在配置为在构建本机映像时初始化的类中初始化 CharSet onject。然后字符集对象将保存在“图像堆”中,并在运行时可用。

    这里有一个示例应用程序来说明这种行为:https://github.com/shelajev/workshop/tree/main/3

    当然可能会有所不同,但我认为这应该可以解决您遇到的问题。

    【讨论】:

    • 现在可以使用了。我添加了一个引用 oracle.sql.CharacterSet 的类 (CharacterSetBuild) (private static final CharacterSet EE8MSWIN1250 = CharacterSet.make(CharacterSet.EE8MSWIN1250_CHARSET);) 并使用以下标志创建了本机映像:--initialize-at-build -time=CharacterSetBuild。谢谢!
    • 我很高兴它有帮助。一般来说,在构建时初始化类比在运行时更容易出错,例如,由于对象无法像上面示例中的线程一样持久保存在图像堆中的问题。但是对于这样一个简单的案例,我个人觉得还可以
    猜你喜欢
    • 2020-09-09
    • 2020-10-25
    • 2021-05-10
    • 2021-09-09
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    相关资源
    最近更新 更多