Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > synchronize


Автор: DEMOVERSION 28.10.2005, 14:53
Скажите правильно ли зделана synchronize-ция? Надо ли мне вообше ее? Надо синхронизуровать всю ф-цию?
Спасибо!

Код

public boolean deleteClass(int classID) {
     int result = 0;
     String  sql = "DELETE FROM ObjectValues Where ObjectRef IN (SELECT Object.ID FROM Object Where Object.classRef = " + classID + ");";
      result = executeUpdateSQL(sql);
             sql = "DELETE FROM Object Where Object.classRef = " + classID + ";";
      result += executeUpdateSQL(sql);
             sql = "DELETE FROM ClassAttributes Where classRef = " + classID + ";";
      result += executeUpdateSQL(sql);
             sql = "DELETE FROM Class Where ID = " + classID + ";";
      result += executeUpdateSQL(sql);
      commit("deleteClass");
     System.out.println("Deleted class " + result);
     return result!=0;
    }
public synchronized int executeUpdateSQL(String sql) {
        int result = 0;
        Connection cConnection = null;
        Statement sStatement = null;
        try {
        cConnection = getConnection();
        sStatement = cConnection.createStatement();
        result = sStatement.executeUpdate(sql);
        if (sStatement!=null)
        sStatement.close();
        sStatement = null;
        if (cConnection!=null)
        cConnection.close();
        cConnection = null;
        }
        catch (SQLException ex) {
            System.out.println(getConstantByName("dataBaseExecuteSQL") + sql);
            result = 0;
            ex.printStackTrace();
        }
        finally {
            try {
            if (sStatement!=null) sStatement.close();
            if (cConnection!=null) cConnection.close();
            }
            catch (SQLException ex) {
                System.out.println("Can't close Statement,Connection. [executeUpdateSQL]");
                ex.printStackTrace();
        }
       }
        return result;
    }

Автор: AntonSaburov 28.10.2005, 16:06
По идее все верно, только непонятно зачем. Если уж кто-то удалил, то второй запрос на удаление с тем же ИД просто ничего не удалит. Да и в случае использования SQL о целостности данных будет он заботится - незачем дергаться.

Автор: Souljah 28.10.2005, 16:36
имхо тут синхронизация вообще не нужна - ни один из приведенных методов не меняет состояние класса (поля)

Автор: pvo 28.10.2005, 17:03
DEMOVERSION
Насчет синхронизации - вроде она не нужна.

И вопрос насчет работы с базой - она транзакции поддерживает? Если да, то приведенный код странный.

Автор: val 28.10.2005, 17:23
Практически у любой современной базы данных все запросы к ней являются синхронизированными. Так что можно и не мучится, но идеологически все верно.

Автор: anonymouse 28.10.2005, 17:37
А я как обычно че-то не понял. Зачем синхронизовать если ети методы вызываются по порядку ? Синхронизация нужна только если метод будет вызываться из разных потоков.По этому идеологически это как раз написано не правильно.

Автор: Souljah 28.10.2005, 17:38
почему идеологически верно?
executeUpdateSQL не меняет состояние класса, у переменных scope - метод, они существуют только в контексте конкретного потока.
зачем синхронизировать?

Автор: AntonSaburov 28.10.2005, 18:33
Цитата(Souljah @ 28.10.2005, 17:38)
почему идеологически верно?

Идеологически не верно, здесь это не надо. Я имел в виду, что так конечно можно, только это напоминает в Москву из Питера через Одессу.

Автор: DEMOVERSION 2.11.2005, 14:02
Код может и не идеальный но я к етому двигаюсь.
Я хочу немного добавить - ети ф-ции, ето часть веб-програмы(JSP)!!!! Просто з не знаю как будет работать если useroff будет много. БД - Access.
Что будет если я буду редактировать а кто-то другой будет удалять даные из таблици?

PS: в примере было только удаление, а еше есть add, remove, edit. All uses updateSQL function.

Автор: corewithin 2.11.2005, 20:05
не знаю чем вы руководствуетесь, когда говорите, что тут не нужна синхронизация...
она не нужна только в том случае, если это сингл приложение...

в случае клиент-сервер приложения обязательна синхронизация на серверной стороне...

Автор: Stampede 2.11.2005, 20:09
Цитата(DEMOVERSION @ 2.11.2005, 14:02)
Просто з не знаю как будет работать если useroff будет много


Много - это скока?

Если только не тысяча запросов в секунду, то самая простая стратегия синхронизации, она же самая действенная - это просто тупо сериализовать все входящие запросы.

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

Если интересно, почему просто сделать все датабазные методы synchronized - это не очень хорошая идея, то могу в общих чертах рассказать. Но чтобы разговор был предметным, мне нужно знать, что у тебя за приложение и какие пользовательские сценарии у тебя предусмотрены.

Автор: pvo 3.11.2005, 00:58
Цитата(Stampede @ 2.11.2005, 20:09)
что каждый запрос будет отрабатываться без тормозов


В целом согласен. Но:

1. Все-таки речь должна идти не о тысячах запрсов в секунду ... Интереса ради попробовал выполнить простой update (изменение одной строки в таблице, кот. имеет 2 индекса и содержит около 50 записей) на локальном Firebird - вместе с коммитом операция заняла от 20ms до 100ms. При работе с удаленной базой время увеличится - будет, скорее всего, от 100ms. ИМХО, тут стоит говорить о максимум 10-20 запросах в секунду.

2. синхронизация методов доступа к базе не спасет, если вдруг захочется запустить приложение в кластере. Или один и тот же код работает в 2 разных веб приложениях.


Автор: Stampede 3.11.2005, 01:52
pvo, в соседнем топике идет обсуждение похожей темы. Поскольку мы в данном случае говорим не столько об использовании Java-примитивов синхронизации, сколько о вполне конкретной задаче синхронизации кода сервлетов/JSP (каковой вопрос выходит далеко за рамки просто синхронизации потоков), то я предлагаю продолжить обсуждение в подфоруме J2EE, тема http://forum.vingrad.ru/index.php?showtopic=69100&hl=.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)