简体   繁体   English

GraalVM 原生镜像和 Oracle ojdbc11-21.1

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

I am currentliy experimenting with the native-image tool from GraalVM and the Oracle-driver.我目前正在尝试使用 GraalVM 的本机映像工具和 Oracle 驱动程序。 The source code compiles and generates an exe File without errors.源代码编译生成exe文件,没有错误。 But when I start the program it gets a java.lang.RuntimeException: Missing character set id 170 not loaded at image build time.但是当我启动程序时,它会得到一个 java.lang.RuntimeException: Missing character set id 170 not loaded at image build time。

I am connecting to a database with characterset NLS_CHARACTERSET = EE8MSWIN1250.我正在使用字符集 NLS_CHARACTERSET = EE8MSWIN1250 连接到数据库。 When I use a database with NLS_CHARACTERSET = AL32UTF8 the connection works fine.当我使用带有 NLS_CHARACTERSET = AL32UTF8 的数据库时,连接工作正常。

I am using GraalVM CE 21.0.0.2 (build 11.0.10+8-jvmci-21.0-b06 and ojdbc11-21.1.0.0.jar on a Windows 10 64bit Computer.我在 Windows 10 6 计算机上使用 GraalVM CE 21.0.0.2(构建 11.0.10+8-jvmci-21.0-b06 和 ojdbc11-21.1.0.0.jar)

Below ist the error message and the source code.下面是错误消息和源代码。 I used the sample code from https://github.com/oracle/oracle-db-examples/blob/master/java/jdbc/ConnectionSamples/DataSourceSample.java我使用了来自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) at oracle.jdbc.driver.T4CCon 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 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) at DataSourceSample.main(DataSourceSample.java:24) 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 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();
    }   
  }
}

I'm not 100% sure that it's the culprit, but here's the general idea about native image and charsets.我不是 100% 确定这是罪魁祸首,但这里是关于原生图像和字符集的一般概念。

Native image doesn't include all possible charsets by default, you can configure it to do so by using the following option:默认情况下,本机图像不包含所有可能的字符集,您可以使用以下选项对其进行配置:

-H:+AddAllCharsets

Another possible option is to initialize the CharSet onject in a class that is configured to be initialized at build time of the native image.另一个可能的选项是在 class 中初始化 CharSet onject,该 class 配置为在构建本机映像时进行初始化。 Then the charset object will be saved in the "image heap" and will be available at runtime.然后字符集 object 将保存在“图像堆”中,并在运行时可用。

Here's a sample application that illustrates this behavior: https://github.com/shelajev/workshop/tree/main/3以下是说明此行为的示例应用程序: https://github.com/shelajev/workshop/tree/main/3

Of course it might be something different, but I think this should solve the problem you're experiencing.当然它可能会有所不同,但我认为这应该可以解决您遇到的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM