【发布时间】:2017-05-30 20:06:17
【问题描述】:
我对比较 OCCI(Oracle C++ 调用接口)和旧 JDBC 的性能测试感到非常惊讶。
代码如下:
#include <iostream>
#include <cstdlib>
#include <occi.h>
using namespace oracle::occi;
using namespace std;
const string username = "system";
const string password = "******";
const string url = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)))";
const string sql = "select * from CREDITO.movtos_cuentas";
int main(int argc, char** argv) {
cout << "Oracle Connectivity" << endl;
Environment *env = Environment::createEnvironment(Environment::DEFAULT);
Connection *conn = env->createConnection(username, password, url);
Statement *stm = conn->createStatement(sql);
ResultSet *rs = stm->executeQuery();
unsigned long count = 0;
while (rs->next()) {
count++;
}
stm->closeResultSet(rs);
conn->terminateStatement(stm);
env->terminateConnection(conn);
Environment::terminateEnvironment(env);
cout << "Registros na CREDITO.MOVTOS_CUENTAS: " << count << endl;
return 0;
}
这里是 Java 代码:
package oraconnect.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OraconnectJdbc {
public static void main(String[] args) {
Connection conn = null;
Statement stm = null;
ResultSet rs = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:xe", "system", "******");
stm = conn.createStatement();
rs = stm.executeQuery("select * from CREDITO.movtos_cuentas");
long count = 0;
while (rs.next()) {
count++;
}
System.out.printf("Registros na CREDITO.MOVTOS_CUENTAS: %d\n", count);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
//Ignore
}
}
if (stm != null) {
try {
stm.close();
} catch (SQLException e) {
//Ignore
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
//Ignore
}
}
}
}
}
执行:
C++ 版本
time LD_LIBRARY_PATH=/home/eduardo/Private/Oracle/instantclient_11_2/. ./oraconnect
Java 版本
time java -jar oraconnect-jdbc.jar -cp lib/oracle-driver-11.2.0.3.jar
C++ 结果:
real 1m29.392s
user 0m32.788s
sys 0m20.812s
Java 结果:
real 0m28.404s
user 0m12.076s
sys 0m4.236s
结论:
Java 明显快于 C++
我想知道我是否在 C++ 版本中犯了错误或使用了一些不好的做法。谁能帮我理解这个结果?
【问题讨论】:
-
他发布了一个问题,你无法相信接下来会发生什么!
-
NathanOliver,结果已发布。
-
结论 - 你第二个运行的速度更快,因为一堆数据已经从磁盘中提取并位于 SGA 中。
-
为什么说“旧的 JDBC”? Oracle 通过添加新特性和性能优化不断改进其 JDBC 驱动程序。
-
感谢您改进问题的指导,但我希望您专注于寻找问题的解决方案,这是最重要的。我明白这足以理解并尝试回应。我们都会通过解决问题的方法获胜。