

# Evitar a fixação de um RDS Proxy
<a name="rds-proxy-pinning"></a>

 A multiplexação é mais eficiente quando as solicitações de banco de dados não dependem de informações de estado de solicitações anteriores. Nesse caso, o proxy do RDS pode reutilizar uma conexão na conclusão de cada transação. Exemplos de tais informações de estado incluem a maioria das variáveis e parâmetros de configuração que você pode alterar por meio de instruções `SET` ou `SELECT`. Por padrão, as transações SQL em uma conexão de cliente podem multiplexar entre conexões de banco de dados subjacentes. 

 Suas conexões com o proxy podem entrar em um estado conhecido como *fixação*. Quando uma conexão é fixada, cada transação posterior usa a mesma conexão de banco de dados subjacente até que a sessão termine. Outras conexões de cliente também não podem reutilizar essa conexão de banco de dados até que a sessão termine. A sessão termina quando a conexão do cliente é descartada. 

 O proxy do RDS automaticamente fixa uma conexão de cliente a uma conexão de banco de dados específica quando detecta uma alteração no estado de sessão que não é apropriada para outras sessões. A fixação reduz a eficácia da reutilização de conexões. Se todas ou quase todas as suas conexões forem fixadas, considere modificar o código da aplicação ou a workload para reduzir as condições que provocam a fixação. 

Por exemplo, a aplicação altera uma variável de sessão ou um parâmetro de configuração. Nesse caso, as declarações posteriores poderão contar que a nova variável ou parâmetro estará em vigor. Assim, quando o proxy do RDS processa solicitações para alterar variáveis ou definições da configuração da sessão, ele fixa essa sessão para a conexão com o banco de dados. Dessa forma, o estado da sessão permanece em vigor para todas as transações posteriores na mesma sessão. 

 Em alguns mecanismos de banco de dados, essa regra não se aplica a todos os parâmetros que você pode definir. O proxy do RDS monitora determinadas instruções e variáveis. Portanto, o RDS Proxy não fixa a sessão quando você as modifica. Nesse caso, o proxy do RDS apenas reutiliza a conexão para outras sessões que tenham os mesmos valores para essas configurações. Para obter detalhes sobre o que o RDS Proxy monitora para um mecanismo de banco de dados, consulte o seguinte: 
