I was trying to setup Connection Pooling on an existing MFC based application.
The backend is Oracle and I used CRecordset to get access to the data.
I followed an article on the Codeguru website..
http://www.codeguru.com/Cpp/data/mfc_database/odbc/article.php/c1149/
I followed the steps written in it ( listed below), but, I have questions about how to accomplish 3 of them....
done. 1. Create (or download) the CDatabase-derived class, and add it to your Project
done. 2. Create a member of the CDatabase-derived class in your CWinApp-derived (Application) class
done. 3. Create a SQLHANDLE data member in your Application class for the Enviroment Handle
??.. 4. Add an accessor function that returns the address of the CDatabase-derived member you added in the previous step
??.. 5. Make the necessary SQLSetEnvAttr(...) and SQLAllocHandle(...) calls as specified above
done. 6. Initially open your CDatabase-derived object (if you are using SQL Authentication)
?? 7. Whenever you instantiate a CRecordset-derived object, pass the address of the CDatabase-derived class into its constructor
First of all,
1) If this is one of the better ways to accomplish Connection pooling, please advise on how to complete this based on code snippets below.
2)If there's another way of doing this (I have 20 tables), please step through. I cant say I'm good at this and any help is greatly appreciated.
Here's my code in snippets from different files.
----------- CCPDatabase class.. as is from article.Wrapper class across CDatabase
class CCPDatabase : public CDatabase
{
public:
/**/ CCPDatabase()
{
};
//
// Code Is Copied From CDatabase Source Code...
//
virtual BOOL OpenEx( LPCTSTR lpszConnectString, DWORD dwOptions = 0 )
{
dwOptions |= noOdbcDialog; // Force NoDialog
.....
.....
}
}
--------------------------
----------
----------
----------
----------
--
-----------------MyWinApp Class
::InitInstance
{
// Setup the Connection Pool
// m_shSQLEnv Is A SQLHANDLE Member That Must Be Freed When Your
// Application Terminated
//
SQLRETURN srRetCode = 0;
srRetCode = SQLSetEnvAttr( NULL, SQL_ATTR_CONNECTION_POOLIN
G,
(SQLPOINTER)SQL_CP_ONE_PER
_DRIVER, 0 ); // Enable Connection Pooling
srRetCode = SQLAllocHandle( SQL_HANDLE_ENV, NULL, &m_shSQLEnv ); // Get Global Handle
// End setup of Connection Pool
// **************************
**********
**********
**********
********
// Calling the CDatabase Open function for the first and ONLY time
// **************************
**********
**********
**********
********
if( !m_shPDB.IsOpen( ) &&
!m_shPDB.OpenEx( NULL ) )
return FALSE;
// **********return false on fail**********************
**********
***
}
--------------------------
----------
----------
----------
----------
----------
----------
----------
----------
---------
--------------------------
-- One of my CRecordsets.CPP file
// DetailSet.cpp : implementation file
//
#include "stdafx.h"
#include "MyWinApp.h"
#include "DetailSet.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////
//////////
//////////
//////////
//////////
//////////
/
// CDetailSet
IMPLEMENT_DYNAMIC(CDetailS
et, CRecordset)
CDetailSet::CDetailSet(CCP
Database* pDatabase)
: CRecordset(pDatabase)
{
//{{AFX_FIELD_INIT(CDetail
Set)
m_Item = _T("");
m_Seq = 0;
m_Description = _T("");
m_FeatureCode = _T("");
m_RecordType = _T("");
m_ORDERNO = _T("");
m_nFields = 6;
//}}AFX_FIELD_INIT
m_nDefaultType = dynaset;
}
CString CDetailSet::GetDefaultConn
ect()
{
return _T("ODBC;DSN=OraTest;UID=u
ser10;PWD=
password1"
);
}
CString CDetailSet::GetDefaultSQL(
)
{
return _T("[SC_FRAMES].[SC_FRMSCH
_DETAIL]")
;
}
void CDetailSet::DoFieldExchang
e(CFieldEx
change* pFX)
{
......
}
//////////////////////////
//////////
//////////
//////////
//////////
//////////
/
// CDetailSet diagnostics
#ifdef _DEBUG
void CDetailSet::AssertValid() const
{
CRecordset::AssertValid();
}
void CDetailSet::Dump(CDumpCont
ext& dc) const
{
CRecordset::Dump(dc);
}
#endif //_DEBUG
--------------------------
----------
----------
----------
----------
----------
----------
----------
-------
--------------------------
----Record
set.h
#if !defined(AFX_DETAILSET_H__
AD149183_5
16C_11D2_8
176_006097
9C789B__IN
CLUDED_)
#define AFX_DETAILSET_H__AD149183_
516C_11D2_
8176_00609
79C789B__I
NCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
// DetailSet.h : header file
//
//////////////////////////
//////////
//////////
//////////
//////////
//////////
/
// CDetailSet recordset
class CDetailSet : public CRecordset
{
public:
CDetailSet(CCPDatabase* pDatabase = &((CFrameSchedApp *)AfxGetApp())->m_shPDB);
DECLARE_DYNAMIC(CDetailSet
)
// Field/Param Data
//{{AFX_FIELD(CDetailSet, CRecordset)
...........
//}}AFX_FIELD
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDetailSet
)
public:
virtual CString GetDefaultConnect(); // Default connection string
virtual CString GetDefaultSQL(); // Default SQL for Recordset
virtual void DoFieldExchange(CFieldExch
ange* pFX); // RFX support
//}}AFX_VIRTUAL
// Implementation
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_DETAILSET_H__
AD149183_5
16C_11D2_8
176_006097
9C789B__IN
CLUDED_)
--------------------------
----------
----------
----------
----------
----------
----------
----------
----------
----------
--------
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnmdac/html/pooling2.asp
if your database has a monitoring utility or analyzer, you could use that to see how many connections are being made