function Select($sql)
	{
		$this->RequireConnection(true);
		$this->Observe("DataAdapter ($this->_label) (DataAdapter.Select) " . $sql, OBSERVE_QUERY);
		
		try
		{
			$rs = $this->_driver->Query($this->_dbconn,$sql);
			$this->_num_retries = 0;
		}
		catch (Exception $ex)
		{
			// retry one time a communication error occurs
			if ($this->_num_retries == 0 && DataAdapter::$RETRY_ON_COMMUNICATION_ERROR && $this->IsCommunicationError($ex))
			{
				$this->_num_retries++;
				$this->Observe("DataAdapter ($this->_label) Communication error.  Retry attempt " . $this->_num_retries, OBSERVE_WARN);
				sleep(2); // slight delay to prevent throttling
				return $this->Select($sql);
			}
			
			$msg = "DataAdapter ($this->_label)" . ' Error Selecting SQL: ' . $ex->getMessage() . ' (retry attempts: '.$this->_num_retries.')';
			
			$this->Observe($msg,OBSERVE_FATAL);
			throw new Exception($msg,$ex->getCode());
		}
		
		return $rs;
	}