2017-03-16 50 views
0

我面臨的問題是,有時Web應用程序線程陷入java.net.SocketInputStream.socketRead0(本地方法)以進行數據庫操作我的應用服務器和數據庫服務器駐留在不同的虛擬機中。 請在下面找到JStackJava Web應用程序線程在java.net.SocketInputStream.socketRead0中陷入數據庫操作(Native Method)

"http-bio-9904-exec-10" #57 daemon prio=5 os_prio=0  tid=0x00007f1730007000 nid=0xfcd1 runnable [0x00007f171e6ee000] 
java.lang.Thread.State: RUNNABLE 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) 
at java.net.SocketInputStream.read(SocketInputStream.java:170) 
at java.net.SocketInputStream.read(SocketInputStream.java:141) 
at com.mysql.cj.core.io.ReadAheadInputStream.fill(ReadAheadInputStream.java:101) 
at com.mysql.cj.core.io.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:144) 
at com.mysql.cj.core.io.ReadAheadInputStream.read(ReadAheadInputStream.java:174) 
- locked <0x00000000f6a35bb8> (a com.mysql.cj.core.io.ReadAheadInputStream) 
at java.io.FilterInputStream.read(FilterInputStream.java:133) 
at com.mysql.cj.core.io.FullReadInputStream.readFully(FullReadInputStream.java:58) 
at com.mysql.cj.mysqla.io.SimplePacketReader.readHeader(SimplePacketReader.java:60) 
at com.mysql.cj.mysqla.io.TimeTrackingPacketReader.readHeader(TimeTrackingPacketReader.java:48) 
at com.mysql.cj.mysqla.io.MultiPacketReader.readHeader(MultiPacketReader.java:51) 
at com.mysql.cj.mysqla.io.MysqlaProtocol.readPacket(MysqlaProtocol.java:521) 
at com.mysql.cj.mysqla.io.MysqlaProtocol.checkErrorPacket(MysqlaProtocol.java:723) 
at com.mysql.cj.mysqla.io.MysqlaProtocol.sendCommand(MysqlaProtocol.java:662) 
at com.mysql.cj.mysqla.io.MysqlaProtocol.sqlQueryDirect(MysqlaProtocol.java:950) 
at com.mysql.cj.mysqla.MysqlaSession.sqlQueryDirect(MysqlaSession.java:431) 
at com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:1974) 
- locked <0x00000000f6a2ce30> (a com.mysql.cj.jdbc.ConnectionImpl) 
at com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:1936) 
at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:891) 
- locked <0x00000000f6a2ce30> (a com.mysql.cj.jdbc.ConnectionImpl) 
at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:795) 
. 
. 
. 
. 

我使用Tomcat 7.0.57和Tomcat作爲池池DB繼 是彙集配置

<Resource name="jdbc/xyz" auth="Container" 
type="javax.sql.DataSource"  
maxTotal="100" 
maxIdle="30"  
factory= "com.XXX.tomcat.jndi.EncryptedDataSourceFactory"    

maxWaitMillis="10000" 
username="abc" password="abcdef" 
driverClassName="com.mysql.jdbc.Driver"  
url="jdbc:mysql://x.y.z.w:3306/some_db" 
testOnBorrow="true" validationQuery="SELECT 1"> 
</Resource> 

我在DB服務器檢查(mysql的34年6月5日)在常規日誌中,發現查詢在幾分鐘後到達DB服務器(在5-20分鐘之間變化)。 有時查詢(包括插入/選擇)以秒爲單位執行。

在應用程序級別的TCP轉儲中,也顯示了延遲5-20分鐘的結果。

一些觀察結果: 有一個5-10分鐘的時間段,其中如果請求被觸發,響應在15分鐘後獲得,並且在5-10分鐘之後,所有查詢將在下一個30 -40分鐘。

使用的Mysql驅動程序是5.1.0。

請幫我確定可能是什麼問題。

回答

0

Atlast我得到了問題。面對類似問題的人可以試一試。 它是我的網絡中的防火牆的結果。我使用連接池設置解決了這個問題。 最終的游泳池配置讓它起作用。

<Resource name="jdbc/xxx" 
    auth="Container" 
    type="javax.sql.DataSource" 
    factory="com.yyy.tomcat.jndi.EncryptedDataSourceFactory" 
    username="xyz" 
    password="abc" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://x.x.x.x:3306/abc?enableQueryTimeouts=true&amp;autoReconnect=true&amp;autoReconnectForPools=true" 
    initialSize="0" 
    maxTotal="100" 
    maxActive="100" 
    minIdle="0" 
    maxWait="1000" 
    testOnBorrow="true" 
    testWhileIdle="true" 
    validationQuery="SELECT 1" 
    validationInterval="30000" 
    validationQueryTimeout="1" 
    timeBetweenEvictionRunsMillis="30000" 
    minEvictableIdleTimeMillis="30000" 
    removeAbandonedTimeout="10" 
    removeAbandoned="true" 
    logAbandoned="true" 
    logValidationErrors="true" 
    connectionProperties="[enableQueryTimeouts=true]" 
    jdbcInterceptors="ConnectionState;QueryTimeoutInterceptor(queryTimeout=1);SlowQueryReport;ResetAbandonedTimer"> 
相關問題