동일한 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
'source' 카테고리의 다른 글
도커 구성:데이터베이스가 초기화되지 않았습니다. (0) | 2023.08.30 |
---|---|
mysql 조인 쿼리에서 동적 열 이름 사용 (0) | 2023.08.30 |
다크 그레이가 그레이보다 가벼운 이유는 무엇입니까? (0) | 2023.08.30 |
Git이 없는 파일에 Git SHA1을 할당하는 방법은 무엇입니까? (0) | 2023.08.26 |
MySQL varchart 설정이 너무 깁니다. (0) | 2023.08.26 |