Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Eclipselink从OracleDB获取数据的时间很长_Java_Oracle_Eclipselink - Fatal编程技术网

Java 使用Eclipselink从OracleDB获取数据的时间很长

Java 使用Eclipselink从OracleDB获取数据的时间很长,java,oracle,eclipselink,Java,Oracle,Eclipselink,在我的应用程序中,我使用Eclipselink作为OracleDB的ORM,遇到了性能问题 我执行的代码如下: entityManager .createNamedQuery(RoleToPermissionEntity.FIND_BY_APPLICATION_ROLE, RoleToPermissionEntity.class) .setParameter(RoleToPermissionEntity.APPLICATION_ROLES_QUERY_PARAM, applicationRo

在我的应用程序中,我使用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]
我看起来不错。我尝试将其作为本机查询执行,但结果是一样的。我还尝试了其他查询,如
SELECT*fromtable\u 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"/>

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

my 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,所以随着行数的增加,获取时间会非常快地增加


奇怪的是:这是我的第一个想法,所以我尝试在
persistence.xml
中设置
。它不起作用,所以我跳到其他解决方案。今天我通过
query.setHint(“eclipselink.jdbc.fetch size”,100)将它设置为单查询,它可以工作。

您与jdbc的比较:您每次都在重用什么和重新创建什么?你看过EclipseLink的声明缓存()了吗?但这是每个连接,所以在EclipseLink连接池中使用16个不同的连接时,这不是一个公平的比较。