У меня возникают некоторые проблемы с параллелизмом в моем веб-приложении, где выполняется запись в БД, а также могут быть одновременные чтения. При записи сначала удаляются все строки, а затем вставляются новые, поэтому есть вероятность, что чтение будет выполняться, когда база данных пуста, что приведет к ошибке. Я использую ReentrantReadWriteLock, но хочу убедиться, что использую его правильно. Любые исправления будут оценены.
private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public static Schedule lookupSchedule()
{
lock.readLock().lock();
try
{
// read data from the database, manipulate it, return it
}
finally
{
lock.readLock().unlock();
}
}
public static void setSchedule()
{
Connection conn = DB.getConnection();
lock.writeLock.lock();
try
{
conn.openTransaction();
// delete all the rows from the table
// insert all the new rows into the table
conn.committTransaction();
}
catch (Exception ex)
{
conn.rollbackTransaction();
}
finally
{
lock.writeLock.unlock();
}
}
lookupSchedule()
блокировку чтения, а затем, прежде чем он получит соединение с базой данных, группа писателей может захватить все соединения с базой данных, а затем заблокировать блокировку записи, что приведет к взаимоблокировке. - person azurefrog   schedule 21.05.2014setSchedule
чтение не происходит, что, в свою очередь, означает, чтоlookupSchedule
никогда не должен видеть пустую таблицу (если толькоsetSchedule
не вставляет строки). Что-то кроме блокировки не совсем то... - person vanOekel   schedule 22.05.2014