У меня есть DAOClass, который вызывается из многих Threads, как показано ниже для вставки в набор таблиц -Java поточно DAO
public class DAOClass
{
private HashMap<String, HelperClass> insertBuffer;
public DAOClass()
{
insertBuffer = new HashMap<String, HelperClass>();
}
public int[] createSomeTable(String key, SomeTableRecord someTableRecord)
{
List<SomeTableRecord> someTableRecList;
HelperClass buf = insertBuffer.get(key);
if (buf == null)
{
buf = new HelperClass();
insertBuffer.put(key, buf);
}
someTableRecList = buf.getSomeTableBuffer();
someTableRecList.add(someTableRecord);
if(someTableRecList.size() >= Global.limit())
{
return flushSomeTableInsertCache(key);
}
else
{
return null;
}
}
public int[] flushSomeTableInsertCache(String key)
{
HelperClass buf = insertBuffer.get(key);
int[] retVal = null;
if (buf != null && buf.getSomeTableBuffer() != null)
{
retVal = createSomeTableBuffered(buf.getSomeTableBuffer());
buf.getSomeTableBuffer().clear();
}
return retVal;
}
}
public int[] createSomeTableBuffered(final List<SomeTableRecord> someTableRecordList)
{
INSERT QUERY GOES HERE from LIST..
}
}
Различные темы называют createSomeTable метод, который добавляет к ArrayList из в вспомогательном классе. Существует HashMap, но ключ перекрывается то есть то же ключ поражен несколько потоков одновременно, тем самым развращает Hashmap и несвоевременные промывки ..
Вспомогательного класс следующим образом -
class HelperClass {
private String key;
private ArrayList<SomeTableRecord> someTableBuffer;
private ArrayList<SomeTable1Record> someTable1Buffer;
HelperClass() {
someTableBuffer = new ArrayList<SomeTableRecord>();
someTable1Buffer = new ArrayList<SomeTable1Record>();
}
public ArrayList<SomeTableRecord> getSomeTableBuffer() {
return someTableBuffer;
}
public ArrayList<SomeTable1Record> getSomeTable1Buffer() {
return someTable1Buffer;
}
}
Но это, видимо, не поточно поскольку ключ не является непересекающимся. Можете ли вы предложить некоторую коррекцию в классах, чтобы она была потоковой.
Кто называет 'flushSomeTableInsertCache()' тот же поток, который вставил элементы, или другой 'Thread'? – gaborsch
@GaborSch: Я думаю, что поток, который превысил ограничение кэша: 'if (someTableRecList.size()> = Global.limit())' ... – home
Thnaks, я пропустил эту строку ... обновил ответ соответственно – gaborsch