Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@e99h2121

Oracle データベースへの接続とデータベースを識別するものの名前を整理

Oracle データベースへの接続

データベースへの接続おさらい

Oracleデータベースへの接続は以下がある。

  • データベースサーバー内のOSにログインし、操作するローカル接続
  • ネットワークからデータベースに接続し、操作するリモート接続

クライアントは接続先を指定する tnsnames.ora ファイルの情報を読み込み、リスナープロセス へアクセスする。リスナープロセスはサーバープロセスとの接続を取り次ぐ。リスナープロセスも listener.ora という設定ファイルを持っている。

tnsnames.ora ファイルには listener.ora ファイルで指定されたサーバーとポート番号を指定しておく。tnsnames.ora ファイルで接続する情報には別名(ネットワーク識別子)をつける。

tnsnames.ora
net_service_name =       ← ここに書かれている名前がネットサービス名であり、ネットワーク識別子
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = {host_name|IP address} )(PORT = 1521))
   (CONNECT_DATA =
     (SERVICE_NAME = service_name)   ← ここがサービス名
   )
 )

例えば接続を確かめる際には

ping host_name|IP address

は当然として以下 tnsping 等が試せる。

C:\workspaces>tnsping sampledbname

TNS Ping Utility for 64-bit Windows: Version 11.2.0.1.0 - Production on 30-4月 -2021 09:09:17

Copyright (c) 1997, 2010, Oracle.  All rights reserved.

パラメータ・ファイルを使用しました:
C:\app\myname\product\11.2.0\dbhome_1\network\admin\sqlnet.ora

エイリアスを解決するためにTNSNAMESアダプタを使用しました。
(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = sampledbname)))に接続の試行中
OK (40ミリ秒)

アプリケーションからの接続

JDBC

JDBCとは何か。

リレーショナル・データベース(および、ほとんどすべての表形式のデータ)にアクセスするための、標準Java API
Java Database Connectivity

なので例えば以下

package playground;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Conn2Oracle {

    public static void main(String[] args) {
        final String url = "jdbc:oracle:thin:@xx.xx.xx.xx:1521/exampledb";
        final String user = "companycom";
        final String pass = "m8s659cr";
        final String SQL = "select * from example_table";
        try (Connection conn = DriverManager.getConnection(url, user, pass);
            PreparedStatement ps = conn.prepareStatement(SQL)){
            try(ResultSet rs = ps.executeQuery()){
                while (rs.next()) {
                    System.out.println(
                        rs.getString("example_id") + " " +
                        rs.getString("example_name")
                        );
                    }           
                }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println(" * " + url+" "+user+" "+pass+" "+"処理が完了しました");
        }
    }
}

cx_Oracle

あるいはPythonなら cx_Oraclepip install cx_Oracle する。

import cx_Oracle

#サーバ名 / IP
HOST = "xx.xx.xx.xx"
#ポート
PORT = 1521
#SID
SID = "somedb"


tns = cx_Oracle.makedsn(HOST, PORT, SID)
conn = cx_Oracle.connect("user", "pass", tns)

cur = conn.cursor()
cur.execute("""SELECT INSTANCE_NAME,HOST_NAME FROM v$instance""")
while True:
    row = cur.fetchone()
    if row is None:
        break
    print(row)

データベースを識別するものの名前

話をJDBCに戻すが、JDBC URLはこのように構成される。

jdbc:oracle:driver_type:[username/password]@database_specifier
username@[//]host[:port][/service_name][:server][/instance_name]

jdbc:oracle:thin:@xx.xx.xx.xx:1521/サービス名
jdbc:oracle:thin:@xx.xx.xx.xx:1521:インスタンス識別子

等など。

SID はインスタンス識別子、service_name はサービス名。

インスタンス識別子、システム識別子、SID(System IDentifer)
これらは SID ≒*1 環境変数 ORACLE_SID と呼ばれているもの
ホストサーバー内で有効で、ホストの共有メモリにアクセスするための識別子
(ホスト外になると SID ではアクセスできない ⇒ INSTANCE_NAME

で、これらは例えば以下で取得できる。

SELECT dbid FROM v$database;
show parameter db_name
show parameter db_unique_name
show parameter instance_name
SELECT * FROM GLOBAL_NAME;

名前の整理 がわかりやすい。

  • システム識別子(SID)
    • 通常はインスタンス名と同じだが別にすることも可能。ローカル接続で利用。サーバ内でユニーク。
  • ORACLE_SID
    • ローカルDB接続時のSIDを設定しておく環境変更。(但し「. oraenv」コマンドではデータベース名を入力するため、接続時はインスタンス名に変更する必要がある。また、PDB名は設定不可)
  • サービス名(SERVICE_NAMES)
    • リスナ経由接続先を指定する名前。デフォルト(通常変更しない)はDB_UNIQUE_NAME.DB_DOMAIN。PDBはPDB名.DB_DOMAIN。(複数登録可能で、例えば、RACでサービス名により稼働インスタンスを制限可能)

参考

以上、基礎知識整理でした。参考になればさいわいです。

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
e99h2121
2003年新卒入社した「リーディングカンパニーが選んでいる統合人事システム」の会社で開発をしています。内弁慶です。保守の愚痴と上海赴任時代の淡い思い出回顧が多いです。2016aug生まれ娘、2018oct生まれ息子に精神を鍛えられすごしています。よろしくおねがいします。
works-hi
「はたらく」を楽しく!に向けて大手企業の人事業務から変えていく HR業界のリーディングカンパニー

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?