bitsCN.com
连接池为了解决频繁的创建、销毁所带来的系统开销。
简而言之,就是 自己先创建一定量的连接,然后在需要的时候取出一条连接使用。
当然如果你只有一个线程连接数据库,而且不是实时返回结果,那么你完全不必用连接池。
想一下网络大型游戏服务器,你就明白为什么需要连接池了。
自己敲代码写了一个简单的类,实现连接池,虽然没有mysql++那么强大,但是还是自己有收获。
Csqlpool.h 头文件实现如下:
#pragma once#include <WinSock2.h>#include <mysql.h>#include <list>#pragma comment( lib , "libmysql.lib" )using namespace std;class Csqlpool{public: ~Csqlpool(void); static Csqlpool *GetSqlPool(); bool IniSqlPool( const char *host , const char *name , const char *pwd , unsigned int port , unsigned int conMax ); //初始化连接池 bool SelectDB( MYSQL *sql, const char *DB); //选择数据库 MYSQL *GetConnect(); // 获取连接 void RelConnect(MYSQL *sql) ; // 释放连接 MYSQL_RES* GetQuery( MYSQL *sql , const char *query); //mysql操作 增删查改 void RelQuery(MYSQL_RES *res); //释放MYSQL_RES资源 bool Query(MYSQL *sql , const char *query); //增、删、改操作protected: Csqlpool(void);private: list<MYSQL *> m_sql_free; //空闲连接 static Csqlpool *pSqlPool; CRITICAL_SECTION m_session; //获取空闲线程};
Csqlpool.cpp 实现如下:
#include "StdAfx.h"#include "Csqlpool.h"Csqlpool *Csqlpool::pSqlPool = NULL;Csqlpool::Csqlpool(void){ InitializeCriticalSection( &m_session );}Csqlpool::~Csqlpool(void){ while ( m_sql_free.size() ) { mysql_close( m_sql_free.front() ); m_sql_free.pop_front(); } DeleteCriticalSection(&m_session);}Csqlpool* Csqlpool::GetSqlPool(){ if ( pSqlPool == NULL ) { return new Csqlpool; } return pSqlPool;}bool Csqlpool::IniSqlPool( const char *host ,const char *name , const char *pwd , unsigned int port , unsigned int conMax ) //初始化连接池{ int nsum = 0 ; for (unsigned int i = 0 ; i < conMax ;++i ) { MYSQL *pmysql; pmysql = mysql_init( (MYSQL*)NULL ); if ( pmysql != NULL ) { if ( mysql_real_connect( pmysql , host , name , pwd , NULL , 3306 , NULL , 0 ) ) { m_sql_free.push_back(pmysql); } else { if ( nsum++ == 100 ) { return false; } continue; } } continue; } return true;}bool Csqlpool::SelectDB( MYSQL *sql, const char *DB) //选择数据库{ if(mysql_select_db(sql , DB)) { return false; } return true;}MYSQL* Csqlpool::GetConnect() // 获取连接{ if ( m_sql_free.size() ) { EnterCriticalSection(&m_session); MYSQL *mysql = m_sql_free.front(); m_sql_free.pop_front(); LeaveCriticalSection(&m_session); return mysql; } else return NULL;}void Csqlpool::RelConnect(MYSQL *sql) // 释放连接{ EnterCriticalSection(&m_session); m_sql_free.push_back(sql); LeaveCriticalSection(&m_session);}MYSQL_RES* Csqlpool::GetQuery( MYSQL *sql , const char *query) //查询操作{ if ( mysql_query( sql , query ) == 0 ) { return mysql_store_result( sql ); } else return NULL;}void Csqlpool::RelQuery(MYSQL_RES *res) //mysql_res release{ mysql_free_result(res);}bool Csqlpool::Query(MYSQL *sql , const char *query) //增、删、改操作{ if ( mysql_query( sql , query ) ) { return false; } return true;}
testsqlpool.cpp 测试文件实现如下:
// testsqlpool.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "Csqlpool.h"#include <iostream>using namespace std;Csqlpool *psql = Csqlpool::GetSqlPool();DWORD WINAPI ThreadProc( LPVOID lpParameter);int _tmain(int argc, _TCHAR* argv[]){ if(!psql->IniSqlPool("127.0.0.1" , "root" ,"123",3306,10)) { cout<<"连接错误"<<endl; } HANDLE phan[2] ; DWORD threadid[2]; int n1 = 0, n2 = 100;; phan[0] = CreateThread( NULL , 0 , ThreadProc , &n1 , 0 , &threadid[0] ); phan[1] = CreateThread( NULL , 0 , ThreadProc , &n2 , 0 , &threadid[1] ); WaitForMultipleObjects( 2 , phan , true , INFINITE ); CloseHandle(phan[0]); CloseHandle(phan[1]); return 0;}DWORD WINAPI ThreadProc( LPVOID lpParameter){ int index = *(int *)lpParameter ; int i = 1; MYSQL *sql = psql->GetConnect(); string stemp = "insert into actor( actor_id , first_name , last_name,last_update )values(/""; string strsql; char str[10]; if ( psql->SelectDB(sql , "sakila") ) { while ( i != 100 ) { sprintf( str , "%d" , i+index ); strsql = stemp ; strsql += str; strsql += "/",/"0/",/"0/",/"0/")"; if(!sql) return 0; if(!psql->Query( sql ,strsql.c_str() )) { cout<<"add false"<<endl; } ++i; } psql->RelConnect(sql); } return 0;}bitsCN.com

