3
回答
druid连接池求大神帮忙!get/close not same thread db.executeQuery: Error
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

错误代码如下,这个是我用jmeter发送http请求,2个线程间隔10秒的时候,发现tomcat一直报下边的错误,但是连接池重新请求还是可以的,请大神们给看看:

2013-12-25 08:38:42:INFO http-8083-1 com.alibaba.druid.pool.DruidDataSource - {d
ataSource-1} inited
2013-12-25 08:38:47:WARN http-8083-2 com.alibaba.druid.pool.DruidDataSource - ge
t/close not same thread
db.executeQuery:  Error
db.executeQuery:  Error
2013-12-25 08:38:47:WARN http-8083-2 com.alibaba.druid.pool.DruidDataSource - ge
t/close not same thread
db.executeQuery:  Error
2013-12-25 08:38:48:WARN http-8083-1 com.alibaba.druid.pool.DruidDataSource - ge
t/close not same thread
db.executeQuery:  Error
2013-12-25 08:38:48:WARN http-8083-1 com.alibaba.druid.pool.DruidDataSource - ge
t/close not same thread
db.executeQuery:  Error
2013-12-25 08:38:48:WARN http-8083-1 com.alibaba.druid.pool.DruidDataSource - ge
t/close not same thread
db.executeQuery:  Error
2013-12-25 08:38:48:WARN http-8083-1 com.alibaba.druid.pool.DruidDataSource - ge
t/close not same thread
2013-12-25 08:38:48:WARN http-8083-2 com.alibaba.druid.pool.DruidDataSource - ge
t/close not same thread
db.executeQuery:  Error

连接池用的是druid的jndi连接方式

      DruidDataSource ds = (DruidDataSource)ctx.lookup("java:comp/env/"+jndiPath);
      if(ds != null){ conn = ds.getConnection();}


下边是请求的方法源代码:

public Map getff() {
ResultSet rs = null;

Map<String, List<Map<String, String>>> map = new HashMap<String, List<Map<String, String>>>();
List<Map<String, String>> BaseInfo = new ArrayList<Map<String, String>>();
String sql = "SELECT * FROM csb";

try {
rs = d.executeQuery(sql);
while (rs != null && rs.next()) {
Map<String, String> row = new HashMap<String, String>();
row.put("id", rs.getString("A")==null?"":rs.getString("A"));
row.put("name", rs.getString("B")==null?"":rs.getString("B"));
BaseInfo.add(row);
}
} catch (SQLException e) {
e.printStackTrace();
}
map.put("pdjsx", BaseInfo);

return map;
}

数据库查询方法executeQuery

  public RowSet executeQuery(String sql) throws SQLException {
 OracleCachedRowSet ors=null;
  DBTransContext db = new DB();
  conn = db.getConnection();
    try {
      stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                  ResultSet.CONCUR_READ_ONLY);
       rs = stmt.executeQuery(sql);
       ors = new OracleCachedRowSet();
       ors.populate(rs);
    } 
    catch (Exception ex) {
      System.err.println("db.executeQuery:  " + ex.getMessage());
    }finally {
    db.close(rs,stmt,conn);
      }
    return ors;
  }

在jmeter设置为1个线程访问的时候,tomcat是正常的,但设置成两个线程之后就会报上边的错误!求大神指导!

举报
共有3个答案 最后回答: 4年前
不要在不同线程中传递Connection对象
--- 共有 2 条评论 ---
能不说就不说谢谢@wenshao的回答,我查了一下,现在给方法加了一个同步锁synchronized,tomcat请求都正常了,也没有错误了!这样就只能有一个线程可以访问这个方法,如果某个请求数据量大,不知道这样会不会慢或者影响的下一个请求它? 4年前 回复
能不说就不说 DBTransContext db = new DB();   conn = db.getConnection(); 我查询方法里边这个conn每次都是重新获取的连接!另一个线程用也是这样吧?我代码里边有问题吗? 4年前 回复
跨线程使用连接了?
--- 共有 1 条评论 ---
能不说就不说貌似是,我用jmeter单纯的一个线程请求的时候,一点问题都没有,但是一改成两个线程以上,就不断的报上边的错误,还报“内部错误”,就是没找出问题,请指点下,谢谢! 4年前 回复
为啥要跨线程使用连接?
--- 共有 1 条评论 ---
能不说就不说不好意思,刚学java不久,这个地方还有点不懂,能不能给指点下跨线程的概念?我每次请求都获取到连接,用完之后把它close,这样多个线程的时候请求多次,然后关闭不就可以么? 4年前 回复
顶部