Java의 여러 데이터 소스(오라클, Excel, SQL 서버)에 액세스하기 위한 단일 SQL 쿼리
여러 수 있는 (「 」 데 소 데 서 합 개 야 니 해 발 다 을 션 이 케 여 리 애 러Oracle, Excel, Microsoft Sql Server
하나를 함 ① ② ③ ③ ④ ③ ④ ③ ④ ④ ④ ③ ④ ④ ③ SQL query
예:
SELECT o.employeeId, count(o.orderId)
FROM employees@excel e. customers@microsoftsql c, orders@oracle o
WHERE o.employeeId = e.employeeId and o.customerId = c.customerId
GROUP BY o.employeeId;
이 SQL 및 데이터 소스는 Java 프로그램에 의해 동적으로 변경되어야 합니다.고객은 애플리케이션의 웹 인터페이스에서 서로 다른 데이터베이스 및 스토리지에서 동시에 쓰기 및 실행을 원합니다.다른 요구사항은 성능과 경량입니다.
저는 다음과 같은 방법을 찾았습니다(그리고 제가 본 단점은 무엇입니까, 제가 틀렸다면 고쳐주세요).
Apache Spark(Drawback: 대량의 솔루션, 빅데이터에 더 적합, Spark에 캐시하지 않고 최신 정보를 얻을 필요가 있는 경우 속도가 느림)
SQL Server의 분산 쿼리(Oracle의 Database link, Microsoft SQL Server의 Linked server, Excel의 Power Query) - 단점: Java 프로그램에 의한 동적 데이터 소스 변경 문제, Excel 작업 문제,
Prestodb(디롭백: 대용량 솔루션, 빅데이터에 더 적합),
Apache Drill(드로백: 꽤 젊은 솔루션, 최신 odbc 드라이버가 아닌 일부 문제 및 작업 중 버그),
Apache Calcite(Apache Drill에서 사용하는 가벼운 프레임워크, 단점: 아직은 꽤 어린 솔루션),
데이터 소스에서 수동으로 조인(드로백: 올바른 조인을 개발하기 위한 많은 작업, 결과 집합에서 "그룹화 기준", 최상의 실행 계획 찾기 등)
혹시 다른 방법(무료 오픈 소스 솔루션 사용)을 알고 있거나 위의 방법에 대한 조언을 해주실 수 있습니까?어떤 도움이라도 주시면 대단히 감사하겠습니다.
UnityJDBC는 여러 데이터 소스를 래핑하여 모두 동일한 데이터베이스의 일부인 것처럼 처리할 수 있는 상용 JDBC 드라이버입니다.다음과 같이 작동합니다.
각 데이터베이스를 설명하는 "스키마 파일"을 정의합니다.스키마 파일은 다음과 같습니다.
...
<TABLE>
<semanticTableName>Database1.MY_TABLE</semanticTableName>
<tableName>MY_TABLE</tableName>
<numTuples>2000</numTuples>
<FIELD>
<semanticFieldName>MY_TABLE.MY_ID</semanticFieldName>
<fieldName>MY_ID</fieldName>
<dataType>3</dataType>
<dataTypeName>DECIMAL</dataTypeName>
...
또한 모든 스키마 파일을 참조하고 연결 정보를 제공하는 중앙 "소스 파일"이 있으며 다음과 같습니다.
<SOURCES>
<DATABASE>
<URL>jdbc:oracle:thin:@localhost:1521:xe</URL>
<USER>scott</USER>
<PASSWORD>tiger</PASSWORD>
<DRIVER>oracle.jdbc.driver.OracleDriver</DRIVER>
<SCHEMA>MyOracleSchema.xml</SCHEMA>
</DATABASE>
<DATABASE>
<URL>jdbc:sqlserver://localhost:1433</URL>
<USER>sa</USER>
<PASSWORD>Password123</PASSWORD>
<DRIVER>com.microsoft.sqlserver.jdbc.SQLServerDriver</DRIVER>
<SCHEMA>MySQLServerSchema.xml</SCHEMA>
</DATABASE>
</SOURCES>
그러면 다음을 사용할 수 있습니다.unity.jdbc.UnityDriver
Java 코드가 데이터베이스 간에 조인하는 SQL을 실행할 수 있도록 다음과 같이 설정합니다.
String sql = "SELECT *\n" +
"FROM MyOracleDB.Whatever, MySQLServerDB.Something\n" +
"WHERE MyOracleDB.Whatever.whatever_id = MySQLServerDB.Something.whatever_id";
stmt.execute(sql);
따라서 UnityJDBC는 사용자에게 필요한 기능을 제공하는 것처럼 보이지만, 사용자가 서로 다른 데이터베이스 간에 테이블을 결합하는 임의의 SQL을 실행할 수 있는 솔루션은 데이터베이스를 굴복시킬 수 있는 방법처럼 들립니다.귀사의 요구사항 유형에 따라 ETL 프로세스를 모든 데이터 소스에서 단일 데이터 웨어하우스로 수행하여 사용자가 이를 쿼리할 수 있도록 하는 것이 좋습니다. 이러한 프로세스와 데이터 웨어하우스를 정의하는 방법은 스택 오버플로 문제에 대해 너무 광범위합니다.
적절한 솔루션 중 하나는 JDO, JPA 및 REST API를 포함하는 DataNucleus 플랫폼입니다.거의 모든 RDBMS(Postgre)를 지원합니다.SQL, MySQL, SQLServer, Oracle, DB2 등) 및 NoSQL 데이터스토어(맵 기반, 그래프 기반, 문서 기반 등), 데이터베이스 웹 서비스, LDAP, 문서(XLS, ODF, XML 등).
또는 RDBMS, NoSQL, 데이터베이스 웹 서비스 및 XML을 지원하는 EclipseLink를 사용할 수 있습니다.
JDO API의 일부인 JDOQL을 사용하면 여러 데이터스토어에 액세스하기 위해 하나의 쿼리를 사용해야 하는 요구 사항을 충족할 수 있습니다.두 솔루션 모두 오픈 소스이며, 상대적으로 가볍고 성능이 우수합니다.
왜 제가 이 해결책을 제안했나요?
- 귀사의 요구사항에 따르면 데이터스토어는 귀사의 고객 선택사항이며 빅데이터 솔루션을 찾고 있지 않습니다.
- 당신은 가볍고 성능이 좋은 오픈 소스 솔루션을 선호합니다.
- 사용 사례를 고려할 때 고객의 사용 사례를 기반으로 여러 데이터스토어를 활용할 수 있는 폴리글롯 지속성 동작을 갖춘 데이터 관리 플랫폼이 필요할 수 있습니다.
폴리글롯 지속성에 대한 자세한 내용을 보려면 다음과 같이 하십시오.
SQL은 데이터베이스 관리 시스템과 관련이 있습니다.SQL Server에는 Oracle SQL Server가 아닌 다른 SQL 문이 필요합니다.
제 제안은 JPA를 사용하는 것입니다.데이터베이스 관리 시스템으로부터 완전히 독립적이며 Java에서 개발을 훨씬 더 효율적으로 수행합니다.
단점은 SQL Server와 Oracle SQL Server 간의 1:1 관계처럼 여러 데이터베이스 시스템을 즉시 JPA와 결합할 수 없다는 것입니다.그러나 여러 개를 생성할 수 있습니다.EntityManagerFactories
(각 데이터베이스에 대해 하나씩) 코드로 연결합니다.
이 시나리오에서 JPA에 대한 장점:
- 쓰기 데이터베이스 관리 시스템 독립 JPQL 쿼리
- 필요한 Java 코드 감소
JPA에 대한 단점:
- 서로 다른 데이터베이스의 엔티티를 연결할 수 없습니다(예: 1:1 관계).
- 하나의 쿼리로 여러 데이터베이스를 쿼리할 수 없습니다(다른 데이터베이스에서 테이블을 쿼리할 수 있음).
group by
또는 유사)
추가 정보:
추천합니다.presto
그리고.calcite
성능과 경량성이 항상 함께 제공되는 것은 아닙니다.
presto
"빅 데이터"라고 말한 것처럼 검증된 사용법이 상당히 많습니다.확장성이 우수합니다.경량화가 구체적으로 무엇을 의미하는지는 잘 모르겠습니다. 필요에 따라 기계를 덜 필요로 하는 경우 확장을 줄일 수 있습니다.calcite
많은 데이터 분석 라이브러리에 내장되어 있습니다.drill
kylin
phoenix
필요한 작업을 "여러 DB에 연결"하고 가장 중요한 것은 "가벼운 중량"입니다.
몇몇 후보자들(아파치 스파크, 프레스토드브, 아파치 드릴)에 대한 경험이 있어서 저는 프레스토드브를 선택하게 되었습니다.대부분 빅데이터에 사용되지만 설정이 쉽고 요청하는 모든 것을 (거의) 지원합니다.온라인(도커에서 실행하는 것 포함)에서 이용할 수 있는 리소스가 풍부하고 문서화가 우수하며 커뮤니티가 활성화되어 있으며, 두 회사(페이스북 & 넷플릭스)의 지원도 받고 있습니다.
서로 다른 공급업체의 여러 서버에 있는 여러 데이터베이스 데이터베이스 가장 어려운 경우는 데이터베이스가 서로 다른 서버에 있고 일부 서버에서 서로 다른 데이터베이스 소프트웨어를 실행하는 경우입니다.예를 들어 고객 데이터베이스는 Oracle의 시스템 X에서 호스팅되고 주문 데이터베이스는 Microsoft SQL Server가 있는 시스템 Y에서 호스팅될 수 있습니다.두 데이터베이스가 모두 시스템 X에서 호스팅되지만 하나는 Oracle에 있고 다른 하나는 Microsoft SQL Server에 있는 경우에도 문제는 동일합니다. 어떻게든 이러한 데이터베이스의 정보는 서로 다른 플랫폼에서 공유되어야 합니다.많은 상용 데이터베이스는 연합, 통합 구성요소 또는 테이블 링크(예: IBM, Oracle, Microsoft)를 사용하여 이 기능을 지원하지만 오픈 소스 데이터베이스(HSQL, MySQL, Postgre)에서는 지원합니다.SQL)이 제한되어 있습니다.
이 문제를 해결하기 위한 다양한 기법이 있습니다.
Table Linking and Federation
를 위해 을 한 에서 다른 합니다.Custom Code
쿼리를 합니다.Data Warehousing/ETL
하여 다른 합니다.Mediation Software
필요한 합니다.
임금 인상일 수도 있습니다.Apache solor를 사용해 보십시오.서로 다른 데이터 소스를 사용하여 Apache solor로 데이터를 가져옵니다.데이터를 사용할 수 있게 되면 인덱싱을 통해 다른 쿼리를 작성할 수 있습니다.
그것은 당신의 검색 속도를 더 빠르게 하는 오픈 소스 검색 플랫폼입니다.
이것이 Hibernate 프레임워크가 목적인 이유입니다. Hibernate는 SQL과 거의 동일한 자체 쿼리 언어 HQL을 가지고 있습니다.최대 절전 모드는 HQL 쿼리를 데이터베이스별 쿼리로 변환하는 미들웨어 역할을 합니다.
언급URL : https://stackoverflow.com/questions/34898269/one-sql-query-to-access-multiple-data-sources-in-java-from-oracle-excel-sql-s
'bestsource' 카테고리의 다른 글
WordPress - 태그 및 카테고리별로 필터링된 게시물 목록 생성 (0) | 2023.07.03 |
---|---|
Mongodb에서 필드 값 곱셈 (0) | 2023.07.03 |
엔티티에 기본 키가 없는 보기 사용 (0) | 2023.07.03 |
Oracle jdbc에서 문 준비 및 타임스탬프 설정 (0) | 2023.07.03 |
문자열 벡터에서 숫자 추출 (0) | 2023.06.28 |