2016-03-09 5 views
1

Для решения проблемы упомянуто here.Использование нескольких соединений db вызывает блокировку

Мы создаем и используем 2 одинаковых соединения JDBC Singleton (обычный, прокси).

  • Но при этом мы сталкиваемся с тупиком, когда пытаемся использовать оба соединения последовательно в одной таблице для выполнения нескольких вставок и обновлений.
  • Когда это произойдет, я не могу запускать какие-либо запросы из инструмента БД (Aqua Data Studio).
  • Мое предположение заключается в том, что он бесконечно ждет другого соединения для блокировки замка.

Примечание: Мы не имеем дело с многопоточными здесь.

Выпуск:

// Auto Commit false 
// Singelton 
Connection connection = getConnection(); //same   

// Auto Commit true 
// // Singelton 
Connection proxyConnection= getConnection(); //same 

PreparedStatement ps = null; 

try{ 
    connection.setAutoCommit(false); 

    //Step 1 
    String sql = getQuery(); 
    ps = proxyConnection.prepareStatement(sql); 
    ps.executeUpdate();   
    . 
    . 
    //Step 2 
    // if I don't execute this step everything works fine. 
    sql = getTransctionQuery();    
    ps = connection.prepareStatement(sql); 
    ps.executeUpdate(); 

    . 
    . 
    //Step 3 
    sql = getQuery(); 
    ps = proxyConnection.prepareStatement(sql); 
    ps.executeUpdate(); // this line never completes (if Step 2 runs) 

}catch(){ 
    connection.rollback(); //Doesn’t rollback step 1 and understandably step 2. 
} 
finally{ 
    connection.close(); //cleanup code 
    proxyConnection.close(); 
} 

Вопрос:

  • Как решить эту проблему?
  • Как убедиться, что разные соединения, хотя они создаются с использованием одного и того же загрузчика классов, не будут блокировать базу данных/таблицу.

Благодаря

+1

Использование двух соединений - это ИМО, не очень хорошая идея. Поведение ожидается, если шаг 3 изменяет данные, заблокированные на шаге 2. Я думаю, вам нужно что-то вроде * автономной транзакции * в Oracle - посмотрите, [[это] (http://stackoverflow.com/questions/26866521/autonomous-transactions-in -sybase-ase-15-5). –

+0

@up Я полностью согласен. Было бы полезно использовать два соединения, если потребуется получить данные из двух разных баз данных. – FilMiOs

+0

@MarmiteBomber Я согласен, но потом, как решить проблему, упомянутую здесь http://stackoverflow.com/questions/35800951/jdbc-transaction-control-in-sybase – SRJ

ответ

0

Я не эксперт здесь, но у меня были проблемы с БД Oracle при выполнении запроса, а затем забыть совершить (или отменить). Поэтому я думаю, что тот факт, что вы не зафиксировали после шага 2, блокирует базу данных для следующего доступа.

+0

Я не хочу совершать после шага 2. Я хочу совершить после шага 3, чтобы сделать мой откат для регулярного соединения. – SRJ

 Смежные вопросы

  • Нет связанных вопросов^_^