Наверное у всех когда-то наступают проблемы с синхронизацией, пишу проект, пишу один, времени улучшать что-то как всегда нет, но наступает время когда делать это приходится...
Мой проект клиент-сервер rmi приложение, на сервере есть "объекты" и "списки объектов" которыми я "орудую" с клиента.
Список объектов (в данном случае список услуг)
| Код | public class ServiceListImpl extends HObjectsListImpl implements ServiceList { public PreparedStatement removeStmt; public PreparedStatement createStmt; public PreparedStatement updateStmt; public PreparedStatement getIdStmt;
public ServiceListImpl() throws RemoteException { super(); try { Connection c = ServerImpl.getInstance().getConnection(); removeStmt = c.prepareStatement("DELETE FROM services WHERE id=?"); createStmt = c.prepareStatement("INSERT INTO services (name, price, group_service_id) VALUES(?,?,?)"); updateStmt = c.prepareStatement("UPDATE services SET name=?, price=?, group_service_id=? WHERE id=?"); getIdStmt = c.prepareStatement("SELECT max(id) FROM services"); } catch (SQLException ex) { ex.printStackTrace(); } } @Override public Service getEmptyService() throws RemoteException {return new ServiceImpl(this);}
|
Сам объект (в данном случае услуга)
| Код | public class ServiceImpl extends HObjectImpl implements Service { private String name; private Double price; private Integer groupServiceId;
private ServiceListImpl list;
public ServiceImpl(ServiceListImpl list) throws RemoteException { super(list); this.list = list; }
@Override public String getName() throws RemoteException { return name; }
@Override public void setName(String name) throws RemoteException { this.name = name; }
@Override public Double getPrice() throws RemoteException { return price; }
@Override public void setPrice(Double price) throws RemoteException { this.price = price; }
@Override public Integer getGroupServiceId() throws RemoteException { return groupServiceId; }
@Override public void setGroupServiceId(Integer groupServiceId) throws RemoteException { this.groupServiceId = groupServiceId; }
@Override public void removeDB() throws RemoteException { try{ list.removeStmt.setInt(1, getID()); list.removeStmt.executeUpdate(); list.removeHObject(this); ((ServerImpl)ServerImpl.getInstance()).fireServicesChanged(); } catch (Exception ex) { ex.printStackTrace(); } }
@Override public void createDB() throws RemoteException { try{ list.createStmt.setString(1, name); list.createStmt.setDouble(2, price); if (groupServiceId!=null) list.createStmt.setInt(3, groupServiceId); else list.createStmt.setNull(3, java.sql.Types.INTEGER); list.createStmt.executeUpdate(); ResultSet rset = list.getIdStmt.executeQuery(); if(rset.next())this.setID(rset.getInt(1)); rset.close(); list.addHObject(this); ((ServerImpl)ServerImpl.getInstance()).fireServicesChanged(); } catch (Exception ex) { ex.printStackTrace(); } }
@Override public void updateDB() throws RemoteException { try{ list.updateStmt.setString(1, name); list.updateStmt.setDouble(2, price); if (groupServiceId!=null) list.updateStmt.setInt(3, groupServiceId); else list.updateStmt.setNull(3, java.sql.Types.INTEGER); list.updateStmt.setInt(4, getID()); list.updateStmt.executeUpdate(); list.updateHObject(this); ((ServerImpl)ServerImpl.getInstance()).fireServicesChanged(); } catch (Exception ex) { ex.printStackTrace(); } } }
|
все нормально работает, но если обратить внимание например на метод removeDB() то там следующий код он работает неправильно (если несколько клиентов одновременно удаляют объект типа услуга)
list.removeStmt.setInt(1, getID()); list.removeStmt.executeUpdate();
как синхронизировать методы, или поля этих классов, чтобы пока не произойдет удаления объекта, другой клиент "ждал" доступа к удалению
|