10.9 Java JDBC-如何使用服务名称而不是SID连接到Oracle(二合一)| Java Debug 笔记

176 阅读1分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:Java JDBC-如何使用服务名称而不是SID连接到Oracle?

我有一个使用JDBC(通过JPA)的Java应用程序,它使用主机名,端口和Oracle SID连接到开发数据库,如下所示:

jdbc:oracle:thin:@ oracle.hostserver1.mydomain.ca:1521:XYZ

XYZ是Oracle SID。现在,我需要连接到另一个不使用SID而是使用Oracle“服务名”的Oracle数据库。

我尝试了这个,但是不起作用:

jdbc:oracle:thin:@ oracle.hostserver2.mydomain.ca:1522:ABCD

ABCD是新数据库的名字

回答1:

服务名称仅受JDBC Thin驱动程序支持。 语法为:

@//host_name:port_number/service_name

所以我会尝试

jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD

提问:如何在Java中将字符串与UTF8字节数组之间来回转换?

在Java中,我有一个String,我想将其编码为字节数组(采用UTF8或其他某种编码)。或者,我有一个字节数组(采用某种已知的编码),我想将其转换为Java String。我如何进行这些转换?

回答1:

从String转换为byte[]:

String s = "some text here";
byte[] b = s.getBytes(StandardCharsets.UTF_8);

从byte[]转换为String:

byte[] b = {(byte) 99, (byte)97, (byte)116};
String s = new String(b, StandardCharsets.US_ASCII);

回答2:

这是一种避免每次转换都执行Charset查找的解决方案:

评论区:这点请引用下消息来源,是否因为java.nio.charset.Charset不是基于String.getBytes构建的,因此比String.getBytes具有更多的开销吗?

import java.nio.charset.Charset;

private final Charset UTF8_CHARSET = Charset.forName("UTF-8");

String decodeUTF8(byte[] bytes) {
    return new String(bytes, UTF8_CHARSET);
}

byte[] encodeUTF8(String string) {
    return string.getBytes(UTF8_CHARSET);
}