1 21 package net.sf.hajdbc.balancer; 22 23 import java.util.Collection ; 24 import java.util.HashSet ; 25 import java.util.LinkedList ; 26 import java.util.Queue ; 27 import java.util.Set ; 28 29 import net.sf.hajdbc.Database; 30 31 35 public class RoundRobinBalancer extends AbstractBalancer 36 { 37 private Set <Database> databaseSet = new HashSet <Database>(); 38 private Queue <Database> databaseQueue = new LinkedList <Database>(); 39 40 43 @Override 44 protected Collection <Database> getDatabases() 45 { 46 return this.databaseSet; 47 } 48 49 52 @Override 53 public synchronized boolean add(Database database) 54 { 55 boolean added = super.add(database); 56 57 if (added) 58 { 59 int weight = database.getWeight(); 60 61 for (int i = 0; i < weight; ++i) 62 { 63 this.databaseQueue.add(database); 64 } 65 } 66 67 return added; 68 } 69 70 73 @Override 74 public synchronized boolean remove(Database database) 75 { 76 boolean removed = super.remove(database); 77 78 if (removed) 79 { 80 int weight = database.getWeight(); 81 82 for (int i = 0; i < weight; ++i) 83 { 84 this.databaseQueue.remove(database); 85 } 86 } 87 88 return removed; 89 } 90 91 94 @Override 95 public synchronized Database first() 96 { 97 return (this.databaseQueue.isEmpty()) ? super.first() : this.databaseQueue.element(); 98 } 99 100 103 public synchronized Database next() 104 { 105 if (this.databaseQueue.isEmpty()) 106 { 107 return super.first(); 108 } 109 110 Database database = this.databaseQueue.remove(); 111 112 this.databaseQueue.add(database); 113 114 return database; 115 } 116 } 117 | Popular Tags |