[unixODBC-dev] A discussion about unixODBC programming model

xiaonan xn212516 at 163.com
Thu Nov 20 02:40:05 GMT 2014


Hi Nick,

	Now our project uses unixODBC like this:
	
	(1) Use connection pool:
	/usr/local/etc/odbcinst.ini
	[ODBC]
	Trace=No
	Pooling=Yes
	
	(2) When program initiates, allocate a global environment handle:
	SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &g_env_handle));
	
	(3) Encapsulate a SQL operation function:
	sql_func()
	{
		/* Allocate connection handle */
		SQLAllocHandle(SQL_HANDLE_DBC, g_env_handle, &conn_handle);
		/* Connect database */
		SQLConnect(conn_handle, ...);
		
		/* Allocate statement handle */
		SQLAllocHandle(SQL_HANDLE_STMT, conn_handle, &stmt_handle);
		/* Execute statement */
		SQLExecDirect(stmt_handle, ...);
		/* Free statement handle */
		SQLFreeHandle(SQL_HANDLE_STMT, stmt_handle);
		
		/* Disconnect database */
		SQLDisconnect(conn_handle);
		/* Free connection handle */
		SQLFreeHandle(SQL_HANDLE_DBC, conn_handle);
	}
	
	So all the SQL related operations will be executed through this sql_func.


	This encapsulate is easy and clear, but now I consider whether this will lead low efficiency. Because every SQL operation will allocate connection handle, connect database (although the connection pool is used), allocate statement handle, free handles, etc.
	
	So I consider whether I can do like this:
	(1) This is the same as now: still use connection pool.
	
	(2) When program initiates, except the global environment handle, I still allocate a connection handle pool:
	create_connection_handle_pool()
	{
		for (...)
		{
			/* Allocate connection handle */
			SQLAllocHandle(SQL_HANDLE_DBC, g_env_handle, &conn_handle);
			/* Connect database */
			SQLConnect(conn_handle, ...);
		}
	}
	
	(3) So the SQL operation function can be:
	sql_func()
	{
		select a connection handle from connection handle pool;
		
		/* Allocate statement handle */
		SQLAllocHandle(SQL_HANDLE_STMT, conn_handle, &stmt_handle);
		/* Execute statement */
		SQLExecDirect(stmt_handle, ...);
		/* Free statement handle */
		SQLFreeHandle(SQL_HANDLE_STMT, stmt_handle);
		
	}
	
	This will not allocate connection handle and connect database every time. So I think this will improve efficiency.
	
	Nick, could you help to comment on this idea? Such as if it is worth to create a connection handle pool? Is there any risk of implementing this? 

        Thanks very much in advance!
	
Best Regards
Nan Xiao


More information about the unixODBC-dev mailing list