您正在处理非常大的结果集吗?您使用的是什么存储库?我遇到过类似的问题,归结为休眠的数据库设置。
还有一些其他问题需要检查:
Simple hibernate query returning very slowly
Hibernate queries slow down drastically after an entity is loaded in the session
对于休眠,我发现您可以调整以下设置以提高性能。 :
// update - Create if schema doesn't exists; update if column doesn't
// exist
// create - Empties the database before creating it
// create-drop - Drops the database when the SessionFactory is closed
config.setProperty("hibernate.hbm2ddl.auto", hbm2ddlMode);
config.setProperty("hibernate.cache.use_query_cache", "true");
config.setProperty("hibernate.cache.use_second_level_cache", "true");
config.setProperty("hibernate.cache.region.factory_class",
"org.hibernate.cache.ehcache.EhCacheRegionFactory");
config.setProperty("hibernate.cache.provider_class",
"org.hibernate.cache.EhCacheProvider");
// config.setProperty("hibernate.cache.provider_class",
// "org.hibernate.cache.NoCacheProvider");
config.setProperty("hibernate.jdbc.fetch_size", "1000");
config.setProperty("hibernate.jdbc.batch_size", "50"); //batches network calls in one
config.setProperty("hibernate.jdbc.use_scrollable_resultset", "true");
config.setProperty("hibernate.connection.provider_class",
"org.hibernate.connection.C3P0ConnectionProvider");
config.setProperty("hibernate.c3p0.acquire_increment", "1");
config.setProperty("hibernate.c3p0.idle_test_period", "10");
config.setProperty("hibernate.c3p0.min_size", "1");
config.setProperty("hibernate.c3p0.max_size", "8");
config.setProperty("hibernate.c3p0.timeout", "10");
config.setProperty("javax.persistence.validation.mode", "none");
config
.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false");
config.setProperty("hibernate.show_sql", "false");
请注意,这些特定设置可能不适合您的数据库,但您应该能够通过调整上述属性来提高性能。详细解释可以在doc site上找到。
对于 sqlite,您必须调整一些额外的设置:
config.setPageSize(4096);
config.setCacheSize(-256);
config.setSharedCache(true);
config.setReadUncommited(true);
//Be careful with these settings if needed for concurrency
//***************************************************
config.setLockingMode(LockingMode.NORMAL);
config.setSynchronous(SynchronousMode.NORMAL);
config.setJournalMode(JournalMode.WAL);
config.setTempStore(TempStore.MEMORY);
//***************************************************
Postgres 更简单一些,并且更独立于数据库设置本身。但是,请记住,查询优化器会在第一次查询运行后启动。