сервлеты Java: лучший способ сделать несколько вставок и блокировки таблиц? - PullRequest
0 голосов
/ 22 мая 2009

В настоящее время я запускаю следующий фрагмент кода в Java-сервлете, используя предложенный класс PareparedStatement. В настоящее время он вставляет данные инвентаризации в базу данных SQL Server системы учета. У меня две проблемы.

  1. Поскольку операторы вставки вставляют данные в 3 разные таблицы, я должен переместить эти операторы sql в вызов процедуры tsql в базе данных и использовать Transaction для блокировки таблицы?
  2. Всякий раз, когда у пользователя открывается экран инвентаризации программного обеспечения для бухгалтерского учета, последние 2 оператора вставки не выполняются. Я предполагаю, что программный клиент блокирует таблицу, пока у пользователя открыт экран.

вот код:

try {   

        con = java.sql.DriverManager.getConnection(getConnectionUrl()); 
        //get next itemkey 
        CallableStatement cstmt = con.prepareCall("{call spGetNextSurrogateKey (?,?)}");
        cstmt.setString("iTableName","timitem");
        cstmt.registerOutParameter("oNewKey", java.sql.Types.INTEGER);
        cstmt.execute(); 
        int rs4 = cstmt.getInt(2);
        cstmt.close();

        String query = "insert into timitem (itemkey, AllowCostOvrd,AllowDecimalQty,AllowDropShip,AllowPriceOvrd,AllowRtrns,AvailForSale,CompanyID,CreateDate,CreateUserID,CreateType,DateEstab,DfltSaleQty,HazMat,InclOnPackList,InternalLongDesc,IntrnlDeliveryReq,ItemClassKey,ItemID,ItemSubType,ItemType,MinGrossProfitPct,MinSaleQty,PerUsageOrdLimit,PriceSeq,PriceUnitMeaskey,PurchProdLineKey,PurchUnitMeasKey,RcptReq,RestockRate,SaleMultiple,SalesUnitMeasKey,Seasonal,ShelfLife,Status,STaxClasskey,StdPrice,StdUnitCost,StockUnitMeasKey,SubjToTradeDisc,TargetMargin,TrackMeth,UpdateCounter,ValuationMeth,WarrantyDays,WarrantyProvider) values ( '" +rs4 + "', 0,0,1,1,1,1,'ens','" + DateFormat.format(Date) + "','admin',1,'" + DateFormat.format(Date) + "',1,0,1,0,0,"+itemclasskey+",'" + partnumber + "',1,5,0,1,0,0,112,"+PurchProdLineKey+","+UnitMeasKey+",1,0,0,112,0,0,1,12,"+ itemlistprice + ","+itemcost + ",112,0,0,2,0,5,0,0)";
        PreparedStatement pstmt = con.prepareStatement(query); 
        pstmt.executeUpdate(); 
        pstmt.close();            

                String query_descrip = "insert into timitemdescription (itemkey, languageid, longdesc, shortdesc) values ('" + rs4 + "', 1033, '" + itemdescription + "','"+ "_" + "')";

                PreparedStatement pstmt2 = con.prepareStatement(query_descrip); 
        pstmt2.executeUpdate();                         
                pstmt2.close();

                String query_UOM = "insert into timItemUnitOfMeas (itemkey, TargetUnitMeasKey, conversionfactor, unitvolume, unitweight,upc,useforpurchases,useforsales,usestdconv) values ('" + rs4 + "', "+UnitMeasKey+", '1',0,0,NULL,0,0,0)";

                PreparedStatement pstmt3 = con.prepareStatement(query_UOM); 
        pstmt3.executeUpdate();                         
                pstmt3.close();


}catch(java.sql.SQLException e){ e.printStackTrace(); }     //end try 

есть предложения? заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 22 мая 2009

При работе с JDBC на низком уровне каждый оператор автоматически фиксируется при его выполнении. Чтобы выполнить несколько операторов в одной транзакции, вызовите setAutoCommit(false) для Connection и завершите единицу работы вызовом commit() для соединения. Если произошел сбой, вместо этого позвоните rollback().

В настоящее время более привычным является механизм персистентности, такой как JPA, управляющий транзакциями, работающий с платформой или контейнером. Эта инфраструктура вполне может справиться с обычными транзакционными сценариями.

0 голосов
/ 23 мая 2009

Я бы посоветовал вам не делать это в сервлете. Переместите код в уровень постоянства, который можно тестировать в автономном режиме без контейнера сервлета.

Я бы также рекомендовал Spring и JPA . Хорошей идеей будет наложение вашего приложения таким образом, чтобы веб-уровни и уровни постоянства не были едины.

http://java.sun.com/developer/technicalArticles/J2EE/jpa/ http://www.springsource.org/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...