小编dna*_*ult的帖子

为什么 Spring Rest 服务在第一次请求时速度很慢?

所以这个问题已经被问过几次了,但似乎没有人以可以帮助我的方式回答它。我目前正在为处理产品数据的简单应用程序制作后端。它甚至没有使用 JSP,只是一个普通的 Rest 后端。使用 Spring 的 RestController。

“问题”是:启动后的第一个请求比其他所有请求需要更长的时间才能从服务器获得答案。(我只是用一个简单的 JPA 用户实体来测试 Postman)

需要考虑的一些事项:

  • 它本身可能不是数据库问题,因为它显然只是在第一个传入请求时初始化某些内容,而不是在启动时初始化
  • 在日志中,当第一个实际请求传入(通过 Postman)时,它会显示“初始化 Spring DispatcherServlet 'dispatcherServlet'”。
  • 如果我从数据库中提取所有用户(目前只有一个用户),则启动后的第一个请求需要 140 毫秒(根据 Postman 的说法)。此后,相同的请求最多需要 10ms。
  • 有一个标志对类似问题提出了一些答案:spring.mvc.servlet.load-on-startup=1。尽管这仅删除了上面提到的(DispatcherServlet 的初始化)日志记录。
  • 看起来这是标准行为,与我实际编码实体和/或 RestController 的方式无关。

如何使第一个请求更快/如何强制 Spring 在第一个请求到来之前实际初始化所有内容?

无论如何,一些代码:

用户.java:

@Entity
@Table(name = "users")
@Data
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @NonNull
    private String firstName;
    @NonNull
    private String lastName;

    @NonNull
    @OneToOne(cascade = CascadeType.ALL)
    private Address billingAddress;

    //a bit more. a list and another address
}
Run Code Online (Sandbox Code Playgroud)

用户控制器.java:

@RestController
@RequestMapping("users")
public class UserController …
Run Code Online (Sandbox Code Playgroud)

java spring request delay postman

10
推荐指数
1
解决办法
1万
查看次数

杰克逊:生成带引用的模式

使用Jackson的JSON模式模块时,不管是否遇到某个模型类,我都希望停止完整的图形,并使用类名为另一个模式插入$ ref.你能引导我到jackson-module-jsonSchema源中的正确位置开始修补吗?

这里有一些代码来说明这个问题:

public static class Zoo {
    public String name;
    public List<Animal> animals;
}

public static class Animal {
    public String species;
}

public static void main(String[] args) throws Exception {
    SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();

    ObjectMapper mapper = objectMapperFactory.getMapper();
    mapper.acceptJsonFormatVisitor(mapper.constructType(Zoo.class), visitor);
    JsonSchema jsonSchema = visitor.finalSchema();

    System.out.println(mapper.writeValueAsString(jsonSchema));
}
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "type" : "object",
  "properties" : {
    "animals" : {
      "type" : "array",
      "items" : {
        "type" : "object",
        "properties" : {          <---- Animal schema is inlined :-(
          "species" : …
Run Code Online (Sandbox Code Playgroud)

java json jsonschema jackson

7
推荐指数
1
解决办法
3341
查看次数

有没有办法为Java的Charset名称添加别名

我得到一个异常,埋没在第三方库中,有这样的消息:

java.io.UnsupportedEncodingException:BIG-5

我认为这是因为Java没有为此定义此名称 java.nio.charset.Charset.Charset.forName("big5")很好,但Charset.forName("big-5")抛出异常.(所有这些名称似乎都不区分大小写.)

这与"utf-8"不同,后者有一些别名更宽容.例如,两个Charset.forName("utf8")和Charset.forName("utf-8")做工精细.

问题:有没有办法添加别名,以便"big-5"映射到"big5"?

java jakarta-mail character-encoding java-8

6
推荐指数
1
解决办法
397
查看次数

Jackson:以编程方式确定亚型

给定一个任意Class对象,确定向 Jackson 注册的该类的子类型的最佳方法是什么?

例如,这是一个简单的情况,其中类LionPenguin是 的子类型Animal

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({
        @JsonSubTypes.Type(Lion.class),
        @JsonSubTypes.Type(Penguin.class)})
public static abstract class Animal {}

@JsonTypeName("Lion")
public static class Lion extends Animal {}

@JsonTypeName("Penguin")
public static class Penguin extends Animal {}
Run Code Online (Sandbox Code Playgroud)

我梦想的功能如下:

List<Class> getSubTypeClasses(Class c) {...}
Run Code Online (Sandbox Code Playgroud)

getSubTypeClasses(Animal.class)会返回哪里LionPenguin.

如果 Jackson API 没有提供获取此信息的便捷方法,我将手动阅读注释,但最好了解与任何 AnnotationIntrospector实现兼容的技术。

java polymorphism json jackson

5
推荐指数
1
解决办法
4688
查看次数

我如何处理带有计数的ArrayList并按函数分组,值中包含字符串数组

我正在处理员工的数组列表,并且需要按员工人数,活动员工数和非活动员工数按功能使用分组。我知道如何处理总数,但是当值在数组字符串中时(即一名雇员与多个部门关联),我如何按功能对数组列表进行处理。

public class Employee {
    private String name;
    private List<String> department;
    private String status;
    public Employee(String name, List<String> department, String status) {
        this.setName(name);
        this.setDepartment(department);
        this.setStatus(status);
    }
    public String getName() {
        return name;
    }
    public List<String> getDepartment() {
        return department;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setDepartment(List<String> department) {
        this.department = department;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
}

ArrayList<Employee> listEmployee = new ArrayList<Employee>(); …
Run Code Online (Sandbox Code Playgroud)

java arraylist hashmap

2
推荐指数
1
解决办法
52
查看次数