Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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 执行openjpa查询的性能_Java_Performance_Jpa_Openjpa - Fatal编程技术网

Java 执行openjpa查询的性能

Java 执行openjpa查询的性能,java,performance,jpa,openjpa,Java,Performance,Jpa,Openjpa,我有一个带有cxf 3.0.1框架和openjpa 2.3.0的rest web应用程序。web.xml文件: <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.su

我有一个带有cxf 3.0.1框架和openjpa 2.3.0的rest web应用程序。web.xml文件:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>Mobile app rest services</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/cxf-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
</web-app>
[164毫秒]花费的时间vs执行查询时间:824毫秒

这是一个连接大约4个表的本机查询。 我自己管理entityManager生命周期—在请求开始时创建,在请求结束时结束

/**
 * Enables the derived classes to execute read only operation using the entityManager
 *
 * @param <T>
 * @param operation
 * @return
 */
protected <T> T executeNonTransactionOperation(SimpleOperation<T> operation) {
    try {
        EntityManager entityManager = PersistenceHelper.getEntityManager();

        T result = operation.execute(entityManager);

        return result;
    } catch (Exception e) {
        //TODO: throw our custom exception?
        throw e;
    } finally {
        PersistenceHelper.closeEntityManager();
    }
}

/**
 * Enables the derived classes to execute operation (inside transaction) using the entityManager
 *
 * @param <T>
 * @param operation
 * @return
 */
protected <T> T executeTransactionOperation(SimpleOperation<T> operation) {
    try {
        EntityManager entityManager = PersistenceHelper.getEntityManager();

        PersistenceHelper.beginTransaction();
        T result = operation.execute(entityManager);
        PersistenceHelper.commit();

        return result;
    } catch (Exception e) {
        PersistenceHelper.rollback();
        //TODO: throw our custom exception?
        throw e;
    } finally {
        PersistenceHelper.closeEntityManager();
    }
}
/**
*使派生类能够使用entityManager执行只读操作
*
*@param
*@param操作
*@返回
*/
受保护的T ExecuteOnTransaction操作(SimpleOperation操作){
试一试{
EntityManager EntityManager=PersistenceHelper.getEntityManager();
T result=operation.execute(entityManager);
返回结果;
}捕获(例外e){
//TODO:抛出自定义异常?
投掷e;
}最后{
PersistenceHelper.closeEntityManager();
}
}
/**
*使派生类能够使用entityManager执行操作(内部事务)
*
*@param
*@param操作
*@返回
*/
受保护的T executeTransactionOperation(SimpleOperation操作){
试一试{
EntityManager EntityManager=PersistenceHelper.getEntityManager();
PersistenceHelper.beginTransaction();
T result=operation.execute(entityManager);
PersistenceHelper.commit();
返回结果;
}捕获(例外e){
PersistenceHelper.rollback();
//TODO:抛出自定义异常?
投掷e;
}最后{
PersistenceHelper.closeEntityManager();
}
}

如果openjpa声明它执行得那么快,为什么会有这样的差异呢?

问题在于,您正在测量两种不同的东西。
164 ms
是数据库执行查询所花费的时间。我怀疑您测量的
824 ms
是查询执行+实体对象实例化。

如果这与MySQL有关,请向我们展示查询。如果不相关,请删除标记。是的,你是对的,我考虑过,但似乎实例化java对象的时间太长了。这是相当长的时间,因此值得深入研究。我再次怀疑,您可能不仅仅是在度量对象实例化/结果集处理。最好的办法是连接一个分析器,看看时间花在哪里。
2333  thePU  TRACE  [qtp1769466090-14] openjpa.jdbc.SQL - <t 2143135982, conn 1825478533> [164 ms] spent
2015-06-15[INFO]xz.orm.dao.impl.util.PerfMeasureUtil stop: :: exec query time: 824ms
/**
 * Enables the derived classes to execute read only operation using the entityManager
 *
 * @param <T>
 * @param operation
 * @return
 */
protected <T> T executeNonTransactionOperation(SimpleOperation<T> operation) {
    try {
        EntityManager entityManager = PersistenceHelper.getEntityManager();

        T result = operation.execute(entityManager);

        return result;
    } catch (Exception e) {
        //TODO: throw our custom exception?
        throw e;
    } finally {
        PersistenceHelper.closeEntityManager();
    }
}

/**
 * Enables the derived classes to execute operation (inside transaction) using the entityManager
 *
 * @param <T>
 * @param operation
 * @return
 */
protected <T> T executeTransactionOperation(SimpleOperation<T> operation) {
    try {
        EntityManager entityManager = PersistenceHelper.getEntityManager();

        PersistenceHelper.beginTransaction();
        T result = operation.execute(entityManager);
        PersistenceHelper.commit();

        return result;
    } catch (Exception e) {
        PersistenceHelper.rollback();
        //TODO: throw our custom exception?
        throw e;
    } finally {
        PersistenceHelper.closeEntityManager();
    }
}