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

Proč musím při každém novém nasazení vyprázdnit fond připojení?

Vaše hlavní příčina, PoolingException: javax.resource.spi.LocalTransactionException: Communications link failure souvisí s touto chybou Glassfish , který vysvětluje (na kartě komentářů dole), že možná budete muset obnovit svá neplatná připojení.

Komentář k chybě od Jagadish říká, že je třeba zkontrolovat typ ověření připojení. Pokud je nastaveno na "autocommit" (výchozí nastavení), ovladače JDBC mohou ukládat data předchozího ověření připojení do mezipaměti a během budoucích ověření připojení nedojde k žádné skutečné interakci s databází.

Chcete-li problém vyřešit, nastavte connection-validation-method="table" a validation-table-name="any_table_you_know_exists" (nahraďte any_table_you_know_exists s názvem jakékoli existující tabulky). Tím vynutíte připojení mluvit s databází namísto mezipaměti; pokud je připojení neplatné, bude zrušeno a znovu vytvořeno. Možná budete muset zadat také is-connection-validation-required="true" .

Články, které vám pomohou s další konfigurací:

  1. Tento článek také podrobně vysvětluje problém.
  2. Článek na blogu Jagadish's Oracle na toto téma má více informací.
  3. Článek podrobně vysvětluje validaci připojení Glassfish JDBC.

Text z blogu Jagadish:

AS_INSTALL_ROOT/bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.is-connection-validation-required=true
domain.resources.jdbc-connection-pool.DerbyPool.is-connection-validation-required = true

AS_INSTALL_ROOT/bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.connection-validation-method=table
domain.resources.jdbc-connection-pool.DerbyPool.connection-validation-method = table

bin/asadmin set domain.resources.jdbc-connection-pool.DerbyPool.validation-table-name=sys.systables
domain.resources.jdbc-connection-pool.DerbyPool.validation-table-name = sys.systables

Všimněte si, že ukázkový kód odkazuje na sys.systables , což je tabulka MS SQL, která zaručeně existuje. Pro Oracle viz garantovaná tabulka dual . Pro MySQL vytvořte tabulku s jedním sloupcem pouze pro účely ověření; hrajte na jistotu a předvyplňte tabulku vložením jednoho řádku dat.



  1. Vložit příkaz, který před vložením kontroluje duplicitu

  2. Vyberte * z tabulky, kde datum =dnes

  3. Řádek aktualizace Android SQLite nefunguje

  4. Jak získat ekvivalent ResultSetMetaData bez ResultSet