当前位置: 首页 > 知识库问答 >
问题:

GraalVM native image和Oracle ojdbc11-21.1

左丘嘉木
2023-03-14

我目前正在尝试使用GraalVM的本机映像工具和Oracle驱动程序。源代码编译并生成一个没有错误的exe文件。但是当我启动程序时,它会得到一个java.lang.运行时异常:缺少字符集id 170,在映像构建时没有加载。

我正在连接到characterset NLS\U characterset=EE8MSWIN1250的数据库。当我使用NLS\u 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的映像构建时未加载缺少的字符集id 170。sql。字符集。oracle的make(CharacterSet.java:121)。jdbc。驾驶员数据库转换。oracle的init(DBConversion.java:184)。jdbc。驾驶员数据库转换。(DBConversion.java:137)在oracle。jdbc。驾驶员T4C连接。oracle的doCharSetNegotiation(T4CConnection.java:2607)。jdbc。驾驶员T4C连接。在oracle连接(T4CConnection.java:2176)。jdbc。驾驶员T4C连接。在oracle登录(T4CConnection.java:644)。jdbc。驾驶员物理连接。在oracle上连接(PhysicalConnection.java:1069)。jdbc。驾驶员T4C驾驶员扩展。oracle的getConnection(T4CDriverExtension.java:90)。jdbc。驾驶员OracleDriver。在oracle连接(OracleDriver.java:681)。jdbc。数据源。impl。OracleDataSource。oracle的getPhysicalConnection(OracleDataSource.java:569)。jdbc。数据源。impl。OracleDataSource。oracle的getConnection(OracleDataSource.java:355)。jdbc。数据源。impl。OracleDataSource。getConnectionInternal(OracleDataSource.java:2014)在oracle。jdbc。数据源。impl。OracleDataSource。oracle的getConnection(OracleDataSource.java:330)。jdbc。数据源。impl。OracleDataSource。DataSourceSample上的getConnection(OracleDataSource.java:291)。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();
    }   
  }
}

共有1个答案

常翰
2023-03-14

我不能100%确定它是罪魁祸首,但这是关于本地图像和字符集的一般想法。

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

-H:+AddAllCharsets

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

下面是一个示例应用程序,演示了这种行为:https://github.com/shelajev/workshop/tree/main/3

当然,这可能会有所不同,但我认为这应该解决你正在经历的问题。

 类似资料:
  • 问题内容: 关于它们有很多传说。我想知道真相。以下两个示例之间有什么区别? 问题答案: 不确定从何处获得传说,但: 提交按钮 与: IE6将在标记之间提交此按钮的所有文本,其他浏览器将仅提交值。使用可使您在按钮的设计上享有更大的布局自由度。从各种意图和目的看,它乍一看似乎很棒,但是各种浏览器怪癖使它有时很难使用。 在您的示例中,IE6将发送到服务器,而其他大多数浏览器将不发送任何内容。要使其跨浏览

  • 什么区别以及如何正确重写代码?

  • 我试图理解为什么下面两个代码块会产生不同的结果。 代码块1按预期工作,并返回从数据库中查找的提供程序的数组。另一方面,代码块2返回函数数组。在理解promissione.all()和async/await时,我觉得缺少了一些简单的东西。 代码块的差异如下: > 块1:创建许诺函数数组,然后使用map运算符将其包装在异步函数中。 块2:许诺函数的数组被创建为异步函数。因此,不调用map运算符。 如果

  • 问题内容: 我才刚刚开始研究SQL。 我有一个SQL Server 2008r2数据库,它将返回两个字段DocDate和InvValue。我需要将InvValues汇总为今天的MTD和YTD,所以看起来像 我已经做了大量的Google搜寻,并且可以使用SUM&DATEPART进行一项或多项,但是我坚持尝试两者兼而有之。 有人可以给我一些伪代码,以帮助我进一步谷歌。 谢谢@戈登·利诺夫(Gordon

  • 这个示例代码来自一本Java书籍,从墙上的99瓶啤酒到没有啤酒打印出这首歌。问题是,当墙上是1瓶啤酒时,它仍然写着瓶子。我试图通过在末尾添加部分来解决这个问题。但是,它仍然显示1瓶啤酒在墙上,我瓶啤酒在墙上。 我不知道该改变什么来解决这个问题。是否创建另一个while部分? 如果你能给他们一个提示,这样我就可以自己解决它,那也很酷!因为我知道我的实际歌曲输出是在第一个if部分,但我不知道我应该在哪

  • 原文地址:https://cesiumjs.org/tutorials/cesium-and-webpack/ Cesium 和 Webpack Webpack是非常强大非常流行的JavaScript 模块打包工具。它可以让开发人员以一种简单直观的 require 方式去加载各种页面需要的文件,极大的方便了开源人员对代码和资源文件进行结构化设计。当编译的时候,它会跟踪代码依赖性,把所有的模型打包到

  • 问题内容: 我一直在学习redis和node.js。我有两个问题,找不到令人满意的答案。 我的第一个问题是关于在node.js中重用Redis客户端。我找到了这个问题和答案:如何在socket.io中重用Redis连接,但还不足以让我满意。 现在,如果我在连接事件中创建redis客户端,它将为每个连接生成。因此,如果我有2万个并发用户,那么将有2万个Redis客户端。 如果我将其放在连接事件之外,

  • 我需要控制日志框架的最大磁盘空间量。 例如,在log4j中,如果有如下所示的追加器,我可以很容易地估计需要多少磁盘空间: 对于maxFileSize和maxBackupIndex,我知道最多需要10x100KB。 我注意到DailyRollingFileAppender,但它不支持maxFileSize。 除了RollingFileAppender之外,是否还有其他fileappender可以实现