2017-10-11 82 views
6

Tôi đang sử dụng OCCI với C++ để lấy dữ liệu từ Oracle. Mã hoạt động tốt, tuy nhiên tôi nhận thấy một số hiệu suất giảm. Điều này xảy ra vì trong quá trình lặp lại rset-> next() một số tính toán cần có thời gian. Tác động của sự chậm trễ này là hồ bơi kết nối oracle có một kết nối bận rộn. Nếu đồng thời yêu cầu yêu cầu cùng một tính toán, có lẽ tất cả các kết nối trong hồ bơi sẽ là Bận.Sao chép Occi :: ResultSet trước khi đóng Occi :: Connection

 Statement *stmt = conn->createStatement (sqlQuery); 

     ResultSet *rset = stmt->executeQuery(); 
     while (rset->next()) 
     { 
     //Slow computation takes time 
     compute() 
     } 

     stmt->closeResultSet (rset); 

     conn->terminateStatement (stmt); 
     env->terminateConnection (conn); 

Vì vậy, câu hỏi của tôi là: Tôi có thể sao chép Occi :: ResultSet (sử dụng con trỏ chia sẻ?) Để đóng kết nối SAU bản sao và thực hiện tính toán sau khi phát hành kết nối?

go_to_oracle(ResultSet &result) { 
Statement *stmt = conn->createStatement (sqlQuery); 

    ResultSet *rset = stmt->executeQuery(); 

    copy_rset_to_result; 


    stmt->closeResultSet (rset); 

    conn->terminateStatement (stmt); 
    env->terminateConnection (conn); 
} 

my_method() { 

ResultSet *result = NULL 
go_to_oracle(result); 
//here connection is closed, but we have the data 
compute(result) // do this without have connection occupied 

} 

Bất kỳ ví dụ nào có sẵn trên GitHub?

+0

Nếu có thể tạo đối tượng lớp và lưu trữ từng thông tin thô vào đối tượng lớp và lưu trữ nó trong bản đồ. Làm điều đó khi tải chương trình. –

Trả lời

1

Không thể đóng kết nối với cơ sở dữ liệu và lưu tập kết quả (occi :: ResultSet) để sử dụng sau này. Một lý do là occi :: ResultSet :: tiếp theo truy xuất dữ liệu từ cơ sở dữ liệu. Thay vào đó, bạn có thể sử dụng tìm nạp mảng và bộ đệm dữ liệu do người dùng cấp để lưu trữ kết quả.

Ví dụ về sử dụng OCCI :: ResultSet :: setDataBuffer:

oracle::occi::ResultSet* rs=nullptr; 
//..... 
// query 
//..... 
static const size_t max_numrows=5000; 
char var_buf[max_numrows][7]; 
char sym_buf[max_numrows][9]; 
rs->setDataBuffer(1,var_buf,oracle::occi::OCCI_SQLT_STR,sizeof(var_buf[0]),(ub2*)0); 
rs->setDataBuffer(2,sym_buf,oracle::occi::OCCI_SQLT_STR,sizeof(sym_buf[0]),(ub2*)0); 
size_t fetch_count=0; 
while(rs->next(max_numrows)==ResultSet::DATA_AVAILABLE) 
{ 
    /* This would probably be an error as you would like 
     the whole result to fit in the data buffer.*/ 
} 
stmt->closeResultSet (rs); 
conn->terminateStatement (stmt); 
compute(var_buf,sym_buf); 

Note mảng mà lấy hành vi như prefetch trong đó

Status next(
    unsigned int numRows =1); 

lấy về lên đến numRows mỗi cuộc gọi.

+0

Nếu có thể tạo một đối tượng lớp và lưu trữ từng thông tin thô vào đối tượng lớp và lưu trữ nó trong bản đồ. Làm điều đó khi tải chương trình. –

-1

Truy vấn thực thi không truy lục dữ liệu. Bạn đọc dữ liệu từ máy chủ bằng cách sử dụng rset-> next(). Vì vậy, nếu bạn chấm dứt kết nối - bạn không thể đọc dữ liệu

+0

Tôi biết điều đó. Tôi đang tìm một giải pháp lấy tất cả các kết quả mà không thực hiện tính toán đóng kết nối và xác nhận kết quả sau – cateof

Các vấn đề liên quan