2013-12-11 62 views
0

當我將應用程序移至生產時,應該怎麼做。 Spring + Jersey + Hibernate的應用程序。靜態方法還是非靜態方法?

預期的服務器點擊次數/秒 - 40到50 .. Serverhits /分鐘 - 1000到1500。這個服務器負載應該怎麼我的配置是什麼?

Tomcat的 在生產過程中是確定的,如果我設置這些爲Tomcat

初始JVM堆大小:256米 最大JVM堆大小:256米 最大JVM持久代的大小:64M

如果不是請建議。 P.S:我將它託管在自動縮放的雲實例中。所以RAM或CPU沒有問題。

春 答:DB操作靜態架構。

public class Booking { 

     @Autowired // this is autowired by spring 
     private SessionFactory sessionFactory; // Hibernate class 

     @POST // this is Jersey (I guess this can handle 50 requests per soconds) 
     @Path("/create") 
     @Produces("application/json") 
     public Response create(String json) { 
       .... 
     DBHelper.insertIntoDb(booking, sessionFactory); // here i use static architecture. The reason why i used this is i dont want new object created for each request. (I tested with 10 request per seconds.. Will this be able to handle 50 request per second... or even 500 requests per second) 
       .... 
       return Response.ok(container).build(); 
     } 
} 

public class DBHelper { 
     /** 
    * Inserts the object in DB 
    * @param object 
    * @param sessionFactory 
    * @return the saved object 
    * @throws Exception 
    * @throws ConstraintViolationException 
    */ 
    public static Object insertIntoDb(Object object, SessionFactory sessionFactory) throws Exception, ConstraintViolationException { 
     synchronized (sessionFactory) { 
      Session session = sessionFactory.openSession(); 
      Transaction transaction = null; 
      try { 
       transaction = session.beginTransaction(); 
       if (object != null) { 
        session.save(object); 
        session.flush(); 
        session.clear(); 
        transaction.commit(); 
        return object; 
       } 
      } catch (ConstraintViolationException e) { 
       transaction.rollback(); 
       throw new ConstraintViolationException(e.toString(), null, null, null); 
      } catch (Exception e) { 
       transaction.rollback(); 
       throw new Exception(e); 
      } finally { 
       session.close(); 
      } 
     } 
     return object; 
    } 
} 

B:對DB操作非靜態架構。

public class Booking { 

     @Autowired // this is autowired by spring 
     private SessionFactory sessionFactory; // Hibernate class 

     @POST // this is Jersey (I guess this can handle 50 requests per soconds) 
     @Path("/create") 
     @Produces("application/json") 
     public Response create(String json) { 
       .... 
     new DBHelper().insertIntoDb(booking, sessionFactory); // Non static 
       .... 
       return Response.ok(container).build(); 
     } 
} 

public class DBHelper { 
     /** 
    * Inserts the object in DB 
    * @param object 
    * @param sessionFactory 
    * @return the saved object 
    * @throws Exception 
    * @throws ConstraintViolationException 
    */ 
    public Object insertIntoDb(Object object, SessionFactory sessionFactory) throws Exception, ConstraintViolationException { 
     synchronized (sessionFactory) { 
      Session session = sessionFactory.openSession(); 
      Transaction transaction = null; 
      try { 
       transaction = session.beginTransaction(); 
       if (object != null) { 
        session.save(object); 
        session.flush(); 
        session.clear(); 
        transaction.commit(); 
        return object; 
       } 
      } catch (ConstraintViolationException e) { 
       transaction.rollback(); 
       throw new ConstraintViolationException(e.toString(), null, null, null); 
      } catch (Exception e) { 
       transaction.rollback(); 
       throw new Exception(e); 
      } finally { 
       session.close(); 
      } 
     } 
     return object; 
    } 
} 

答:靜態架構 優點: 1)我不是創建單獨的對象 2)因此,確保我的Java堆未填充 3)工作少垃圾收集器 缺點: 1)錯了對象可以從insertIntoDd方法返回...(我想這...但沒有面對測試一個單一的問題)。

B:非 - 靜態架構 優點: 1)無疑是正確的數據將被從insertIntoDd方法 缺點返回: 1)我創建單個對象 2)Java堆可能會導致OutOfMemoryException異常 3)需要更多工作以垃圾收集器

我完全糊塗了。

我該怎麼辦?

回答

0

我的建議是將單一模式用於您的數據庫幫助程序。因此,您將在單個DBHelper類中具有sessionFactory,並且它將在該類內部使用private sessionFactory變量。這更類似於你的靜態方法,但使用適當的模式。

對於內存使用情況(更好地以250 MB最小值和最大1024 MB,Perm爲256 MB開始)。稍後,您可以隨着負載的增加而增加內存。

例如如下..

public final class DBHelper { 

私有會話工廠的sessionFactory;

private static DBHelper instance = null;

//私有構造

私人DBHelper(){

//這裏初始化會話工廠

}

公共靜態DBHelper的getInstance(){

如果(實例== null){

instance = new DBHelper();

}

return instance;

}

公共靜態對象insertIntoDb(Object對象)拋出異常,ConstraintViolationException {

//做你的代碼中插入DB

}

}

公共類預訂{

//所以總是使用單個insertDb方法

DBHelper.getInstance()。insertIntoDb(booking);

...

}

0

如果你沒有創建大量的對象,那麼去非靜態的唯一缺點就是你使用的額外對象的開銷爲12字節,唯一真正的好處是能夠輕鬆修改它使服務的許多獨立實例。

如果你想有服務的多個實例,而無需啓動多一點的JVM,我非靜態去。否則,這可能沒有關係。