在以前的項目中,發現工程是基於C++的,可是代碼中數據庫的鏈接卻基於C api接口,主要接口以下:mysql
mysql_init mysql_real_connect mysql_query mysql_close
包括初始化,創建鏈接,執行查詢操做以及關閉等等,能夠看出,這實際上是純C接口,更適合C代碼下的數據庫鏈接。 可是習慣了JAVA下數據庫鏈接處理方式的我,仍是喜歡create_conn, create_statement, stmt.execute的一系列方式,那麼MySQL是否有支持相似JAVA的數據庫鏈接呢?
有! C++ MySQL Connector官方資源下載及示例文檔sql
連接中給予了不一樣操做系統,不一樣位數CPU下C++ Connector的RPM安裝包以及示例文檔,一看就會,很是的easy。數據庫
我基於C++ MySQL Connector實現了一個簡單的數據庫鏈接池,能夠像使用JAVA同樣,進行數據庫鏈接訪問。 我本身編寫的示例以下:api
DBConnPool* db_conn_pool = DBConnPool::GetInstance(); db_conn_pool->InitDBConnPool("username", "passwd", "tcp://*.11.*.1*:3306", 10, 20); sql::Connection* conn = db_conn_pool->GetConn(); sql::Statement *stmt = conn->createStatement(); stmt->execute("use vip_download"); const std::string mysql= "select tx_id, tx_puburl from trans_mgr"; sql::ResultSet *res = stmt->executeQuery(mysql); while (res->next()) { cout << "taskid = " << res->getInt(1) << endl; cout << "taskpuburl = " << res->getString("tx_puburl") << endl; } delete res; delete stmt; db_conn_pool->ReleaseConn(conn);
有了鏈接池,我只須要跟DBConnPool要數據庫鏈接便可,全部針對數據庫表的操做以及對業務層提供的接口放到DBUtil中便可。而業務層的代碼只須要GetData, SetData便可。將代碼進行分層,業務層的代碼能夠清晰不少。tcp
另一個好處是: 讀取數據是,不須要再作字符串轉各類類型的工做; 在初始化sql語句時,能夠經過各類set設置參數,不須要經過sprintf來生成SQL; 要簡單不少,也不易出錯。url
若是有大量相似操做,可使用PreparedStatement提升效率:操作系統
sql::PreparedStatement *prep_stmt = conn->prepareStatement(YOUR_SQL); for(ObjectMap::iterator cacheIter = ObjectMap.begin(); cacheIter != ObjectMap.end(); cacheIter++) { prep_stmt->setString(cacheIter->first); prep_stmt->setInt(taskID); prep_stmt->execute(); }
個人理解是經過將SQL語句預先編譯,將變量經過set操做替換進去便可。無需每次從新編譯。code