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

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务