Java는 Oracle 데이터베이스에 JDBC Thin Driver를 연결하는 세 가지 방법을 개발합니다.

Oracle의 jdbc 드라이브 세 가지 주요 범주:
1. JDBC OCI:oci는 oracle call interface의 줄임말로 이 드라이브는 전통적인 ODBC 드라이브와 유사하다.Oracle Call Interface and Net8이 필요하기 때문에 이 드라이브를 사용하는 JAVA 프로그램을 실행하는 기계에 클라이언트 소프트웨어를 설치해야 합니다. 사실은orcale 클라이언트에서 dll 방식으로 제공하는oci와 서버 설정에 사용됩니다.
2. JDBC Thin:thin은 for thin client라는 뜻으로 이런 드라이브는 일반적으로 WEB 브라우저에서 실행되는 JAVA 프로그램에 사용된다.OCI or Net8이 아니라 Java sockets를 통해 통신하는 순수한 자바로 이루어진 구동이기 때문에 JDBC Thin을 사용하는 클라이언트 기기에orcale 클라이언트 소프트웨어를 설치할 필요가 없기 때문에 이식성이 뛰어나 웹 개발에 사용된다.
3. JDBC KPRB: 이러한 드라이브는 데이터베이스에 직접 저장된 JAVA 프로그램에서 사용된다. 예를 들어 Java Stored Procedures, triggers, Database JSP's 등이다.서버 내부에서 사용하기 때문에 그는 기본 또는 현재 세션을 사용하여 방문 데이터베이스에 연결합니다. 사용자 이름 비밀번호 등이 필요하지 않고 데이터베이스 URL도 필요하지 않습니다.
하나.JDBC 연결 Oracle 설명
JDBC의 애플리케이션 연결 Oracle에 다음과 같은 오류가 발생했습니다.
ORA-12505,TNS:listener does not currently know of SID given in connect descriptor TheConnection descriptor used by the client was.
저는 DB 차원에서 정적 등록을 구성했고 GLOBAL_DBNAME 및 SID_NAME는 다르고 이전의 설정은 모두 같기 때문에 이 문제를 발견하지 못했다.

 (SID_DESC =
  (GLOBAL_DBNAME = dave)
   (ORACLE_HOME =D:\app\Administrator\product\11.2.0\dbhome_1)
  (SID_NAME = NEWCCS)
 )
Oracle Listener 동적 등록 및 정적 등록
https://www.jb51.net/article/75885.htm
인터넷에서 구글을 살펴보니 JDBC Thin Driver의 formats는 세 가지 형식이 있습니다.
형식 1: Oracle JDBC Thin using a ServiceName:
jdbc:oracle:thin:@//:/
Example: jdbc:oracle:thin:@//192.168.2.1:1521/XE
@ 뒤에//이 있는 형식은 SID 사용과 크게 다릅니다.
이 형식은 Oracle에서 권장하는 형식입니다. 클러스터의 경우 각 노드의 SID는 다르지만 SERVICE_NAME는 모든 노드를 포함할 수 있습니다.
형식 2: Oracle JDBC Thin using an SID:
jdbc:oracle:thin:@::
Example: jdbc:oracle:thin:192.168.2.1:1521:X01A
Note: Support for SID is being phased out. Oracle recommends that users switch over to usingservice names.
형식 3: Oracle JDBC Thin using a TNSName:
jdbc:oracle:thin:@
Example: jdbc:oracle:thin:@GL
Note:
Support for TNSNames was added in the driver release 10.2.0.1
2.테스트
2.1 준비:
Oracle은 11gR2입니다.

Listener.ora
SID_LIST_LISTENER =
 (SID_LIST =
 (SID_DESC =
  (GLOBAL_DBNAME = dave)
   (ORACLE_HOME =D:\app\Administrator\product\11.2.0\dbhome_1)
  (SID_NAME = NEWCCS)
 )
 )
Tnsnames.ora
DVD =
 (DESCRIPTION =
 (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
 )
 (CONNECT_DATA =
  (SERVICE_NAME = dave)
 )
 )
2.2 테스트 1, SID: newccs 사용

