Tầng truyền thông CSDL bao gồm các đặc điểm để tƣơng tác với các CSDL, cho phép truyền thông giữa hệ thống và các CSDL cụ thể. Do đó cần phát triển một giao diện giao tiếp bằng việc sử dụng hệ thống quản lý CSDL và các trình điều khiển connector của từng loại CSDL. Giao diện đó bao gồm các chức năng để kết nối và lấy đƣợc dữ liệu từ các CSDL khác nhau.
Hình 18: Các lớp truyền thông CSDL
Để kết nối đến một CSDL cần phải xây dựng một lớp kết nối qua việc sử dụng các trình điều khiển connector cho từng loại CSDL. Lớp DatabaseRefClass sẽ chứa đựng yêu cầu dữ liệu để thiết lập một kết nối. Mỗi lần tạo mới một kết nối đƣợc thiết lập thì dữ liệu kết nối đƣợc lƣu lại trong file cấu hình dƣới các tên liên quan. Khi một kết nối mới đƣợc yêu cầu truyền thông với một CSDL đã đƣợc kết nối thì các tham số kết nối đƣợc trích xuất từ file thuộc tính đó và nạp vào lớp
DatabaseRefClass. Phụ thuộc vào thuộc tính của DatabaseRefClass, Database_Connection_Manager sẽ tạo ra một lớp con của lớp database. Các thuộc tính kết nối của CSDL sẽ đƣợc ghi lại trong file định dạng XML.
Mô tả các lớp: - Lớp Database: Tên lớp Database
Mục đích Cung cấp một giao diện trìu tƣợng cho kết nối CSDL
getResulst_with_con(String sql) Tạo ra kết nối và lấy kết quả executeStmt(String sql)throws
Exception
Thực thi một câu truy vấn SQL
getConnection() Thiết lập một kết nối dựa vào chuỗi kết nối
getColumnslist(String table) lấy danh sách cột và bảng
getResulst(String sql) Lấy kết quả từ các kết nối đƣợc thiết lập
closeConnection() Đóng kết nối đang mở
Thuộc tính Tên thuộc tính Mô tả
con Java.sql.Connection Object
Con_string Connection String
Uname User name
Password Password đƣợc mã hóa
- Lớp DatabaseRefClass: Tên lớp DatabaseRefClass
Mục đích Dữ liệu đƣợc yêu cầu để tạo ra một kết nối đƣợc lƣu trữ trong lớp này
Phƣơng thức Tên phƣơng thức Mô tả
loadConnectionData() Trích xuất dữ liệu yêu cầu từ file cấu hình XML
Thuộc tính Tên thuộc tính Mô tả
đặt
Databasename Tên CSDL
connectionString Chuỗi kết nối
Drivername Tên trình điều khiển
Username User name
Password Password đã mã hóa
dbType Loại CSDL
- Lớp Database_Connection_Manager: Tên lớp Database_Connection_Manager
Mục đích Quyết định lớp con nào sẽ thực hiện phụ thuộc vào dữ liệu đƣa ra
Phƣơng thức Tên phƣơng thức Mô tả
getconInterface()
Thuộc tính Tên thuộc tính Mô tả 3.4.2. Tầng trừu tƣợng cơ sở dữ liệu
Trong tầng này các bảng CSDL và các cột của bảng đƣợc trìu tƣợng bằng sự mô tả. Do đó ngƣời dùng sẽ không nhìn thấy bất kỳ sự khác nhau giữa các cấu trúc lƣu trữ của mỗi CSDL.
Hình 19: Khung nhìn độc lập với CSDL
Tầng trìu tƣợng dữ liệu thiết lập một khung nhìn chung về các CSDL đƣợc kết nối. Các bảng và các cột của CSDL đƣợc kết nối đƣợc tổ chức bên trong một view dạng cây mà không quan tâm đến loại của CSDL.
DATABASE A TABLE 1 COLUMN 1 COLUMN 2 TABLE 2 COLUMN 1 COLUMN 2 DATABASE B TABLE 1 COLUMN 1 COLUMN 2
Các bảng và các cột đƣợc tham chiếu sử dụng tên đƣờng dẫn đầy đủ. Ví dụ nhƣ cột 1 của bảng 1 trong CSDL A đƣợc tham chiếu tới DATABASE A: Table 1: Column 1. Vì vậy mỗi bảng và cột có thể tham chiếu mà không có xung sự xung đột về tên của chúng.
Mô tả các lớp
- Lớp DBComponentList: Tên lớp DBComponentList
Mục đích Giao diện đồ họa hiển thị danh mục view dạng cây các bảng và cột của bảng
Phƣơng thức Tên phƣơng thức Mô tả
getConnectedSites() Lấy thông tin từ các file cấu hình của CSDL đƣợc kết nối
addNodesTotree() Các node đƣợc thêm vào cây
Thuộc tính Tên thuộc tính Mô tả
DefecultTreeNode Node gốc của cây
- Lớp TableList: Tên lớp TableList
Mục đích Liệt kê danh sách các bảng của CSDL đƣợc kết nối
Phƣơng thức Tên phƣơng thức Mô tả
tableList(String ref) Danh sách các bảng của CSDL kết nối
Thuộc tính Tên thuộc tính Mô tả - Lớp ColumnList:
Phƣơng thức Tên phƣơng thức Mô tả
columnList(String ref) Danh sách các cột và loại dữ liệu của bảng
Thuộc tính Tên thuộc tính Mô tả 3.4.3. Tầng ánh xạ lƣợc đồ và tích hợp
Các khung nhìn (view) đã liên hợp đƣợc tạo sử dụng các CSDL đã kết nối. Và ngƣời dùng định nghĩa các khung nhìn đƣợc ghi lại với các file XML. File mô tả dữ liệu đã liên hợp chứa đựng tất cả các thông tin bắt buộc để tích hợp các CSDL.
Hình 20: Tầng tích hợp dữ liệu
Tầng ánh xạ lƣợc đồ và tích hợp chủ yếu tập trung vào việc tạo ra các view CSDL liên hợp. Các truy vấn CSDL đã liên hợp đƣợc lƣu trữ trong một file XML. Tầng xử lý truy vấn thông dịch file đó và đem về dữ liệu từ các CSDL đã kết nối dựa vào mô tả.
File XML mô tả về dữ liệu liên hợp, nó chứa đựng thông tin về hệ thống CSDL mà dựa vào để lấy dữ liệu.
Để tạo ra một tập dữ liệu liên hợp ngƣời dùng lựa chọn các cột cần thiết từ các CSDL đƣợc kết nối và các bảng mà chứa các cột đó, sau đó ngƣời dùng sẽ xác định các cột để kết nối qua mệnh đề WHERE. Sau đó bộ truy vấn phân tán chia toàn bộ truy vấn thành các truy vấn con để thuận lợi cho việc thực thi trên các CSDL độc lập. Khi truy vấn phân tán đang xử lý, mỗi truy vấn con đƣợc thực thi trên các CSDL riêng biệt
và tập dữ liệu kết quả đƣợc trích xuất. Trong giai đoạn tiếp theo tập kết quả đó đƣợc hợp nhất tùy theo cột liên kết xác định.
Ví dụ:
Ngƣời dùng thực hiện truy vấn:
Select ‐> database1:table1:column1, database1:table1:column2, database1:table2:column1, database2:table1:column1
From ‐>database1:table1, database1:table2,database2:table1 Join ‐> database1:table1:column1 = database2:table1:column1
Lớp DistributedQueryCreator sẽ tạo ra các truy vấn con nhƣ sau: Truy vấn đối với database 1 :
Select table1.column1, table2.column2 From table1, table2
Truy vấn đối với database 2 :
Select table1.column1 From table1
Mô tả lớp DistributedQueryCreator:
Tên lớp DistributedQueryCreator
Mục đích Tạo ra mô tả truy vấn liên hợp, xử lý câu truy vấn của ngƣời dùng thành các câu truy vấn con mà có thể thực thi trên các CSDL đã kết nối.
Phƣơng thức Tên phƣơng thức Mô tả
Start() Khởi tạo các tham số
processSelectionList() Chia các cột đã chọn thành các truy vấn con
processTables() Xác định ra các bảng khác nhau của cùng một site và liên kết chúng để tạo ra một truy vấn con.
processSites() Xác định ra các CSDL riêng biệt
3.4.4. Tầng xử lý truy vấn tích hợp
Dữ liệu đƣợc lấy từ các CSDL khác nhau và đƣợc kết hợp dựa vào sự mô tả truy vấn liên hợp. Trong việc liên hợp CSDL, các bản ghi đƣợc lấy từ mỗi CSDL đƣợc lƣu trữ trong file mô tả dữ liệu liên hợp. Sau khi có đƣợc hệ thống các tập dữ liệu nó sẽ tích hợp chúng để có đƣợc khung nhìn tích hợp cuối cùng.
Hình 21: Xử lý truy vấn
Tầng tích hợp CSDL phân tích khung nhìn liên hợp thành các truy vấn con mà mỗi CSDL có thể thực thi một cách độc lập.
Lớp ObjectDeescriptionEditor là giao diện ngƣời dùng để đọc file tham số cấu hình xác định bởi ngƣời dùng. Sử dụng thông tin đƣợc trích xuất một trƣờng hợp của lớp MYView sẽ đƣợc tạo ra. Lớp XMLprocessor sẽ đƣợc sử dụng để trích xuất thông tin từ file cấu hình. Sử dụng lớp MyView, IntegrationMain để tạo ra các câu lệnh có thể thực thi tại mỗi kết nối.
3.4.5. Tầng lƣu trữ trung gian
Các kết quả có đƣợc từ việc xử lý các câu truy vấn đƣợc lƣu lại trong một CSDL nhúng. Việc lƣu lại dữ liệu trong một CSDL nhúng cho phép xử lý dữ liệu một cách dễ dàng hơn.
Hình 22: Dữ liệu đƣợc lƣu trữ trong CSDL nhúng
Trong pha chuyển đổi (transform) của quá trình ETL, dữ liệu đã trích xuất đƣợc lƣu trữ trung gian, và nhƣ vậy chúng ta cần áp dụng một số các phép toán nhƣ GROUP, tính tổng, và lọc để biến đổi dữ liệu. Vì vậy cuối cùng yêu cầu chặt chẽ hơn để xem xét dữ liệu đƣợc lƣu trữ nhƣ là CSDL khác. Do đó CSDL nhúng đƣợc sử dụng để lƣu trữ dữ liệu trung gian, CSDL nhúng Derby đƣợc lựa chọn là CSDL lƣu trữ trung gian. Apache Derby là một CSDL quan hệ mã nguồn mở đƣợc viết hoàn toàn bằng JAVA. Apache Derby phiên bản 2.0 có các thuộc tính mà phù hợp với các yêu cầu hệ thống tích hợp dữ liệu. Apache Derby dựa trên JAVA, JDBC và các chuẩn SQL.
Lớp lƣu trữ trung gian phân cấp bao gồm ba lớp chính “InterMstoreManager" trong lớp khởi tạo, đón nhận các yêu cầu ngƣời dùng và chuyển hƣớng tùy theo loại yêu cầu. Lớp IntermediateStorage về cơ bản xử lý, quản lý kết nối và lớp
ExecuteQueryOnInterMDB cho việc thực thi các truy vấn trên CSDL derby.
3.4.7. Các tiện ích
Tầng này bao gồm tiên tích để truy vấn đến các dữ liệu đã đƣợc kết nối và các tiện ích khác.
3.5. THIẾT KẾ GIAO DIỆN ỨNG DỤNG
Việc thiết kế giao diện ứng dụng đồ họa (GUI) cho công cụ phần mềm tích hợp CSDL sẽ tập trung vào thiết kế giao diện cơ bản nhất để có thể làm việc đƣợc với một số CSDL phổ biến. Và giả thiết là các ngƣời dùng đã đƣợc làm quen với một số sản phẩm phần mềm. Do đó kiểu giao diện ngƣời dùng IDE (Integrated Development Environment) sẽ đƣợc thiết kế nhƣ giao diện chính của công cụ tích hợp này.
Giao diện chính của chƣơng trình sẽ bao gồm ba phần chính: Thanh menu, panel bên trái của khung nhìn dạng cây (tree) của các CSDL đƣợc kết nối và khu vực bên phải. Tất cả cửa sổ chức năng đƣợc mở bên trong giao diện chính.
3.6. MÔI TRƢỜNG PHÁT TRIỂN HỆ THỐNG
Công cụ phần mềm về giải pháp tích hợp CSDL đƣợc thiết kế, xây dựng trên các môi trƣờng phát triển hệ thống nhƣ sau:
Stt Tên Mô tả
1 Hệ điều hành Windows server 2003
2 Môi trƣờng phát triển tích hợp NetBeans IDE 7.0
Database connection | Integration | Query |... + Database 1 --Table 1 -- Table 2 ... + Database 2 --Table 1 -- Table 2 ... + Database 3
Khu vực thể hiện kết quả thực thi các chức năng của hệ thống
3 Ngôn ngữ lập trình JAVA
4 Java Virtual machine JDK 1.6.0
5 Hệ quản trị CSDL MySQL server, MSSQL server
3.7. LẬP TRÌNH
Thực hiện viết mã cho công cụ phần mềm tích hợp CSDL bằng ngôn ngữ lập trình JAVA. JAVA là ngôn ngữ lập trình hƣớng đối tƣợng đƣợc sử dụng phổ biến nhất hiện nay trong việc xây dựng các ứng dụng.
Một số modul trong chƣơng trình:
- Modul kết nối đến các CSDL:
package dbinterface; import java.sql.*; import java.util.*;
public interface Database {
public Vector getTableNames(String schema); public Connection getConnection();
public boolean executeStmt(String sql) throws Exception; public ResultSet getResulst(String sql);
public void closeConnection();
public Vector getColumnslist(String table); public ResultSet getResulst_with_con(String sql); }
// Modul kết nối đến CSDL Mysql server:
package dbinterface; import java.sql.*; import java.util.*;
public class MySQLinterface implements Database{ public Connection con;
public String uname; public String password;
security.PasswordEncDec passdec = new security.PasswordEncDec(); public MySQLinterface(String con,String username,String pass){
con_string = con; uname = username ;
password = passdec.decrypt(pass) ; }
public Connection getConnection() { Connection con = null;
try {
String driver = "com.mysql.jdbc.Driver"; Class.forName(driver);
//String url = "jdbc:mysql://localhost/test"; String url = con_string;
System.out.println(url + "--- " + uname +" -- " + password); con =DriverManager.getConnection( url, uname, password ); } catch (Exception e) {
System.out.println("Error loading MYsql Connection " + e.toString()); }
return con; }
public void closeConnection() {
try{
con.close();
}catch(Exception e) {
System.out.println("Error closing mySQL " + e.toString()); }
}
public boolean executeStmt(String sql)throws Exception {
Connection pcon = getConnection(); Statement st = pcon.createStatement(); ok = st.execute(sql); pcon.commit(); pcon.close(); return ok; }
public ResultSet getResulst_with_con(String sql) { ResultSet rs=null; try{ con = getConnection(); Statement stmt = con.createStatement(); rs = stmt.executeQuery(sql); }catch(Exception e) {
System.out.println("Error generating Result - " + sql + e.toString()); }
return rs; }
public ResultSet getResulst(String sql) { ResultSet rs=null; try{ Statement stmt = con.createStatement(); rs = stmt.executeQuery(sql); }catch(Exception e) {
System.out.println("Error generating Result - " + sql + e.toString()); }
return rs; }
{
con = getConnection(); Vector vec = new Vector();
//vec.add(new String("MYSQLtest")); try{
String sql = "SELECT TABLE_NAME FROM information_schema.`TABLES` where TABLE_SCHEMA='" +schema+"' ";
ResultSet rs= getResulst(sql); while(rs.next())
{
System.out.println("getting table names"); vec.add(new String(rs.getString(1))); }
}catch(Exception e) {
System.out.println(" Error getting table names MYSQL " + e.toString()); }
return vec; }
public Vector getColumnslist(String table) {
Vector vec = new Vector(); try{
con = getConnection();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("DESCRIBE " + table); DatabaseMetaData dbm = con.getMetaData();
ResultSet rs1 = dbm.getColumns(null, "%", table, "%"); while (rs1.next()) {
String col_name = rs1.getString("COLUMN_NAME"); String data_type = rs1.getString("TYPE_NAME"); vec.add(new String(col_name + ":" + data_type)); int data_size = rs1.getInt("COLUMN_SIZE"); int nullable = rs1.getInt("NULLABLE");
System.out.print(col_name + "\t" + data_type + "(" + data_size + ")" + "\t"); if (nullable == 1) { System.out.print("YES\t"); } else{ System.out.print("NO\t"); } System.out.println(); } closeConnection(); }catch(Exception e) {
System.out.println(" Error getting colomn names " + e.toString()); }
return vec; }
}
3.8. KẾT QUẢ THỬ NGHIỆM GIẢI PHÁP TÍCH HỢP DỮ LIỆU
Công cụ tích hợp CSDL đƣợc xây dựng cho phép tích hợp các CSDL từ các nguồn khác nhau thuộc các hệ quản trị CSDL khác nhau nhƣ: Oracle, MS SQL Server, MySQL server và PostgresSQL server.
3.8.1. Một số giao diện trong chƣơng trình
Hình 24: Giao diện chính của chƣơng trình - Giao diện kết nối đến cơ sở dữ liệu:
- Giao diện trích xuất dữ liệu từ CSDL:
Hình 26: Giao diện trích xuất dữ liệu từ CSDL - Giao diện tích hợp dữ liệu:
Hình 27: Giao diện tích hợp dữ liệu - Giao diện tiện ích truy vấn đến các CSDL đã kết nối:
Hình 28: Giao diện tiện ích truy vấn đến các CSDL đã kết nối
3.8.2. Kết quả đạt đƣợc
Trong kết quả DEMO của chƣơng trình đã thực hiện thử nghiệm chƣơng trình bằng việc tích hợp các thủ tục hành chính từ hai nguồn khác nhau của hai hệ quản trị CSDL là MySQL server và MS SQL server.
Kết quả của việc tích hợp đó đƣợc lƣu trữ trong kho CSDL tích hợp về thủ tục hành chính nhằm phục vụ cho việc xử lý truy vấn, phân tích, khai thác và sử dụng với nhiều mục đích khác nhau nhƣ: Xây dựng các dịch vụ hành chính công trực tuyến trên nền CSDL tích hợp phục vụ cho ngƣời dân và doanh nghiệp trong việc thực thi các thủ tục hành chính; cụ thể là dịch vụ hành chính công về cấp phép đăng ký kinh doanh, dịch vụ cấp sổ hộ khẩu hay sổ đỏ nhà đất...
KẾT LUẬN
- KẾT QUẢ ĐÃ ĐẠT ĐƢỢC
Kết quả mà tôi đã đạt đƣợc là hết sức có ý nghĩa về mặt thực tiễn trong việc nghiên cứu, phân tích, đánh giá để xây dựng giải pháp tích hợp dữ liệu cho một tổ chức, cụ thể đã tiến hành nghiên cứu, phân tích và đánh giá một số kỹ thuật và công nghệ trong việc tích hợp dữ liệu đƣợc sử dụng phổ biến nhất hiện nay.
Qua đó đã vận dụng kết quả nghiên cứu để phân tích, thiết kế và xây dựng một phần mềm dựa trên chuẩn công nghệ ETL (Extract, Transform and Load) để có thể tích hợp các thủ tục hành chính từ các nguồn CSDL khác nhau để xây dựng kho CSDL tích hợp về thủ tục hành chính đƣợc quản lý thống nhất, tập trung phục vụ cho việc xử lý, phân tích và tổng hợp và đặc biệt là ứng dụng để xây dựng các dịch vụ hành chính công trực tuyến phục vụ cho ngƣời dân và doanh nghiệp.
- HƢỚNG PHÁT TRIỂN
Trong phạm vi luận văn này đã thực hiện nghiên cứu, phân tích, đánh giá về một số giải pháp kỹ thuật và Công nghệ đƣợc sử dụng cho việc xây dựng giải pháp tích hợp dữ liệu, qua đó đã thiết kế, xây dựng đƣợc một giải pháp phần mềm phục vụ cho việc tích hợp CSDL từ nhiều nguồn khác nhau của các hệ quản trị CSDL khác nhau. Tuy nhiên ở đây mới chỉ tập trung vào việc nghiên cứu, phân tích và xây dựng giải pháp phần mềm để tích hợp dữ liệu thuộc loại CSDL quan hệ. Vì vậy hƣớng phát triển tiếp theo là sẽ thực hiện nghiên cứu, phân tích một số giải pháp kỹ thuật, công nghệ và xây dựng giải pháp phần mềm phục vụ cho việc tích hợp dữ liệu có cấu trúc và phi cấu trúc.
TÀI LIỆU THAM KHẢO
[1] An Overview of EII Technology and How to Use it - by Pedo, Inc. 2006. [2] Building the Data Warehouse by John Wiley & Sons, 2nd edition, 1996.