source

동일한 DBMS의 "외부" 데이터베이스에 연결

ittop 2023. 8. 30. 22:04
반응형

동일한 DBMS의 "외부" 데이터베이스에 연결

JDBC를 통해 외부 데이터베이스에 대한 명시적인 연결 없이 필요한 권한을 가진 동일한 DBMS의 "외부" 데이터베이스의 테이블에서 투명하게 선택할 수 있다는 사실에 다소 놀랐습니다.이것이 MySQL과 함께 있어야 하는 방식입니까, 아니면 단지 JDBC 괴짜입니까?

세부사항:
DBMS에 stkovrflo_1과 stkovrflo_2라는 두 개의 데이터베이스를 만들었습니다.MySQL World 데이터베이스에서 이러한 데이터베이스에 표를 채웠습니다.

CREATE TABLE stkovrflo_1.Country
SELECT name, region FROM world.Country;

CREATE TABLE stkovrflo_2.City
SELECT world.City.name, world.Country.name AS country
FROM world.City INNER JOIN world.Country ON world.City.CountryCode = world.Country.code;

JDBC에서 나는 항목을 선택할 수 있습니다.stkovrflo_2.City연결을 통한 테이블stkovrflo_1데이터베이스두 데이터베이스 모두에 대한 선택 권한이 있습니다.

제 JDBC 코드는 다음과 같습니다.

import java.sql.*;

public class JDBCExample {
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
    static final String DB_URL = "jdbc:mysql://localhost/stkovrflo_1";

    public static void main(String[] args) throws Exception{
        
        String uid = args[0];
        String pswd = args[1];
        
        if(pswd.toUpperCase().equals("NULL"))
            pswd = null;

        Connection conn = null;
        conn = DriverManager.getConnection(DB_URL,uid,pswd);
        
        processTableSameDB(conn);
        System.out.println("\n\n");
        processTableDifferentDB(conn);
        
        if(conn != null)
            conn.close();
    }

    protected static void processTableSameDB(Connection conn) throws Exception {
        Statement stmt = null;
        String tableName = "Country";

        try{
            Class.forName("com.mysql.jdbc.Driver");

            System.out.println("Retrieving from table in same database...");

            stmt = conn.createStatement();
            String sql;
            sql = "SELECT * FROM " + tableName + " LIMIT 10";
            ResultSet rs = stmt.executeQuery(sql);

            while(rs.next()){
                String name = rs.getString("name");
                String region = rs.getString("region");

                System.out.print("Name: " + name);
                System.out.println(", Region: " + region);
            }
            rs.close();
        }
        catch(SQLException se){
            se.printStackTrace();
        }
        finally{
            if(stmt!=null)
                stmt.close();
        }
    }

    protected static void processTableDifferentDB(Connection conn) throws Exception {
        Statement stmt = null;
        String tableName = "stkovrflo_2.City";

        try{
            Class.forName("com.mysql.jdbc.Driver");

            System.out.println("Retrieving from table in different database...");

            stmt = conn.createStatement();
            String sql;
            sql = "SELECT * FROM " + tableName + " LIMIT 10";
            ResultSet rs = stmt.executeQuery(sql);

            while(rs.next()){
                String name = rs.getString("name");
                String country = rs.getString("Country");

                System.out.print("Name: " + name);
                System.out.println(", Country: " + country);
            }
            rs.close();
        }
        catch(SQLException se){
            se.printStackTrace();
        }
        finally{
            if(stmt!=null)
                stmt.close();
        }
    }
}  

JDBC 출력은 다음과 같습니다.

Retrieving from table in same database...
Name: Aruba, Region: Caribbean
Name: Afghanistan, Region: Southern and Central Asia
Name: Angola, Region: Central Africa
Name: Anguilla, Region: Caribbean
Name: Albania, Region: Southern Europe
Name: Andorra, Region: Southern Europe
Name: Netherlands Antilles, Region: Caribbean
Name: United Arab Emirates, Region: Middle East
Name: Argentina, Region: South America
Name: Armenia, Region: Middle East



Retrieving from table in different database...
Name: Oranjestad, Country: Aruba
Name: Kabul, Country: Afghanistan
Name: Qandahar, Country: Afghanistan
Name: Herat, Country: Afghanistan
Name: Mazar-e-Sharif, Country: Afghanistan
Name: Luanda, Country: Angola
Name: Huambo, Country: Angola
Name: Lobito, Country: Angola
Name: Benguela, Country: Angola
Name: Namibe, Country: Angola

https://dev.mysql.com/doc/refman/8.0/en/identifier-qualifiers.html 읽기

이는 정상적인 현상입니다.데이터베이스가 동일한 MySQL 인스턴스에 있고 데이터베이스에 대한 권한이 있는 한, "기본" 데이터베이스는 중요하지 않습니다.다음 항목을 참조할 수 있습니다.databasename.tablename.

기본 데이터베이스는 셸의 현재 작업 디렉터리(cwd)와 유사합니다.경로를 지정하여 다른 디렉토리에 있는 파일을 항상 참조할 수 있습니다.

언급URL : https://stackoverflow.com/questions/65728063/connecting-to-foreign-database-on-the-same-dbms

반응형