2016-05-12 19 views
0

サーブレット、JSP、およびスレッドを使用するWebアプリケーションがあります。これはMultiThreadedアプリケーションです。 JDK1.8、Wildflyサーバー8.2を使用します.JNDIデータソースを使用して接続オブジェクトを取得するために、以下に示すようにContextListenerを作成しました。接続プールを使用して接続を取得する正しい方法ですか?サーブレットとスレッドを持つWildfly接続プール

AppContextListener.java

public class AppContextListener implements ServletContextListener 
{ 

    /* (non-Javadoc)  
    * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)  
    */  
    @Override  
    public void contextDestroyed(ServletContextEvent servletContextEvent) 
    {   
    ServletContext ctx = servletContextEvent.getServletContext(); 
    DBConnectionManager dbManager = (DBConnectionManager)ctx.getAttribute("DBManager");  
    dbManager.closeConnection(); 
    } 

    /* (non-Javadoc) 
    * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) 
    */ 
    @Override 
    public void contextInitialized(ServletContextEvent servletContextEvent) 
    { 
    ServletContext ctx = servletContextEvent.getServletContext(); 
    String jndiName = ctx.getInitParameter("JNDI"); 

    //create database connection from context parameters and set it to context 
    DBConnectionManager dbManager = new DBConnectionManager(jndiName); 
    ctx.setAttribute("DBManager", dbManager); 
    } 
} 

DBConnectionManager.java

public class DBConnectionManager 
{ 
    private static Logger logger=Logger.getLogger(DBConnectionManager.class); 
    private static Connection conn; 
    private String jndiName; 

    public DBConnectionManager(String jndiName) { 
    this.jndiName = jndiName; 
    try { 
     Context ctx = new InitialContext(); 
     DataSource ds = (DataSource) ctx.lookup(this.jndiName); 
     conn = ds.getConnection(); 
     conn.setAutoCommit(false); 
    } catch (NamingException | SQLException e) { 
     logger.error("[DBConnectionManager.DBConnectionManager]Exception: "+e.getMessage()); 
    }  
    } 

    public static Connection getConnection(){ 
    return conn; 
    } 

    public void closeConnection(){ 
    if(conn != null){ 
     try { 
      conn.close(); 
     } catch (SQLException e) { 
      logger.error("[DBConnectionManager.closeConnection]Exception: "+e.getMessage()); 
     } 
    } 
    } 
} 

私は、静的メソッドのgetConnection()を呼び出し、接続オブジェクトを必要とするたびに。私はこの方法でConnectionプールを達成していないようです。どのように接続プールを達成するために接続を取得する必要がありますか?

私のサーバーは12時間以上稼働しています。メッセージを再読み込みしようとすると、テーブルシステムによって、スレッドの原因となっている以下の例外がスローされます。これをどうすれば解決できますか?サーバーログに

TxConnectionListener:380 - IJ000305: Connection error occured: org[email protected]bed9492[state=NORMAL managed conn[email protected]5df6b58b connection handles=1 lastUse=1462985106208 trackByTx=false [email protected]1299562a [email protected][pool=RDTSDS] [email protected][connectionListener=bed9492 connectionManager=f7fbabb warned=false currentXid=null productName=Oracle productVersion=Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options jndiName=java:jboss/RDTSDS] txSync=null] 
javax.resource.spi.ResourceAdapterInternalException: Unexpected error 
    at org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.broadcastConnectionError(BaseWrapperManagedConnection.java:644) 
    at org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.connectionError(BaseWrapperManagedConnection.java:610) 
    at org.jboss.jca.adapters.jdbc.WrappedConnection.checkException(WrappedConnection.java:1640) 
    at org.jboss.jca.adapters.jdbc.WrappedStatement.checkException(WrappedStatement.java:1267) 
    at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:467) 
    at com.ctsu.rdts.beans.ReconcileInfo.getNextMessage(ReconcileInfo.java:493) 
    at com.ctsu.rdts.beans.GroupInfo.sendMessage(GroupInfo.java:818) 
    at com.ctsu.rdts.app.GroupSendThread.send(GroupSendThread.java:114) 
    at com.ctsu.rdts.app.GroupSendThread.run(GroupSendThread.java:68) 
Caused by: java.lang.ThreadDeath 
    at java.lang.Thread.stop(Thread.java:850) 
    at com.ctsu.rdts.app.HttpDequeue.stopThread(HttpDequeue.java:944) 
    at com.ctsu.rdts.app.HttpDequeue.clearLocks(HttpDequeue.java:418) 
    at com.ctsu.rdts.app.HttpDequeue.run(HttpDequeue.java:404) 

例外:

WARN [org.jboss.as.connector.subsystems.datasources.AbstractDataSourceService$WildFlyLocalMCF] (NRG) Queued thread: ECOG-ACRIN: java.lang.Throwable: Queued thread: ECOG-ACRIN 
    at sun.misc.Unsafe.park(Native Method) [rt.jar:1.8.0_66] 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) [rt.jar:1.8.0_66] 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836) [rt.jar:1.8.0_66] 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870) [rt.jar:1.8.0_66] 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199) [rt.jar:1.8.0_66] 
    at java.util.concurrent.locks.ReentrantLock$FairSync.lock(ReentrantLock.java:224) [rt.jar:1.8.0_66] 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285) [rt.jar:1.8.0_66] 
    at org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.lock(BaseWrapperManagedConnection.java:373) 
    at org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.tryLock(BaseWrapperManagedConnection.java:388) 
    at org.jboss.jca.adapters.jdbc.WrappedConnection.lock(WrappedConnection.java:147) 
    at org.jboss.jca.adapters.jdbc.WrappedConnection.prepareCall(WrappedConnection.java:589) 

Iは15日以来、この問題で立ち往生しています。誰かがこの問題を解決するために私を助けることができますか?

答えて

0

はあなたにこの部分のコードHttpDequeueとスレッドの実装を確認してください、あなたはのThreadDeathのインスタンスは、被害者となるスレッド内でスローされThread.stopの()の実装https://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

Caused by: java.lang.ThreadDeath 
    at java.lang.Thread.stop(Thread.java:850) 
    at com.ctsu.rdts.app.HttpDequeue.stopThread(HttpDequeue.java:944) 
    at com.ctsu.rdts.app.HttpDequeue.clearLocks(HttpDequeue.java:418) 
    at com.ctsu.rdts.app.HttpDequeue.run(HttpDequeue.java:404) 

を置き換えるために、このガイドを使用することができます (非推奨)のThread.stop()メソッドが呼び出されたとき。

アプリケーションは、非同期で終了した後に をクリーンアップする必要がある場合にのみ、このクラスのインスタンスをキャッチする必要があります。 ThreadDeathがメソッドによってキャッチされた である場合、 スレッドが実際に消滅するように再スローされることが重要です。

ThreadDeathが決してキャッチされない場合、トップレベルエラーハンドラはメッセージを出力しません。