2016-05-12 14 views
0

Wir haben eine Web-Anwendung, die Servlets, JSPs und Threads verwendet, die eine Multithread-Anwendung ist. Wir verwenden JDK1.8, Wildfly-Server 8.2. Ich habe einen ContextListener wie unten gezeigt erstellt, um das Verbindungsobjekt mithilfe der JNDI-Datenquelle zu erhalten. Ist das die richtige Art, die Verbindung über den Verbindungspool zu erhalten?Wildfly Verbindungspool mit Servlets & Themen

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()); 
     } 
    } 
    } 
} 

Wenn ich ein Verbindungsobjekt benötigen nenne ich die statische Methode getConnection(). Scheint, dass ich Verbindungspool auf diese Weise nicht erreiche. Wie sollte ich die Verbindung erhalten, um Verbindungspool zu erreichen?

Mein Server wird für mehr als 12 Stunden laufen und wenn ich versuche, die Nachrichten-Tischsystem neu zu laden gesendet werden die folgenden Ausnahmen auslösen, die zu Threads verursacht durch. Wie kann ich das lösen?

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) 

Ausnahme in Server-Protokoll:

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) 

Ich bin seit 15 Tagen in dieser Frage stecken. Kann mir jemand helfen, dieses Problem zu lösen?

Antwort

0

Überprüfen Sie Code in diesem Teil HttpDequeue und der Thread-Implementierung können Sie diese Anleitung verwenden, um die Thread.stop() -Implementierung 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) 

Eine Instanz von Thread zu ersetzen in der Opfer-Thread geworfen wenn die (veraltet) Thread.stop() -Methode aufgerufen wird.

Eine Anwendung sollte Instanzen dieser Klasse nur abfangen, wenn sie aufräumen muss, nachdem sie asynchron beendet wurde. Wenn Thread durch ein Verfahren gefangen wird, ist es wichtig, dass es erneut ausgelöst werden, so dass die Fäden tatsächlich sterben.

Die Top-Level-Fehler-Handler auszudrucken keine Nachricht, wenn Thread nie gefangen.