sql >> Databáze >  >> RDS >> Mysql

Nakonfigurujte fond připojení GlassFish JDBC pro zvládnutí převzetí služeb při selhání Amazon RDS Multi-AZ

Jak jsem již uvedl dříve, je to proto, že sokety, které jsou otevřené a připojené k databázi, si neuvědomují, že spojení bylo ztraceno, takže zůstali připojeni, dokud se nespustí časový limit soketu OS, což může být obvykle asi 30 minut. .

Chcete-li problém vyřešit, musíte přepsat časový limit soketu ve vašem připojovacím řetězci JDBC nebo v konfiguraci/vlastnostech připojení JDNI a definovat socketTimeout param na kratší čas.

Mějte na paměti, že jakékoli připojení delší než definovaná hodnota bude ukončeno, i když je používáno (nemohl jsem to potvrdit, četl jsem).

Další dva parametry, které zmiňuji ve svém komentáři, jsou connectTimeout a automatické opětovné připojení .

Zde je můj připojovací řetězec JDBC:

jdbc:(...)&connectTimeout=15000&socketTimeout=60000&autoReconnect=true 

Také jsem deaktivoval mezipaměť DNS v Javě provedením

 java.security.Security.setProperty("networkaddress.cache.ttl" , "0"); 
 java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0"); 

Dělám to proto, že Java nerespektuje TTL, a když dojde k převzetí služeb při selhání, DNS je stejné, ale IP se změní.

Vzhledem k tomu, že používáte aplikační server, musí být parametry pro deaktivaci mezipaměti DNS předány JVM při spouštění glassfish pomocí -Dnet a nikoli samotné aplikaci.




  1. PostgreSQL použije hodnotu z předchozího řádku, pokud chybí

  2. Uložená procedura k odstranění duplicitních záznamů v tabulce SQL

  3. Použití RegEx v SQL Server

  4. Normalizace v MYSQL