+ [O que o RDS Proxy monitora para bancos de dados do RDS para SQL Server](#rds-proxy-pinning.sql-server-tracked-vars)
+ [O que o RDS Proxy monitora para bancos de dados do RDS para MariaDB e o RDS para MySQL](#rds-proxy-pinning.mysql-tracked-vars)

## O que o RDS Proxy monitora para bancos de dados do RDS para SQL Server
<a name="rds-proxy-pinning.sql-server-tracked-vars"></a>

O RDS Proxy monitora as seguintes instruções do SQL Server:
+ `USE`
+ `SET ANSI_NULLS`
+ `SET ANSI_PADDING`
+ `SET ANSI_WARNINGS`
+ `SET ARITHABORT`
+ `SET CONCAT_NULL_YIELDS_NULL`
+ `SET CURSOR_CLOSE_ON_COMMIT`
+ `SET DATEFIRST`
+ `SET DATEFORMAT`
+ `SET LANGUAGE`
+ `SET LOCK_TIMEOUT`
+ `SET NUMERIC_ROUNDABORT`
+ `SET QUOTED_IDENTIFIER`
+ `SET TEXTSIZE`
+ `SET TRANSACTION ISOLATION LEVEL`

## O que o RDS Proxy monitora para bancos de dados do RDS para MariaDB e o RDS para MySQL
<a name="rds-proxy-pinning.mysql-tracked-vars"></a>

O RDS Proxy monitora as seguintes instruções do MariaDB e do MySQL:
+ DROP DATABASE
+ DROP SCHEMA
+ USE

O RDS Proxy monitora as seguintes variáveis do MySQL e do MariaDB:
+ `AUTOCOMMIT`
+ `AUTO_INCREMENT_INCREMENT`
+ `CHARACTER SET (or CHAR SET)`
+ `CHARACTER_SET_CLIENT`
+ `CHARACTER_SET_DATABASE`
+ `CHARACTER_SET_FILESYSTEM`
+ `CHARACTER_SET_CONNECTION`
+ `CHARACTER_SET_RESULTS`
+ `CHARACTER_SET_SERVER`
+ `COLLATION_CONNECTION`
+ `COLLATION_DATABASE`
+ `COLLATION_SERVER`
+ `INTERACTIVE_TIMEOUT`
+ `NAMES`
+ `NET_WRITE_TIMEOUT`
+ `QUERY_CACHE_TYPE`
+ `SESSION_TRACK_SCHEMA`
+ `SQL_MODE`
+ `TIME_ZONE`
+ `TRANSACTION_ISOLATION (or TX_ISOLATION)`
+ `TRANSACTION_READ_ONLY (or TX_READ_ONLY)`
+ `WAIT_TIMEOUT`

**nota**  
O RDS Proxy rastreia as alterações nas variáveis `TRANSACTION_ISOLATION` e `TRANSACTION_READ_ONLY` quando você as define no escopo da sessão. No entanto, se você defini-las no escopo da próxima transação, o RDS Proxy fixará as conexões. Esse comportamento se aplica independentemente de você usar uma instrução `SET` ou uma instrução `SET TRANSACTION` para configurar esses valores.

## Reduzir a fixação
<a name="rds-proxy-pinning.minimizing"></a>

 O ajuste de performance do proxy do RDS envolve a tentativa de maximizar a reutilização de conexões em nível de transação (multiplexação) minimizando a fixação. 

É possível reduzir a fixação da seguinte maneira: 
+  Evite solicitações de banco de dados desnecessárias que podem causar fixação. 
+  Defina variáveis e definições de configuração de forma consistente em todas as conexões. Dessa forma, as sessões posteriores têm mais probabilidade de reutilizar conexões que têm essas configurações específicas. 

   No entanto, para a configuração do PostgreSQL, uma variável leva à fixação da sessão. 
+  Para um banco de dados da família de mecanismos do MySQL, aplique um filtro de fixação de sessão ao proxy. Você pode isentar certos tipos de operações de fixar a sessão se souber que isso não afeta o funcionamento correto da aplicação. 
+  Veja com que frequência a fixação ocorre monitorando a métrica `DatabaseConnectionsCurrentlySessionPinned` do Amazon CloudWatch. Para obter informações sobre essa e outras métricas do CloudWatch, consulte [Monitorar métricas do proxy do RDS com o Amazon CloudWatchMonitorar o proxy do RDS com o CloudWatch](rds-proxy.monitoring.md). 
+  Se você usar instruções `SET` para executar uma inicialização idêntica para cada conexão de cliente, poderá fazê-lo enquanto preserva a multiplexação no nível de transação. Nesse caso, você move as instruções que configuram o estado da sessão inicial para a consulta de inicialização usada por um proxy. Esta propriedade é uma string que contém uma ou mais instruções SQL, separadas por ponto e vírgula. 

   Por exemplo, você pode definir uma consulta de inicialização para um proxy que define determinados parâmetros de configuração. O proxy do RDS aplica essas configurações sempre que configura uma nova conexão para esse proxy. Você pode remover as instruções `SET` correspondentes do código de sua aplicação, para que elas não interfiram na multiplexação em nível de transação. 

   Para ver métricas sobre a frequência com que a fixação ocorre para um proxy, consulte [Monitorar métricas do proxy do RDS com o Amazon CloudWatchMonitorar o proxy do RDS com o CloudWatch](rds-proxy.monitoring.md). 

## Condições que causam fixação para todas as famílias de mecanismos
<a name="rds-proxy-pinning.all"></a>

 O proxy fixa a sessão à conexão atual nas seguintes situações em que a multiplexação pode causar um comportamento inesperado: 
+ Qualquer instrução com um tamanho de texto maior do que 16 KB faz com que o proxy fixe a sessão.

## Condições que podem causar fixação no RDS para Microsoft SQL Server
<a name="rds-proxy-pinning.sqlserver"></a>

 Para o RDS para SQL Server, as seguintes interações também geram fixação: 
+ Utilizando vários conjuntos de resultados ativos (MARS). Para obter informações sobre MARS, consulte a documentação do [SQL Server](https://docs.microsoft.com/en-us/sql/relational-databases/native-client/features/using-multiple-active-result-sets-mars?view=sql-server-ver16).
+ Utilizando a comunicação do coordenador de transações distribuídas (DTC).
+ Criando tabelas temporárias, transações, cursores ou declarações preparadas.
+ Usando as seguintes declarações `SET`:
  + `SET ANSI_DEFAULTS`
  + `SET ANSI_NULL_DFLT`
  + `SET ARITHIGNORE`
  + `SET DEADLOCK_PRIORITY`
  + `SET FIPS_FLAGGER`
  + `SET FMTONLY`
  + `SET FORCEPLAN`
  + `SET IDENTITY_INSERT`
  + `SET NOCOUNT`
  + `SET NOEXEC`
  + `SET OFFSETS`
  + `SET PARSEONLY`
  + `SET QUERY_GOVERNOR_COST_LIMIT`
  + `SET REMOTE_PROC_TRANSACTIONS`
  + `SET ROWCOUNT`
  + `SET SHOWPLAN_ALL`, `SHOWPLAN_TEXT`, e `SHOWPLAN_XML`
  + `SET STATISTICS`
  + `SET XACT_ABORT`

## Condições que causam fixação no RDS para MariaDB e RDS para MySQL
<a name="rds-proxy-pinning.mysql"></a>

 Para o MySQL e o MariaDB, as seguintes interações também podem causar fixação: 
+ As instruções explícitas de bloqueio de tabela `LOCK TABLE`, `LOCK TABLES` ou `FLUSH TABLES WITH READ LOCK` fazem com que o proxy fixe a sessão. 
+ A criação de bloqueios nomeados usando `GET_LOCK` faz com que o proxy fixe a sessão. 
+ Definir uma variável de usuário ou sistema (com algumas exceções) fixa a sessão ao proxy. Se isso limitar significativamente a reutilização da conexão, você poderá configurar as operações `SET` para evitar a fixação. Para fazer isso, ajuste a propriedade de filtros de fixação de sessão. Para obter mais informações, consulte [Criar um proxy para o Amazon RDS](rds-proxy-creating.md) e [Modificar um RDS Proxy](rds-proxy-modifying-proxy.md).
+ A criação de uma tabela temporária faz com que o proxy fixe a sessão. Dessa forma, o conteúdo da tabela temporária é preservado durante toda a sessão, independentemente dos limites de transação. 
+ A chamada das funções `ROW_COUNT` e `FOUND_ROWS` às vezes causa fixação. 
+ As instruções preparadas fazem com que o proxy fixe a sessão. Essa regra se aplicará se a instrução preparada usar texto SQL ou o protocolo binário. 
+ O RDS Proxy não fixa conexões quando você usa SET LOCAL.
+ A chamada de procedimentos armazenados e de funções armazenadas não causa fixação. O proxy do RDS não detecta nenhuma alteração de estado de sessão resultante dessas chamadas. Verifique se a aplicação não altera o estado da sessão dentro de rotinas armazenadas se você confia nesse estado de sessão para persistir entre transações. Por exemplo, no momento, o proxy do RDS não é compatível com um procedimento armazenado que cria uma tabela temporária que persiste em todas as transações. 
+ Consultas com comentários executáveis para MySQL (sintaxe /\$1\$1 ... \$1/) ou MariaDB (sintaxe /\$1M\$1 ... \$1/) causam fixação. O RDS Proxy não pode analisar o SQL incorporado nesses comentários para rastrear alterações no estado da sessão.

 Se você tiver conhecimento especializado sobre o comportamento da aplicação, poderá ignorar o comportamento de fixação de determinadas instruções da aplicação. Para fazer isso, escolha a opção **Filtros de fixação de sessão** ao criar o proxy. Atualmente, é possível cancelar a fixação de sessão para definir variáveis de sessão e configurações. 

## Condições que causam fixação no RDS para PostgreSQL
<a name="rds-proxy-pinning.postgres"></a>

 Para o PostgreSQL, as seguintes interações também geram a fixação: 
+  Usar comandos `SET`.
+  Usar comandos `PREPARE`, `DISCARD`, `DEALLOCATE` ou `EXECUTE` para gerenciar instruções preparadas.
+  Criar sequências, tabelas ou visualizações temporárias.
+  Declarar cursores.
+  Descartar o estado da sessão.
+  Escutar em um canal de notificação.
+  Carregar um módulo de biblioteca, como `auto_explain`.
+  Manipular sequências usando funções como `nextval` e `setval`.
+  Interagir com bloqueios usando funções como `pg_advisory_lock` e `pg_try_advisory_lock`. 
**nota**  
O RDS Proxy não fixa bloqueios consultivos em nível de transação, especificamente `pg_advisory_xact_lock`, `pg_advisory_xact_lock_shared`, `pg_try_advisory_xact_lock` e `pg_try_advisory_xact_lock_shared`.
+ Definir ou redefinir um parâmetro como o padrão. Especificamente, usar comandos `SET` e `set_config` para atribuir valores padrão às variáveis da sessão.
+ A chamada de procedimentos armazenados e de funções armazenadas não causa fixação. O proxy do RDS não detecta nenhuma alteração de estado de sessão resultante dessas chamadas. Verifique se a aplicação não altera o estado da sessão dentro de rotinas armazenadas se você confia nesse estado de sessão para persistir entre transações. Por exemplo, no momento, o proxy do RDS não é compatível com um procedimento armazenado que cria uma tabela temporária que persiste em todas as transações. 
+ Descartar estado da sessão. Se você usar bibliotecas de pool de conexões com a consulta `DISCARD ALL` configurada como uma consulta de redefinição, o RDS Proxy fixará sua conexão de cliente na liberação. Isso reduz a eficiência da multiplexação do proxy e pode levar a resultados inesperados, pois o comando `DISCARD ALL` pode interferir no gerenciamento do estado da sessão.