将应用程序移至生产环境时,我该怎么办?使用Spring + Jersey + Hibernate的应用程序。
预期的服务器命中/秒 - 40到50 .. Serverhits / min - 1000到1500.对于此服务器加载我的配置应该如何?
Tomcat的 在生产期间,如果我为tomcat设置这些,那就没问题了
初始JVM堆大小:256m 最大JVM堆大小:256m 最大JVM永久生成大小:64m
如果没有,请建议。 P.S:我在云实例中托管它是自动缩放的。因此RAM或CPU没问题。
弹簧 答:数据库操作的静态架构。
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:数据库操作的非静态架构。
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 :(得分:0)
如果你没有创建大量的对象,那么非静态的唯一缺点就是你正在使用的ONE额外对象的开销大约为12字节,而唯一真正的优势就是可以轻松地将其修改为制作大量独立的服务实例。
如果你想拥有多个服务实例而不必启动更多的小JVM,我会选择非静态的。否则,它可能无关紧要。
答案 1 :(得分:0)
我的建议是让你的数据库助手使用单一模式。因此,您将在单个DBHelper类中包含sessionFactory,并且它将在类中包含私有的sessionFactory变量。这与静态方法更相似,但使用的是正确的模式。
用于内存使用(最好以250 MB min开头,最大1024 MB,Perm为256 MB)。随后您可以在负载增加时增加内存。
例如如下..
public final class DBHelper {
私有SessionFactory sessionFactory;
private static DBHelper instance = null;
//私有构造函数
私人DBHelper(){
//在此处初始化您的会话工厂
}
public static DBHelper getInstance(){
if(instance == null){
instance = new DBHelper();
}
返回实例;
}
public static Object insertIntoDb(Object object)抛出异常,ConstraintViolationException {
//进行编码以插入数据库
}
}
公共课预订{
//所以总是使用单个insertDb方法
DBHelper.getInstance()insertIntoDb(预订);
...
}