最˜q‘一直在æ£é¼“HBase的项目,之å‰å†™äº†ä¸€äº›ä»£ç 从数æ®åº“åŠ è½½æ•°æ®åˆ°HBaseåQŒæ‰€æœ‰çš„代ç 都跑得好好地åQŒç„¶è€Œä»Šå¤©å°è¯•ç€æ¢äº†ä¸€ä¸ªæ•°æ®åº“åQŒå°±è·‘ä¸é€šäº†ã€‚通过数æ®å·¥å…·åQŒå¯ä»¥å‘现连接没有问题,而且有部分逻辑很顺利通过了,然而有一些就是å¡ä¸ÖMº†åQŒé€šè¿‡jstack打å°å‡ºæ¥çš„ä¿¡æ¯å¯ä»¥æ‰¾åˆ°è¿™æ ïL(f¨¥ng)š„å †æ ˆåQ?/span>"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)
所以开始我怀疑是˜qžæŽ¥çš„问题,从网上也扑ֈ°äº†ä¸€ä¸ªç±»åž‹çš„现象åQŒæœ‰äººæ€€ç–‘是DBPC的一个bug坯D‡´æ»é”åQšhttp://stackoverflow.com/questions/5714511/deadlock-issue-in-dbcp-deployed-on-tomcatåQŒæ‰€ä»¥æˆ‘å‡çñ”了DBCP版本1.4åQŒç„¶è€Œå’Œ˜q™äh一æ ïL(f¨¥ng)š„¾l“æžœåQŒå‡¾U§DBCP版本òq¶æ²¡æœ‰è§£å†³é—®é¢˜ã€‚简å•的看DBCP的代ç ï¼Œéƒ½å¼€å§‹æ€€ç–‘æ˜¯ä¸æ˜¯å› äØ“æ²¡æœ‰Spring JdbcTemplate没有æ£ç¡®çš„æŠŠConnection˜q”回回去引è“v泄æ¼äº†ï¼Œç„¶è€Œä¹Ÿæœ‰ç‚¹æ„Ÿè§‰ä¸å¤ªå¯èƒ½åQŒå› 䏸™¿™ŒDµä»£ç 在其他数æ®åº“都跑得好好圎ͼŒä½†æ˜¯æˆ‘们的数æ®åº“版本都是一致的åQŒç„¶è€Œå…¶ä»–é…¾|®ä¸Šä¹Ÿè¢«å‡è®¾ä¸€è‡´äº†åQˆè¢«å¿½ç•¥çš„一个é‡è¦çš„点)ã€?br />
åŽæ¥å¼€å§‹è°ƒé…ç½®åQŒå‡ž®‘连接数åQŒå‡ž®‘线½E‹æ•°åQŒç»˜q‡å„¿U组åˆï¼Œå‘现当把DBè¯Èš„batché™åˆ°1的时候就å¯ä»¥work了,éžå¸¸è¯¡å¼‚的一个问题。从数æ®å·¥å…·ä¸æŸ¥åˆŽÍ¼Œå¦‚果用batchåQŒå¾—到的SQLæ˜?
SELECT <column>, <column> FROM <table> where iid in (@p0, @p1

)
如果是batchæ˜?çš„è¯åQ?br />SELECT <column>, <column> FROM <table> where iid in (@p0)
˜q™æ®µSQLè¯å¥æ˜¯è¿™ä¹ˆäñ”生的åQ?br />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çš„è¯åQŒåœ¨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)
˜q™ä¹Ÿè§£é‡Šäº†ç¬¬ä¸€ä¸ªå †æ ˆä¸€ç›´åœåœ¨borrowObject(getConnection)的阶ŒDµï¼Œå› 䨓之剿‰€æœ‰çš„Connection都在数æ®åº“å µä½æ²¡æœ‰è¿”回,所以这个线½E‹å†æ‹¿Connection的时候超˜q‡äº†æˆ‘设¾|®çš„æœ€å¤§Connection敎ͼŒæ‰€ä»¥å°±½{‰ç€æ‹¿ä¸åˆ°Connectionã€?br />
åœ¨åŽæ¥æŸ¥äº†ä¸€ä¸‹ä¸åŒæ•°æ®åº“çš„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
也就是说˜q™ç§ç”¨æ³•æ˜¯å› ä¸ºæ—§çš„JDBC Driver对NamedParameterJdbcTemplateä¸å®Œå–„引èµïL(f¨¥ng)š„åQŒè¿™ä¸ªå‘èŠ×ƒº†æˆ‘一整天的时间。。。ã€?img src ="http://www.aygfsteel.com/DLevin/aggbug/428149.html" width = "1" height = "1" />
]]>