Java 应用程序在eclipse中运行得更快
我在eclipse中有一个可运行的JavaSE应用程序。我引导JPA在正常的Java6SE环境中工作。对数据库中不同表的每个请求不超过100ms 问题是,当我导出runnable jar时,我说java-jar myapp.jar,每个对数据库的请求大约需要9秒钟Java 应用程序在eclipse中运行得更快,java,eclipse,hibernate,jpa,Java,Eclipse,Hibernate,Jpa,我在eclipse中有一个可运行的JavaSE应用程序。我引导JPA在正常的Java6SE环境中工作。对数据库中不同表的每个请求不超过100ms 问题是,当我导出runnable jar时,我说java-jar myapp.jar,每个对数据库的请求大约需要9秒钟 我不明白为什么当我从eclipse运行应用程序时它会更快,我不知道如何使用eclipse编译器。eclipse使用的ant脚本是: <?xml version="1.0" encoding="UTF-8" standalone=
我不明白为什么当我从eclipse运行应用程序时它会更快,我不知道如何使用eclipse编译器。eclipse使用的ant脚本是:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="create_run_jar" name="Create Runnable Jar for Project Server">
<!--this file was created by Eclipse Runnable JAR Export Wizard-->
<!--ANT 1.7 is required -->
<target name="create_run_jar">
<jar destfile="myapp.jar" filesetmanifest="mergewithoutmain">
<manifest>
<attribute name="Main-Class" value="myapp.main.Main"/>
<attribute name="Class-Path" value="."/>
</manifest>
<fileset dir="dir.../Myapp/build/classes"/>
<zipfileset excludes="META-INF/*.SF" src=
..exclude all libraries
</jar>
</target>
</project>
您可以在两个版本上都使用-verbose:class来查看它是否加载了导致减速的不同版本的类。事实上,每次我向数据库发出请求时,我都在创建一个实体管理器:
Persistence.createEntityManagerFactory( "mysqldb" );
为了优化实体管理器的创建,我使用了如下单例实体工厂:
private static EntityManagerFactory em = Persistence
.createEntityManagerFactory( "mysqldb" );
public static EntityManagerFactory getEmf()
{
return em;
}
这有助于提高eclipse外部应用程序的性能,但在eclipse内部运行时,性能没有变化
我不确定从eclipse启动应用程序时,它工作得更好的原因是什么,但这个解决方案暂时解决了我的问题。您是如何衡量它的?您使用哪个vm参数来运行进程?我通过记录计算的时间(以毫秒为单位)来测量它。我使用Log4j,日志记录级别是相同的=“DEBUG”是的,但问题是“它使用的是相同的数据库吗”?如果它是一个不同的模式,表中充满了记录,而eclipse使用的模式只有很少的记录,那么您可能需要通过添加适当的索引来调整您的数据库您确定eclipse使用的jvm与您启动应用程序时使用的jvm相同吗?不,它们访问的是相同的ip、相同的端口,当我在eclipse的配置中添加-verbose:class时,我得到了类的列表。导出jar或运行java-jar myapp.jar-verbose:class时,不会显示任何内容。我使用类加载的控制台输出生成了一个文件,并在控制台中使用diff来比较这些文件。最大的区别在于eclipse中的库是从我创建的用户库加载的,而在另一种情况下,类是从jar中包含的库加载的。我真的不认为这是个问题不,听起来很好。我必须想点别的。我只是在这里发布了一个可能的答案+1,用于整理你自己的问题并跟进-很高兴听到你有了进展