MySQLoffersVariousStorageEngines, chacune, chacun desCasses: 1) InnodbisidealForApplications newedingacidcompenciance and highcurrency, soutenant les transactions et manqueurs

Les vulnérabilités de sécurité courantes dans MySQL incluent l'injection SQL, les mots de passe faibles, la configuration d'autorisation incorrecte et les logiciels unpudés. 1. L'injection SQL peut être évitée en utilisant des instructions de prétraitement. 2. Les mots de passe faibles peuvent être évités en utilisant de force des stratégies de mot de passe solides. 3. Une mauvaise configuration d'autorisation peut être résolue par examen régulier et ajustement des autorisations utilisateur. 4. Les logiciels unpus peuvent être corrigés en vérifiant et mise à jour régulièrement la version MySQL.

L'identification des requêtes lentes dans MySQL peut être réalisée en activant les journaux de requête lents et en définissant des seuils. 1. Activer les journaux de requête lents et définir les seuils. 2. Afficher et analyser les fichiers journaux de requête lente et utiliser des outils tels que MySqlDumpSlow ou Pt-Query-digest pour une analyse approfondie. 3. Optimisation des requêtes lentes peut être réalisée grâce à l'optimisation de l'index, à la réécriture de la requête et à l'évitement de l'utilisation de Select *.

Pour surveiller la santé et les performances des serveurs MySQL, vous devez prêter attention à la santé du système, aux mesures de performance et à l'exécution des requêtes. 1) Surveiller la santé du système: utilisez les commandes TOP, HTOP ou ShowGlobalStatus pour afficher les activités du CPU, de la mémoire, des E / S de disque et du réseau. 2) Suivre les indicateurs de performance: surveiller les indicateurs clés tels que le numéro de requête par seconde, le temps de requête moyen et le taux de réussite du cache. 3) Assurer l'optimisation de l'exécution des requêtes: activer les journaux de requête lents, enregistrer et optimiser les requêtes dont le temps d'exécution dépasse le seuil défini.

La principale différence entre MySQL et MARIADB est les performances, les fonctionnalités et la licence: 1. MySQL est développé par Oracle, et MariADB est sa fourche. 2. MariaDB peut mieux fonctionner dans des environnements à haute charge. 3.MariaDB fournit plus de moteurs et de fonctions de stockage. 4.MySQL adopte une double licence et MariaDB est entièrement open source. L'infrastructure existante, les exigences de performance, les exigences fonctionnelles et les coûts de licence doivent être pris en compte lors du choix.

MySQL utilise une licence GPL. 1) La licence GPL permet l'utilisation, la modification et la distribution gratuites de MySQL, mais la distribution modifiée doit se conformer à GPL. 2) Les licences commerciales peuvent éviter les modifications publiques et conviennent aux applications commerciales qui nécessitent de la confidentialité.

Les situations lors du choix d'innodb au lieu de Myisam incluent: 1) le support de transaction, 2) un environnement de concurrence élevé, 3) une cohérence élevée des données; Inversement, la situation où le choix de Myisam comprend: 1) la lecture principalement des opérations, 2) Aucun support de transaction n'est requis. INNODB convient aux applications qui nécessitent une cohérence élevée des données et un traitement des transactions, telles que les plates-formes de commerce électronique, tandis que Myisam convient aux applications en lecture et sans transaction telles que les systèmes de blog.

Dans MySQL, la fonction des clés étrangères est d'établir la relation entre les tables et d'assurer la cohérence et l'intégrité des données. Les clés étrangères maintiennent l'efficacité des données grâce à des contrôles d'intégrité de référence et aux opérations en cascade. Faites attention à l'optimisation des performances et évitez les erreurs courantes lorsque vous les utilisez.


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

SublimeText3 version anglaise
Recommandé : version Win, prend en charge les invites de code !

VSCode Windows 64 bits Télécharger
Un éditeur IDE gratuit et puissant lancé par Microsoft

PhpStorm version Mac
Le dernier (2018.2.1) outil de développement intégré PHP professionnel

Version Mac de WebStorm
Outils de développement JavaScript utiles

Dreamweaver CS6
Outils de développement Web visuel
