| | |
| | | #include <iostream> |
| | | #include <memory> |
| | | #include <mutex> |
| | | #include <fstream> |
| | | #include <string> |
| | | #include <ctime> |
| | | using namespace std; |
| | | class A { |
| | | #include <mysql_driver.h> |
| | | #include <mysql_connection.h> |
| | | #include <cppconn/statement.h> |
| | | #include <cppconn/resultset.h> |
| | | |
| | | class DatabaseOperator { |
| | | private: |
| | | ofstream logFile; |
| | | A() { |
| | | logFile.open("123.txt", ios::app); |
| | | // ç§ææé 彿° |
| | | DatabaseOperator() { |
| | | try { |
| | | driver = sql::mysql::get_mysql_driver_instance(); |
| | | connection = driver->connect("tcp://127.0.0.1:3306", "username", "password"); |
| | | connection->setSchema("your_database"); |
| | | } catch (sql::SQLException &e) { |
| | | std::cerr << "æ°æ®åºè¿æ¥é误: " << e.what() << std::endl; |
| | | } |
| | | } |
| | | ~A() { |
| | | logFile.close(); |
| | | } |
| | | A(const A &t){} |
| | | A& operator=(const A &t){} |
| | | static A* volatile s_obj; |
| | | static mutex g_mutex; |
| | | |
| | | static DatabaseOperator* instance; |
| | | static std::mutex mutex; |
| | | sql::Driver* driver; |
| | | std::unique_ptr<sql::Connection> connection; |
| | | |
| | | public: |
| | | static A* getInstance() { |
| | | if (s_obj == nullptr) { |
| | | lock_guard<mutex> guard(g_mutex); |
| | | if (s_obj == nullptr) { |
| | | s_obj = new A; |
| | | } |
| | | // è·ååä¾å®ä¾ |
| | | static DatabaseOperator* getInstance() { |
| | | std::lock_guard<std::mutex> lock(mutex); |
| | | if (instance == nullptr) { |
| | | instance = new DatabaseOperator(); |
| | | } |
| | | return s_obj; |
| | | return instance; |
| | | } |
| | | void write(const string& level, const string& description, const string& time) { |
| | | logFile << "[" << level << "] " << "[" << time << "] " << description << endl; |
| | | } |
| | | void release() { |
| | | if (s_obj) { |
| | | delete s_obj; |
| | | s_obj = nullptr; |
| | | |
| | | // æ§è¡æ¥è¯¢æä½ï¼ç¤ºä¾ï¼ |
| | | sql::ResultSet* query(const std::string& sql) { |
| | | try { |
| | | std::unique_ptr<sql::Statement> stmt(connection->createStatement()); |
| | | return stmt->executeQuery(sql); |
| | | } catch (sql::SQLException &e) { |
| | | std::cerr << "æ¥è¯¢é误: " << e.what() << std::endl; |
| | | } |
| | | return nullptr; |
| | | } |
| | | }; |
| | | |
| | | A* volatile A::s_obj = nullptr; |
| | | mutex A::g_mutex; |
| | | |
| | | int main() { |
| | | A* a1 = A::getInstance(); |
| | | A* a2 = A::getInstance(); |
| | | if (a1 == a2) { |
| | | cout << "å便å" << endl; |
| | | } |
| | | else { |
| | | cout << "åä¾å¤±è´¥" << endl; |
| | | } |
| | | time_t now = time(nullptr); |
| | | char buffer[80]; |
| | | struct tm timeinfo; |
| | | localtime_s(&timeinfo, &now); |
| | | strftime(buffer, 80, "%Y - %m - %d %H:%M:%S", &timeinfo); |
| | | string timeStr(buffer); |
| | | a1->write("1", "æ¥å¿", timeStr); |
| | | a1->release(); |
| | | return 0; |
| | | } |
| | | std::mutex DatabaseOperator::mutex; |
| | | DatabaseOperator* DatabaseOperator::instance = nullptr; |