<acronym id="cr5pu"></acronym>
  • <kbd id="cr5pu"><font id="cr5pu"></font></kbd>
  • <li id="cr5pu"><output id="cr5pu"></output></li>
    <del id="cr5pu"><li id="cr5pu"></li></del><center id="cr5pu"></center>
    <output id="cr5pu"><kbd id="cr5pu"></kbd></output>
  • <rp id="cr5pu"></rp>
    <var id="cr5pu"></var>
  • <nav id="cr5pu"></nav>
  • 上善若水
    In general the OO style is to use a lot of little objects with a lot of little methods that give us a lot of plug points for overriding and variation. To do is to be -Nietzsche, To bei is to do -Kant, Do be do be do -Sinatra
    posts - 146,comments - 147,trackbacks - 0

    最近一直在搗鼓HBase的項目,之前寫了一些代碼從數據庫加載數據到HBase,所有的代碼都跑得好好地,然而今天嘗試著換了一個數據庫,就跑不通了。通過數據工具,可以發現連接沒有問題,而且有部分邏輯很順利通過了,然而有一些就是卡主了,通過jstack打印出來的信息可以找到這樣的堆棧:

    "runner{object-loader#292}-objecthandler" #323 prio=5 os_prio=0 tid=0x00002aaadc5ec800 nid=0x7f62 in Object.wait() [0x0000000056ce4000]
       java.lang.Thread.State: WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            at java.lang.Object.wait(Object.java:502)
            at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1104)
            - locked <0x00000007736013e8> (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:1044)
            at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
            at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
    所以開始我懷疑是連接的問題,從網上也找到了一個類型的現象,有人懷疑是DBPC的一個bug導致死鎖:http://stackoverflow.com/questions/5714511/deadlock-issue-in-dbcp-deployed-on-tomcat,所以我升級了DBCP版本1.4,然而和這人一樣的結果,升級DBCP版本并沒有解決問題。簡單的看DBCP的代碼,都開始懷疑是不是因為沒有Spring JdbcTemplate沒有正確的把Connection返回回去引起泄漏了,然而也有點感覺不太可能,因為這段代碼在其他數據庫都跑得好好地,但是我們的數據庫版本都是一致的,然而其他配置上也被假設一致了(被忽略的一個重要的點)。

    后來開始調配置,減少連接數,減少線程數,經過各種組合,發現當把DB讀的batch降到1的時候就可以work了,非常詭異的一個問題。從數據工具中查到,如果用batch,得到的SQL是:
    SELECT <column>, <column> FROM <table> where iid in (@p0, @p1)
    如果是batch是1的話:
    SELECT <column>, <column> FROM <table> where iid in (@p0)
    這段SQL語句是這么產生的:
    DataSource dataSource = ....
    this.jdbc = new NamedParameterJdbcTemplate(dataSource);
    ...
    MapSqlParameterSource parameters = new MapSqlParameterSource();
    parameters.addValue("params", paramsMap.keySet());
    jdbc.query("SELECT <columns> FROM <table> where <column> in (:params)";, parameters, new ResultSetExtractor<Void>() {
    ....
    })

    如果是一個batch的話,在jstack堆棧中可以看到它一直在等數據庫的返回結果:
    "runner{object-loader#16}-objecthandler" #47 prio=5 os_prio=0 tid=0x0000000006ddd800 nid=0x2694 runnable [0x0000000045434000]
       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.sybase.jdbc3.timedio.RawDbio.reallyRead(Unknown Source)
            at com.sybase.jdbc3.timedio.Dbio.doRead(Unknown Source)
            at com.sybase.jdbc3.timedio.InStreamMgr.a(Unknown Source)
            at com.sybase.jdbc3.timedio.InStreamMgr.doRead(Unknown Source)
            at com.sybase.jdbc3.tds.TdsProtocolContext.getChunk(Unknown Source)
    這也解釋了第一個堆棧一直停在borrowObject(getConnection)的階段,因為之前所有的Connection都在數據庫堵住沒有返回,所以這個線程再拿Connection的時候超過了我設置的最大Connection數,所以就等著拿不到Connection。

    在后來查了一下不同數據庫的JDBC Driver信息(sp_version):
    jConnect (TM) for JDBC(TM)/7.07 ESD #4 (Build 26793)/P/EBF20302/JDK 1.6.0/jdbcmain/OPT/Thu Jul  5 22:08:44 PDT 2012
    jConnect (TM) for JDBC(TM)/1000/Wed Mar 11 05:01:24 2015 PDT

    也就是說這種用法是因為舊的JDBC Driver對NamedParameterJdbcTemplate不完善引起的,這個坑花了我一整天的時間。。。。
    posted on 2015-11-11 18:46 DLevin 閱讀(6454) 評論(0)  編輯  收藏 所屬分類: Database

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    久久一级片
    <acronym id="cr5pu"></acronym>
  • <kbd id="cr5pu"><font id="cr5pu"></font></kbd>
  • <li id="cr5pu"><output id="cr5pu"></output></li>
    <del id="cr5pu"><li id="cr5pu"></li></del><center id="cr5pu"></center>
    <output id="cr5pu"><kbd id="cr5pu"></kbd></output>
  • <rp id="cr5pu"></rp>
    <var id="cr5pu"></var>
  • <nav id="cr5pu"></nav>