2011-10-18 370 views
15

私はGlassfishを介してリモートMySQLサーバーに正常に接続しましたが、コードまたはXHTMLファイルを変更するたびにGlassfishの管理者パネルを開き、接続プールをフラッシュする必要があります。ページをリフレッシュするとエラーが発生します。誰かがこれを経験しましたか?コードやその他の情報が必要な場合に投稿することができます。再デプロイするたびに接続プールをフラッシュする必要があるのはなぜですか?

HTTPステータス500 -

この要求を満たすからそれを を防止タイプ例外レポート

メッセージ

DESCRIPTIONTHEサーバ内部エラーが発生しました()。

例外

javax.servlet.ServletException:WELD-000049 [方法] @PostConstruct公共com.myapp.QuestionController.initialize()[email protected]

に呼び出すことができません

根本原因

org.jboss.weld.exceptions.WeldException:WELD-000049 [方法]を呼び出すことができませんが上の)パブリック com.myapp.interfaces.QuestionController.initializeを(@PostConstruct [email protected]

根本原因

にjava.lang.reflect.InvocationTargetException

根本原因

にjavax.ejb.EJBException

根本原因

javax.persistence.PersistenceException:例外[EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException内部 例外:java.sql.SQLException:接続の割り当て中にエラーが発生しました。 原因:java.lang.RuntimeException: XAResource.start中のガットの例外:エラーコード:0

根本原因

例外[EclipseLinkの-4002](Eclipseの永続性サービス - 2.3.0.v20110604-r9504 ):org.eclipse.persistence.exceptions.DatabaseException内部 例外:java.sql.SQLException:接続の割り当て中にエラーが発生しました。 原因:java.lang.RuntimeException: XAResource.start中のガットの例外:エラーコード:0

根本原因

ます。java.sql.SQLException:接続を割り当てるでエラーが発生しました。原因: java.lang.RuntimeException:XAResource中に例外が発生しました。開始:

根本原因

javax.resource.spi.ResourceAllocationException:エラーを 接続を割り当てるに。原因:java.lang.RuntimeException: XAResource.start中のガットの例外:

根本原因

com.sun.appserv.connectors.internal.api.PoolingException: java.lang.RuntimeException:ガットの例外中XAResource.start:

根本原因

com.sun.appserv.connectors.internal.api.PoolingException: java.lang.RuntimeException:XAResource.start中にガットの例外:

根本原因

java.lang.RuntimeException:XAResource.start中にガットの例外: com.sun.appserv.connectors.internal:

javax.transaction.xa.XAExceptionの

根本的な原因。 api.PoolingException: javax.resource.spi.LocalTransactionException:通信リンク 失敗

成功し、サーバから受信した最後のパケットが435409 millisecoましたnds前。サーバーに最後に送信されたパケットは、7ミリ秒前に でした。サーバー名、URL、ユーザー名とパスワードを:私はちょうど設定したGlassfishの接続プールの設定で、 "追加のプロパティ" で

Image of config

永続XML

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="SertifikatPU" transaction-type="JTA"> 
     <jta-data-source>jdbc/sertifikatdb</jta-data-source> 
    </persistence-unit> 
</persistence> 


私はOracleでのものと同様、自分のデュアルテーブルを作ったこの問題に

enter image description here

を解決しました。

CREATE TABLE dual 
(
    x VARCHAR(1) 
); 

INSERT INTO dual(x) VALUES('y'); 
+0

非トランザクション接続、トランザクションの隔離:,分離レベル: - >これらは、取引の下でグループ化され、それらのいずれか? – LuckyLuke

+0

どのように接続を取得していますか?そのため、この例外が発生する可能性があります。また、接続プールの設定は何ですか。 – r0ast3d

+0

接続はどこかに保持されていますか?もっと多くの情報を追加することができます...また、リモートサーバー上で、クライアントと接続の数の構成は何ですか? – r0ast3d

答えて

20

あなたは無効な接続をリフレッシュする必要があるかもしれません(下部の[コメント]タブで)説明しPoolingException: javax.resource.spi.LocalTransactionException: Communications link failurethis Glassfish bugに関連しているあなたの根本的な原因、、。

さんによるバグのコメントJagadishは、接続の検証タイプを確認しています。 「自動コミット」(デフォルト)に設定されている場合、JDBCドライバは以前の接続検証データをキャッシュすることがあり、将来の接続検証中に実際のデータベースとのやり取りは行われません。

この問題を解決するには、connection-validation-method="table"validation-table-name="any_table_you_know_exists"any_table_you_know_existsを既存のテーブルの名前に置き換えます)を設定します。これにより、接続はキャッシュの代わりにデータベースと通信します。接続が無効な場合は、接続が切断されて再作成されます。 is-connection-validation-required="true"も指定する必要があります。追加の設定を支援する

記事:

  1. This articleも詳細に問題を説明します。
  2. Jagadish's Oracle Blog Articleこのトピックの詳細情報があります。
  3. Article Glassfish JDBC接続検証について詳しく説明しています。ジャガディッシュのブログから

テキスト:サンプルコードが存在することが保証されてMS SQLテーブルである、sys.systablesを指していること

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 

注意。 Oracleの場合は、保証表dualを参照してください。 MySQLの場合、妥当性確認の目的でのみ1列テーブルを作成します。それを安全に再生し、1行のデータを挿入してテーブルをあらかじめ入力します。

+0

ありがとうございました。私はこれを初めて熟知しているので、これを設定する場所にちょっとした助けが必要なだけかもしれません。私はlocalhost:4848 - > JDBC接続プール - >接続を選択 - >高度なタブに行きました。あなたが話していたconnection-validation-methodが見つかりました。また、接続検証が必要です。しかし、検証テーブル名は表示されません。 – LuckyLuke

+0

また、[この記事(http://blogs.oracle.com/JagadishPrasath/entry/connection_validation_in_glassfish_jdbc)]を参照してください。どうやら、これは私が以前触れた同じJagadish(彼のブログ!)によって書かれており、失敗したときに更新するために 'fail-all-connections'を使うことを示唆しています。 [Here](http://alexandru-ersenie.com/2011/03/01/glassfish-jdbc-connection-validation-explained/)は、glassfishのJDBC接続検証を詳細に説明する第2の記事です。どちらも優れた読み物です! – JoshDM

+0

あなたの 'domain.xml'にはあなたの接続プールのXMLコードはどのように見えますか?私はそれが私が提案したプロパティを設定する場所だと信じています。 – JoshDM

1

このドライバを使用してください。

com.mysql.jdbc.jdbc2.optional.MysqlXADataSource 

私はあなたが添付された画像から別のドライバを使用していることがわかり ...

関連する問題