ConnPool

 //ConnObj *co = ConnPool::GetInstance()->GetConn();
 //_ConnectionPtr m_pConnection = co->conn;

 

#pragma once
#include <stdio.h>
#include <string>
#include <list>
#include <iostream>
#import "c:\Program Files\Common Files\System\ADO\msado15.dll"  no_namespace rename("EOF", "adoEOF")
#include "ConnObj.h"
using namespace std;

class ConnPool
{
private:
 static ConnPool* cpInst;
public:
 list<ConnObj*> poolList;

public:
 static ConnPool* GetInstance();
 void Init();
 ConnObj* Increase();
 ConnObj* GetConn();
 void DropConn(ConnObj* co);
public:
 ConnPool(void);
 ~ConnPool(void);
};

 

#include "StdAfx.h"
#include "ConnPool.h"
#include <algorithm>

#define MIN_COUNT 10
#define MAX_COUNT 100
HANDLE hMutex;

ConnPool::ConnPool(void)
{
 this->Init();
}

ConnPool::~ConnPool(void)
{
}

ConnPool* ConnPool::cpInst = NULL;
ConnPool* ConnPool::GetInstance()
{
 if(NULL==cpInst)
 {
  cpInst = new ConnPool();
 }
 else
 {
  return cpInst;
 }
}

void ConnPool::Init()
{
 CoInitialize(NULL);
 for(int i=0;i<MIN_COUNT;i++)
 {
  ConnObj *co = new ConnObj;

  co->OpenConn();
  if(NULL!=co)
  {
   //lock
   WaitForSingleObject(hMutex,INFINITE);
   poolList.push_back(co);
   ReleaseMutex(hMutex);
  }
 }
}

ConnObj* ConnPool::Increase()
{
 int size = poolList.size();

 if(size<MAX_COUNT)
 {
  ConnObj *co = new ConnObj;

  co->OpenConn();
  if(NULL!=co)
  {
   //lock
   WaitForSingleObject(hMutex,INFINITE);
   poolList.push_back(co);
   ReleaseMutex(hMutex);
   return co;
  }
  else
  {
   return NULL;
  }
 }
 else
 {
  return NULL;
 }
}

ConnObj* ConnPool::GetConn()
{
 bool bSuc;
 for(list<ConnObj*>::iterator it = this->poolList.begin();it!=this->poolList.end();it++)
 {
  if(!(*it)->isUsed)
  {
   WaitForSingleObject(hMutex,INFINITE);
   (*it)->isUsed = true;
   (*it)->usedCount =  (*it)->usedCount + 1;
   ReleaseMutex(hMutex);
   bSuc = true;
   return (*it);
   break;
  }
 }

 //全满
 if(!bSuc)
 {
  return Increase();
 }
}

void ConnPool::DropConn(ConnObj* co)
{
 co->isUsed = false;
 co->usedCount = co->usedCount - 1;
}

goroutine 52 [select]: github.com/go-sql-driver/mysql.(*mysqlConn).startWatcher.func1() D:/Program Files (x86)/Go/bin/pkg/mod/github.com/go-sql-driver/mysql@v1.7.1/connection.go:614 +0xaf created by github.com/go-sql-driver/mysql.(*mysqlConn).startWatcher D:/Program Files (x86)/Go/bin/pkg/mod/github.com/go-sql-driver/mysql@v1.7.1/connection.go:611 +0x10a goroutine 83 [select]: github.com/go-redis/redis/v8/internal/pool.(*ConnPool).reaper(0x12f262a0, 0xdf8475800) D:/Program Files (x86)/Go/bin/pkg/mod/github.com/go-redis/redis/v8@v8.11.5/internal/pool/pool.go:485 +0xd6 created by github.com/go-redis/redis/v8/internal/pool.NewConnPool D:/Program Files (x86)/Go/bin/pkg/mod/github.com/go-redis/redis/v8@v8.11.5/internal/pool/pool.go:111 +0x242 goroutine 85 [chan receive]: go-study/models.sendProc(0x12e40cf0) D:/go/go-study/models/Message.go:88 +0x48 created by go-study/models.Chat D:/go/go-study/models/Message.go:79 +0x30d goroutine 86 [IO wait]: internal/poll.runtime_pollWait(0x33340b00, 0x72) D:/Program Files (x86)/Go/src/runtime/netpoll.go:305 +0x52 internal/poll.(*pollDesc).wait(0x138f60f4, 0x72, 0x0) D:/Program Files (x86)/Go/src/internal/poll/fd_poll_runtime.go:84 +0x37 internal/poll.execIO(0x138f6014, 0xa365e0) D:/Program Files (x86)/Go/src/internal/poll/fd_windows.go:175 +0xfc internal/poll.(*FD).Read(0x138f6000, {0x12f41000, 0x1000, 0x1000}) D:/Program Files (x86)/Go/src/internal/poll/fd_windows.go:441 +0x13b net.(*netFD).Read(0x138f6000, {0x12f41000, 0x1000, 0x1000}) D:/Program Files (x86)/Go/src/net/fd_posix.go:55 +0x3f net.(*conn).Read(0x12c0aa68, {0x12f41000, 0x1000, 0x1000}) D:/Program Files (x86)/Go/src/net/net.go:183 +0x4f bufio.(*Reader).fill(0x12d1eae0) D:/Program Files (x86)/Go/src/bufio/bufio.go:106 +0xe9 bufio.(*Reader).Peek(0x12d1eae0, 0x2) D:/Program Files (x86)/Go/src/bufio/bufio.go:144 +0x6d github.com/gorilla/websocket.(*Conn).read(0x12f68000, 0x2) D:/Program Files (x86)/Go/bin/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:371 +0x30 github.com/gorilla/websocket.(*Conn).advanceFrame(0x12f68000) D:/Program Files (x86)/Go/bin/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:809 +0xae github.com/gorilla/websocket.(*Conn).NextReader(0x12f68000) D:/Program Files (x86)/Go/bin/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:1009 +0xb5 github.com/gorilla/websocket.(*Conn).ReadMessage(0x12f68000) D:/Program Files (x86)/Go/bin/pkg/mod/github.com/gorilla/websocket@v1.5.0/conn.go:1093 +0x25 go-study/models.recvProc(0x12e40cf0) D:/go/go-study/models/Message.go:100 +0x105 created by go-study/models.Chat D:/go/go-study/models/Message.go:81 +0x352
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值