我正在使用Hibernate 4.3.11.Final和H2 1.3.172数据库,并在一个较慢的Linux机器上对我的应用程序进行分析,发现它在特定的SQL INSERT上花费了比其他任何操作都要多的时间。同时,似乎预编译语句没有被缓存,因为预编译语句的数量与执行的语句数量大致相同。我是否理解正确(我正在使用Yourkit Profiler)?
我想知道是否配置不正确,令人困惑的是c3po文档与Hibernate配置在某些参数名称上并不相符,例如是“max_size”或“max_pool_size”。
这是一个单用户多线程应用程序,理想情况下,我希望所有准备好的语句都在应用程序的持续时间内被缓存,因为只有大约50个不同的语句。
据我所知,每次执行操作时,缓存都会失效。
我的HibernateUtil类配置如下
public static Configuration getInitializedConfiguration()
{
Configuration config = new Configuration();
config.setProperty(Environment.DRIVER,"org.h2.Driver");
config.setProperty(Environment.URL,"jdbc:h2:"+Db.DBFOLDER+"/"+Db.DBNAME+";FILE_LOCK=SOCKET;MVCC=TRUE;DB_CLOSE_ON_EXIT=FALSE;CACHE_SIZE=50000");
config.setProperty(Environment.DIALECT,"org.hibernate.dialect.H2Dialect");
System.setProperty("h2.bindAddress", InetAddress.getLoopbackAddress().getHostAddress());
config.setProperty("hibernate.connection.username","jaikoz");
config.setProperty("hibernate.connection.password","jaikoz");
config.setProperty("hibernate.c3p0.numHelperThreads","10");
config.setProperty("hibernate.c3p0.min_size","20");
//Consider that if we have lots of busy threads waiting on next stages could we possibly have alot of active
//connections.
config.setProperty("hibernate.c3p0.max_size","200");
config.setProperty("hibernate.c3p0.timeout","300");
config.setProperty("hibernate.c3p0.maxStatementsPerConnection","50");
config.setProperty("hibernate.c3p0.idle_test_period","3000");
config.setProperty("hibernate.c3p0.acquireRetryAttempts","10");
addEntitiesToConfig(config);
return config;
}
我想知道是否配置不正确,令人困惑的是c3po文档与Hibernate配置在某些参数名称上并不相符,例如是“max_size”或“max_pool_size”。
这是一个单用户多线程应用程序,理想情况下,我希望所有准备好的语句都在应用程序的持续时间内被缓存,因为只有大约50个不同的语句。
据我所知,每次执行操作时,缓存都会失效。
session = HibernateUtil.beginTransaction();
这将从池中获取连接,如果该特定连接先前已准备好现在所需的语句,则可以使用该准备好的语句而无需编译新语句。
如果准备好的语句不存在,则会准备。
如果此连接已经有50个准备好的语句,则最旧的语句将被删除。
这个需要更多时间的特定查询的用法如下:
public static void saveMatchedToRelease(Session session,Integer reportId, Integer recNo, SongFieldKey songFieldKey, SongChangeType type, String original, String edited)
{
SongChanges sc = new SongChanges();
sc.setReportId(reportId);
sc.setRecNo(recNo);
sc.setField(songFieldKey);
sc.setType(type);
sc.setOriginalValue(original);
sc.setNewValue(edited);
session.save(sc);
}
hibernate-c3p0
工件作为依赖项? 在早期版本的 Hibernate 中,org.hibernate.c3p0.internal.C3P0ConnectionProvider
类是在主要的hibernate.jar
中提供的,因此许多 Hibernate/C3P0 的说明没有提到额外的依赖项。 - df778899hibernate-c3p0
不是hibernate-core
的传递依赖项。但是再次查看截图,它显示了来自 C3P0 的较低级别的NewProxyConnection
等类。另一个可能性是,hibernate-core.jar
和旧版的hibernate.jar
都在依赖树中的某个位置。如果它针对更新的 Hibernate 拾取了过时的C3P0ConnectionProvider
,则可能无法通过设置传递。 - df778899