.imporjava.sql.* 
 .publiclasjdb 
 StrindbUr"jdbc:oracle:thin:@...::newccs" 
 StrintheUse"dave" 
 StrintheP"dave" 
 Connectionull 
 Statemenconn 
 ResultSernull 
 publijdbc( 
 tr 
 Class.forName("oracle.jdbc.driver.OracleDriver").newInstance() 
 DriverManager.getConnection(dbUrltheUserthePw) 
 conc.createStatement() 
 catc(Exceptioe 
 e.printStackTrace() 
 publibooleaexecuteUpdate(Strinsql 
 tr 
 conn.executeUpdate(sql) 
 returtrue 
 catc(SQLExceptioe 
 e.printStackTrace() 
 returfalse 
 publiResultSeexecuteQuery(Strinsql 
 rnull 
 tr 
 rconn.executeQuery(sql) 
 catc(SQLExceptioe 
 e.printStackTrace() 
 returrs 
 publivoiclose( 
 tr 
 conn.close() 
 c.close() 
 catc(Exceptioe 
 e.printStackTrace() 
 publistativoimain(String[args 
 ResultSers 
 jdbconnejdbc() 
 rconn.executeQuery("selecfrodavwherrownum<") 
 tr 
 whil(rs.next() 
 System.out.println(rs.getString("username")+"--"+rs.getString("user_id")) 
 catc(Exceptioe 
 e.printStackTrace() 
 . 
 .---  
 .MGMT_VIEW-- 
 .ANQING-- 
 .DVD-- 
 .SYSMAN-- 
2.3 서비스 사용_name:dave
2.2 절의dbUrl을 다음과 같이 변경합니다.

String dbUrl = "jdbc:oracle:thin:@//127.0.0.1:1521/dave";
출력 결과:
MGMT_VIEW--97
 
ANQING--94
 
DVD--93
 
SYSMAN--95
11g에서 다음과 같은 오류가 발생하면
테스트 실행 Java 클래스, 오류 보고:
java.sql.SQLException: The Network Adapter could not establish the connection
대응하는 jdbc connection driver를 교체할 수 있습니다. 홈페이지의 설명은 다음과 같습니다.
JDBC Thin Driver 11g Causes"Java.Sql.Sqlexception: Io Exception: The Network Adapter Could NotEstablish The Connection"While Connecting to Oracle Database 11g [ID947653.1]
Change the JDBC connection driver class inyour application server from:
oracle.jdbc.driver.OracleDriver
to
oracle.jdbc.OracleDriver
2.4 TNS name:dvd 사용
String dbUrl = "jdbc:oracle:thin:@dvd";
오류는 다음과 같습니다.
java.sql.SQLException: Unknown host specified
문제는 JVM에 oracle이 없기 때문입니다.net.tns_admin의 시스템property.
해결 방법은 다음과 같습니다.
메서드 1: VM을 시작할 때 다음 매개변수를 추가합니다.
-Doracle.net.tns_admin=D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN
방법 2: 자바 코드에 추가:

System.setProperty("oracle.net.tns_admin","D:\\app\\Administrator\\product\\11.2.0\\dbhome_1\\NETWORK\\ADMIN");
추가되면 JDBC에서 tnsnama를 정상적으로 사용할 수 있습니다.

.imporjava.sql.
 .publiclasjd
StrindbUr"jdbc:oracle:thin:@dvd
 .StrindbUr"jdbc:oracle:thin:@//...:/dave
 .StrindbUr"jdbc:oracle:thin:@...::newccs
StrintheUse"dave
StrintheP"dave
Connectionul
Statemencon
ResultSernul
publijdbc
 t
 System.setProperty("oracle.net.tns_admin","D:\\app\\Administrator\\product\\..\\dbhome_\\NETWORK\\ADMIN"
 Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(
 ./Class.forName("oracle.jdbc.OracleDriver").newInstance(
 DriverManager.getConnection(dbUrltheUserthePw
 conc.createStatement(
 catc(Exceptio
 e.printStackTrace(
publibooleaexecuteUpdate(Strinsq
 t
 conn.executeUpdate(sql
 returtru
 catc(SQLExceptio
 e.printStackTrace(
 returfals
publiResultSeexecuteQuery(Strinsq
 rnul
 t
 rconn.executeQuery(sql
 catc(SQLExceptio
 e.printStackTrace(
 returr
publivoiclose
 t
 conn.close(
 c.close(
 catc(Exceptio
 e.printStackTrace(
publistativoimain(String[arg
 ResultSer
 jdbconnejdbc(
 rconn.executeQuery("selecfrodavwherrownum<"
 t
 whil(rs.next(
System.out.println(rs.getString("username")+"--"+rs.getString("user_id")
 catc(Exceptio
 e.printStackTrace(
다음은 자바에서 jdbc(thin 방식)를 통해 Oracle 데이터베이스를 연결하는 코드를 공유합니다.

package com.jdbc.OracleTest;
 import java.sql.DriverManager;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 public class OracleJdbcConnectionTest {
 /**
 * by jarin  
 * @param args
 */
 public static void main(String[] args) {
 try {
 // Jar : oracle , :\oracle\ora\jdbc\lib\ojdbc.jar
 // 
 Class.forName("oracle.jdbc.driver.OracleDriver");
 // ( :jdbc, : oracle:thin  :@localhost::oracleDB)
 String url ="jdbc:oracle:thin:@localhost::ora";
 try {
  // 
  Connection conn = DriverManager.getConnection(url,"scott","");
  // Statement PreparedStatement 
  Statement st = conn.createStatement();
  String sqlStr= "select ename from emp";
  // 
  ResultSet rs = st.executeQuery(sqlStr);
  // 
  while (rs.next()) {
  System.out.println(rs.getString());
  }
 } catch (SQLException e) {
  e.printStackTrace();
 }
 } catch (ClassNotFoundException e) {
 e.printStackTrace();
 }
 }
 }

좋은 웹페이지 즐겨찾기