2012-05-12 34 views
0

データベースリソースを共有するTomcatで2つのアプリケーションを実行しています。サイト1に何らかの種類の負荷があると、サイト1がハングします。下のようにserver.xmlファイルに共有リソースを宣言する際に問題がある場合は誰でも教えてください。または、さまざまな「最大」パラメータが問題になる可能性がありますか?Tomcat JDBC共有DBリソース

任意のヘルプ

ためのおかげで、私はJDBCを使用して、次のように私のserver.xmlファイルがあります。

<!-- site 1 --> 
    <Host name="siteone.co.uk" appBase="/var/www/siteone.co.uk" unpackWARs="true" autoDeploy="true"> 
    <Alias>www.siteone.co.uk</Alias> 
      <Context path="" docBase="htdocs" debug="0" reloadable="true" > 
       <Resource name="jdbc/siteone" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="-1" username="siteone_user" password="**********" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/siteone"/> 
      </Context> 
      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/www/siteone.co.uk/logs" prefix="tomcat_access_" suffix=".log" pattern="common" resolveHosts="false"/> 
    </Host> 

<!-- site 2 --> 
    <Host name="sitetwo.co.uk" appBase="/var/www/sitetwo.co.uk" unpackWARs="true" autoDeploy="true"> 
     <Context path="" docBase="htdocs" debug="0" reloadable="true"> 
      <Resource name="jdbc/sitetwo_db1" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="sitetwo_db1_user" password="**********" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/sitetwo_db1"/> 
      <Resource name="jdbc/sitetwo_db2" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="sitetwo_db2_user" password="**********" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/sitetwo_db2"/> 
      <Resource name="jdbc/siteone" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="siteone_user" password="**********" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/siteone"/> 
     </Context> 
     <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/www/sitetwo.co.uk/logs" prefix="tomcat_access_" suffix=".log" pattern="common" resolveHosts="false"/> 
    </Host> 

私は現在スレッドダンプを持っており、db接続への参照が多数含まれています。といった;

"TP-Processor30" daemon prio=10 tid=0x00007f6dd40ae000 nid=0x1ad4 in Object.wait()  [0x00007f6dd27b2000] 
    java.lang.Thread.State: WAITING (on object monitor) 
at java.lang.Object.wait(Native Method) 
- waiting on <0x00000000eeac1790> (a org.apache.commons.pool.impl.GenericObjectPool$Latch) 
at java.lang.Object.wait(Object.java:502) 
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1104) 
- locked <0x00000000eeac1790> (a org.apache.commons.pool.impl.GenericObjectPool$Latch) 
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) 
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:999) 
at htSql.SQLController.<init>(SQLController.java:43) 
at controllers.HomeControllerServlet.doGet(HomeControllerServlet.java:41) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190) 
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291) 
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769) 
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698) 
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891) 
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) 
at java.lang.Thread.run(Thread.java:636) 

私のSQLControllerクラスは、次のような接続ヘルパーファイルとして使用されます。

import java.sql.*; 
import javax.sql.*; 
import javax.naming.*; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

public class SQLController { 

private static Log _logger = LogFactory.getLog(SQLController.class); 

private static Statement statement = null; 
private static Connection connection; 
private ResultSet rs = null; 
private static InitialContext ctx; 
private static DataSource ds; 

static{ 

    _logger.fatal("SQLController : 'static' called..."); 

    try{ 
     ctx = new InitialContext(); 
     ds = (DataSource) ctx.lookup("java:comp/env/jdbc/****************"); 
    } 
    catch(Exception e){ 
     _logger.fatal("Error creating InitialContext..."); 
     _logger.fatal(e); 
     _logger.fatal(e.getMessage()); 
    } 

} 

public SQLController(){ 

    _logger.fatal("SQLController : 'constructor' called..."); 

    try{ 

     if(ctx == null){ 
      _logger.fatal("No DB Context"); 
     } 
     if(ds != null){ 
      connection = ds.getConnection(); 
      statement = connection.createStatement(); 
     } 
    } 
    catch(Exception e){ 
     _logger.fatal(e); 
     _logger.fatal(e.getMessage()); 
    } 

} 

public void insert(String sql) throws Exception{ 

    statement.execute(sql);  
} 

public ResultSet select(String sql) throws Exception{ 

rs = statement.executeQuery(sql); 
    return rs; 

} 

public void close(){ 

    try{ 
     if(statement != null){ 
      statement.close(); 
     } 
     if(connection != null){ 
      connection.close(); 
     } 
     if(rs != null){ 
      rs.close(); 
     } 
    } 
    catch(Exception e){ 
     _logger.fatal(e); 
     _logger.fatal(e.getMessage()); 
    } 

} 
} 

私はdbの名前を削除しました。

この接続方法で何か外れているように見えますか?

ありがとう:

答えて

0

これらは個別のリソースとして扱われるため、独立している必要があります。ボトルネックがどこにあるかを調べるには、いくつかの掘り下げを行う必要がありますが、site1とsite2に別々のプールがあるため、接続プールの共有ではありません。

+0

ありがとうございます。あなたはこの質問に答える資格があるようです。私はなぜ私のsiteOneが凍結しているのかを知ることができず、siteTwoが使用されているときだけそうするように見えます。これは彼らが共有する唯一のリソースなので、私が考えることができる2つの間の唯一の関係です。どのような "掘り"と一緒に行く方法に関する任意のアイデア?ありがとう –

+0

スレッドダンプを開始するのに適しています。 3ダンプを10s離して比較してください。大量に移動したようには見えない要求を処理しているスレッドを探しています。 –

+0

ありがとう@マーク、私はそれをやります。乾杯 –