2009-05-22 1 views
0

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

  1. Поскольку операторы вставки вставляют данные в 3 разные таблицы, следует ли перенести эти операторы sql на вызов процедуры tsql в базе данных и использовать транзакцию для блокировки таблицы?
  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 

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

ответ

3

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

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

+0

любые предложения, где я могу лучше прочитать больше на JPA? – phill

0

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

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

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

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