Spring mvc Thymeleaf选择选项性能问题

Spring mvc Thymeleaf选择选项性能问题,spring-mvc,thymeleaf,Spring Mvc,Thymeleaf,我最近一直在摆弄SpringMVC5和Thymeleaf3.0,发现了一些奇怪的东西。我已经开始在网站上实现教程中的下拉列表,并注意到一些性能问题。如果我使用下面的代码,我的页面大约需要5.5秒来呈现大约100个项目的下拉列表 <select th:field="*{item}"> <option th:each="item : ${items}" th:value="${item.getId()}" th:text=

我最近一直在摆弄SpringMVC5和Thymeleaf3.0,发现了一些奇怪的东西。我已经开始在网站上实现教程中的下拉列表,并注意到一些性能问题。如果我使用下面的代码,我的页面大约需要5.5秒来呈现大约100个项目的下拉列表

<select th:field="*{item}">
    <option th:each="item : ${items}" 
            th:value="${item.getId()}" 
            th:text="${item.getValue()}"></option>
</select>

另一方面,如果我使用以下代码,我的页面将在大约150毫秒内呈现

<div th:each="item : ${items}">
    <span th:text="${item.getId()}"/>
    <span th:text="${item.getValue()}"/>
</div>

我在我的控制器中循环浏览了项目列表,并打印出了值,以查看从数据库获取数据时它们的速度是否减慢,但从控制器中抓取项目立即发生。我还尝试在select标记中呈现不同的html元素以进行测试,尽管它不是有效的html,但仍然可以快速呈现页面

我唯一一次在页面呈现时遇到极端的延迟是在选项上的select标记内部使用th:each时。Thymeleaf处理选择标记的方式是否不同?我认为,如果相同的项目列表,调用相同的方法,可以通过循环div在130毫秒内呈现一个页面,那么它应该能够以相当的速度创建选项,而不是花费5.5秒

以前有人遇到过这样的问题吗?我做了一些搜索,发现在Thymeleaf中存在性能问题,但这些案例有超过100000条记录,其中我的列表大约有100条。任何帮助都将不胜感激

更新

我已经将问题缩小到在th:field=“*{item}”上表现不佳。如果我运行以下代码,页面将立即加载

<select>
    <option th:each="item : ${items}" 
            th:value="${item.getId()}" 
            th:text="${item.getValue()}"></option>
</select>


一旦我尝试使用th:field=“*{item}”绑定select,页面将挂起约5.5秒。使用th:字段进行绑定会导致延迟问题吗?

我也遇到过同样的问题,选择/选项部分的页面创建会花费一分钟的时间。我的代码有点不同,因为我在一个表中有选项,但我认为这并不重要。我的初始代码如下所示:

<tr th:each="scorePart,rowStat : ${song.scoreParts}">
    <td>
        <select th:field="*{scoreParts[__${rowStat.index}__].instrument}">
            <option th:each="i2 : ${allInstruments}"
                    th:value="${i2.id}"
                    th:text="${i2.name}">bla</option>
        </select>
    </td>
    <td> more data... </td>
</tr>

布拉
更多数据。。。
但随后我将id添加到字段部分:

<tr th:each="scorePart,rowStat : ${song.scoreParts}">
    <td>
        <select th:field="*{scoreParts[__${rowStat.index}__].instrument.id}">
            <option th:each="i2 : ${allInstruments}"
                    th:value="${i2.id}"
                    th:text="${i2.name}">bla</option>
        </select>
    </td>
    <td> more data... </td>
</tr>

布拉
更多数据。。。

然后一切正常。两种情况下的结果相同,只有第二种情况是毫不拖延的。

这篇文章很旧,但希望我能帮助有同样问题的人。这件事几天前发生在我身上。将字段映射到对象列表时需要40秒以上完成的请求。如果您只将属性
th:field
映射到id,Spring将不会序列化整个对象,只会在将其返回到控制器时序列化id。我找到的解决方案是用不同的语法重新创建Thymeleaf生成的输出

与此相反:

<select th:field="*{item}">
    <option th:each="item : ${items}" 
            th:value="${item.getId()}" 
            th:text="${item.getValue()}"></option>
</select>

这样做:

<select name="item" id="item">
    <option th:each="it : ${items}"
            th:selected ="${it.getId()} == *{item.getId()}"
            th:value="${item.getId()}" 
            th:text="${item.getValue()}"></option>
</select>


输出将是相同的,但页面的加载速度将提高30倍,并且它将维护整个对象“项”。

可能会延迟初始化某些东西?目前,我正在控制器中返回一个列表,使用JPA Crudepository findAll()获取所有项,模型上的关系是带有联接列的@OneToOne,所以一切都应该初始化。