ConcurrentHashMap实现数据库连接的问题求助

  1. private ConcurrentHashMap<String,FutureTask<Connection>>connectionPool = new ConcurrentHashMap<String, FutureTask<Connection>>();
  2. public Connection getConnection(String key) throws Exception{
  3. FutureTask<Connection>connectionTask=connectionPool.get(key);
  4. if(connectionTask!=null){
  5. return connectionTask.get();
  6. }
  7. else{
  8. Callable<Connection> callable = new Callable<Connection>(){
  9. @Override
  10. public Connection call() throws Exception {
  11. // TODO Auto-generated method stub
  12. return createConnection();
  13. }
  14. };
  15. FutureTask<Connection>newTask = new FutureTask<Connection>(callable);
  16. connectionTask = connectionPool.putIfAbsent(key, newTask);
  17. if(connectionTask==null){
  18. connectionTask = newTask;
  19. connectionTask.run();
  20. }
  21. return connectionTask.get();
  22. }
  23. }
  24. //创建Connection
  25. private Connection createConnection(){
  26. return null;
  27. }


  28. 这是在网上看到的一段 ConcurrentHashMap实现数据库连接的代码,发现有个问题:
  29. 就是在线程A、B同时执行获取数据库连接的方法时,如果线程A执行完17行,返回null,说明它是首个存入该key的线程,但是不幸的是A线程因为某些原因此时突然挂掉了。线程B执行到17行时发现此时已经有线程存入了key,connectionTask不为null,则直接跳到22行去get数据库连接,但是因为线程A没有执行完创建连接,所以线程B就一直阻塞在get方法上。请各位大神看看是不是存在这个问题,如果存在,如何更好的解决?
#Java工程师#
全部评论
存在这个问题,解决办法是   1 调用get的等待方法,如下,设置成1秒,如果1秒没有结果直接报错,然后处理一下catch逻辑就行, 防止长时间堵塞。 try {             connectionTask.get(1000, TimeUnit.MILLISECONDS);         } catch (InterruptedException e) {             e.printStackTrace();         } catch (ExecutionException e) {             e.printStackTrace();         } catch (TimeoutException e) {             e.printStackTrace();         }
点赞 回复 分享
发布于 2018-01-15 15:59

相关推荐

Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务