gpt4 book ai didi

java - 使用 Eclipselink 从 OracleDB 获取数据时间较长

转载 作者:行者123 更新时间:2023-12-01 16:57:05 25 4
gpt4 key购买 nike

在我的应用程序中,我使用 Eclipselink 作为 OracleDB 的 ORM,但遇到了性能问题。

我正在执行这样的代码:

entityManager
.createNamedQuery(RoleToPermissionEntity.FIND_BY_APPLICATION_ROLE, RoleToPermissionEntity.class)
.setParameter(RoleToPermissionEntity.APPLICATION_ROLES_QUERY_PARAM, applicationRoles)
.getResultList();

带有命名查询:

SELECT mapping 
FROM RoleToPermissionEntity mapping
WHERE mapping.applicationRole IN :applicationRoles
ORDER BY mapping.id

实体管理器由@PersistenceContext设置。

对于 3 个给定的应用程序角色,应用程序获取 123 行(从 393 行开始),每行 9 列(2 个带时区的时间戳、3 个数字、4 个短 varchar)。

我检查了执行时间,作为执行给定代码之前和之后 System.nanoTime() 之间的差异。无论是第一次执行还是连续第十次执行,大约需要 550 毫秒。我的假设是它应该更快。

我的第一个猜测是查询有问题,所以我检查了 Eclipselink 日志。执行的查询是:

SELECT *all_columns* 
FROM *table_name*
WHERE (APPLICATION_ROLE IN (?,?,?)) ORDER BY ID
bind => [3_application_roles]

对我来说看起来不错。我尝试将其作为 native 查询执行,但结果是相同的。我还尝试了其他查询,例如 SELECT * FROM table_name,但时间仍然约为 500-600 毫秒。

这次我想进行一些比较,因此我手动创建了数据库连接并执行了如下查询:

Class.forName("oracle.jdbc.driver.OracleDriver");
connection = DriverManager.getConnection(database_args);
Statement statement = connection.createStatement();
statement.executeQuery(query);

我执行了好几次,第一次(建立连接时)花了相当长的时间,但接下来花了大约 50-60 毫秒。

我的第二个猜测是连接池有问题。我试图在 Eclipselink 文档中找到一些内容,但我只注意到参数:

<property name="eclipselink.connection-pool.default.initial" value="1"/>
<property name="eclipselink.connection-pool.default.min" value="16"/>
<property name="eclipselink.connection-pool.default.max" value="16"/>

应该设置。是的,但问题仍然存在。

我的 persistence.xml 的内容:

<persistence>
<persistence-unit name=unit transaction-type="JTA">
<jta-data-source>datasource</jta-data-source>

<exclude-unlisted-classes>false</exclude-unlisted-classes>
<!-- cache needs to be deactivated for multiple pods -->
<!-- https://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching -->
<shared-cache-mode>NONE</shared-cache-mode>

<properties>
<property name="eclipselink.logging.level" value="FINE"/>
<property name="eclipselink.logging.level.sql" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
<!--<property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>-->
<property name="eclipselink.weaving" value="false"/>
<property name="eclipselink.target-database"
value="org.eclipse.persistence.platform.database.oracle.Oracle12Platform"/>
<property name="eclipselink.connection-pool.default.initial" value="1"/>
<property name="eclipselink.connection-pool.default.min" value="16"/>
<property name="eclipselink.connection-pool.default.max" value="16"/>
</properties>

</persistence-unit>
</persistence>

我可以采取什么措施来解决此问题?

最佳答案

几个小时后我发现了问题。 OJDBC 的默认获取大小为 10,因此随着行数的增加,获取时间会增加得非常快。

奇怪的是:这是我的第一个想法,所以我尝试设置 <property name="eclipselink.jdbc.fetch-size" value="100"/>persistence.xml 。它不起作用,所以我跳到其他解决方案。今天我将其设置为 query.setHint("eclipselink.jdbc.fetch-size", 100) 的单个查询并且它有效。

关于java - 使用 Eclipselink 从 OracleDB 获取数据时间较长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61573091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com