Я нахожу, что моя база данных является узким местом в моем приложении, так как часть этого выглядит так, как будто подготовленные операторы не используются повторно.
Например, здесь используется метод
public static CoverImage findCoverImageBySource(Session session, String src)
{
try
{
Query q = session.createQuery("from CoverImage t1 where t1.source=:source");
q.setParameter("source", src, StandardBasicTypes.STRING);
CoverImage result = (CoverImage)q.setMaxResults(1).uniqueResult();
return result;
}
catch (Exception ex)
{
MainWindow.logger.log(Level.SEVERE, ex.getMessage(), ex);
}
return null;
}
Но используя профилировщик Yourkit, он говорит:
com.mchange.v2.c3po.impl.NewProxyPreparedStatemtn.executeQuery () Count 511 com.mchnage.v2.c3po.impl.NewProxyConnection.prepareStatement () Count 511
, и я предполагаю, что число для вызова prepareStatement () должно быть ниже, так как похоже, что мы создаем новую подготовленную статистику каждый раз вместо повторного использования.
https://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html
Я использую C3po-соединение poolng, которое немного усложняет, но, насколько я понимаю, оно настроено правильно
публичная статическая конфигурация getInitializedConfiguration () {// См. https://www.mchange.com/projects/c3p0/#hibernate-specific Конфигурация конфигурации = новая конфигурация ();
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","1");
//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.max_statements","5000");
config.setProperty("hibernate.c3p0.timeout","2000");
config.setProperty("hibernate.c3p0.maxStatementsPerConnection","50");
config.setProperty("hibernate.c3p0.idle_test_period","3000");
config.setProperty("hibernate.c3p0.acquireRetryAttempts","10");
//Cancel any connection that is more than 30 minutes old.
//config.setProperty("hibernate.c3p0.unreturnedConnectionTimeout","3000");
//config.setProperty("hibernate.show_sql","true");
//config.setProperty("org.hibernate.envers.audit_strategy", "org.hibernate.envers.strategy.ValidityAuditStrategy");
//config.setProperty("hibernate.format_sql","true");
config.setProperty("hibernate.generate_statistics","true");
//config.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory");
//config.setProperty("hibernate.cache.use_second_level_cache", "true");
//config.setProperty("hibernate.cache.use_query_cache", "true");
addEntitiesToConfig(config);
return config;
}
Использование H2 1.3.172,Hibernate 4.3.11 и соответствующийg c3po для этой спящей версии
С воспроизводимым тестовым набором мы имеем
HibernateStats
- HibernateStatistics.getQueryExecutionCount () 28
- HibernateStatistics.getEntityInsertCount () 119
- HibernateStatistics.getEntityUpdateCount () 39
- HibernateStatistics.getPrepareStatementCount () 189
Профайл, счетчик методов*
GooGooStaementCache.aquireStatement () 35 GooGooStaementCache.checkInStatement () 189 GooGooStaementCache.1061 *
Я не знаю, что мне следует считать созданием подготовленного утверждения, а не повторным использованием существующего подготовленного утверждения?
Я также попытался включить ведение журнала c3p0, добавив регистратор c3p0 и заставив его использовать тот же файл журнала в моих LogProperties, но безрезультатно.
String logFileName = Platform.getPlatformLogFolderInLogfileFormat() + "songkong_debug%u-%g.log";
FileHandler fe = new FileHandler(logFileName, LOG_SIZE_IN_BYTES, 10, true);
fe.setEncoding(StandardCharsets.UTF_8.name());
fe.setFormatter(new com.jthink.songkong.logging.LogFormatter());
fe.setLevel(Level.FINEST);
MainWindow.logger.addHandler(fe);
Logger c3p0Logger = Logger.getLogger("com.mchange.v2.c3p0");
c3p0Logger.setLevel(Level.FINEST);
c3p0Logger.addHandler(fe);