- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我发现我的数据库是我的应用程序的瓶颈,作为其中的一部分,准备好的语句似乎没有被重用。
比如这里我用的方法
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 profiler 它说
com.mchange.v2.c3po.impl.NewProxyPreparedStatemtn.executeQuery() 计数 511com.mchnage.v2.c3po.impl.NewProxyConnection.prepareStatement() 计数 511
而且我认为 prepareStatement() 调用的次数应该更低,因为看起来我们每次都创建一个新的准备好的语句而不是重复使用。
https://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html
我正在使用 C3po 连接 poolng,这让事情有点复杂,但据我所知,我已经正确配置了它
公共(public)静态配置 getInitializedConfiguration(){ //见https://www.mchange.com/projects/c3p0/#hibernate-specific 配置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","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 和该 hibernate 版本对应的 c3po
我们有可重现的测试用例
HibernateStats
分析器,方法计数
我不知道我应该将什么算作准备语句的创建而不是重用现有的准备语句?
我还尝试通过添加 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);
最佳答案
现在我终于让基于 c3p0 的日志记录工作了,我可以确认@Stevewaldman 的建议是正确的。
如果你启用
public static Logger c3p0ConnectionLogger = Logger.getLogger("com.mchange.v2.c3p0.stmt");
c3p0ConnectionLogger.setLevel(Level.FINEST);
c3p0ConnectionLogger.setUseParentHandlers(false);
然后你得到表单的日志输出
24/08/2019 10.20.12:BST:FINEST: com.mchange.v2.c3p0.stmt.DoubleMaxStatementCache ----> CACHE HIT
24/08/2019 10.20.12:BST:FINEST: checkoutStatement: com.mchange.v2.c3p0.stmt.DoubleMaxStatementCache stats -- total size: 347; checked out: 1; num connections: 13; num keys: 347
24/08/2019 10.20.12:BST:FINEST: checkinStatement(): com.mchange.v2.c3p0.stmt.DoubleMaxStatementCache stats -- total size: 347; checked out: 0; num connections: 13; num keys: 347
在缓存命中时明确说明。当没有缓存命中时,你不会得到第一行,但会得到另外两行。
这是使用 C3p0 9.2.1
关于database - 我的 H2/C3PO/Hibernate 设置似乎没有保留准备好的语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56563705/
在使用 LLDB 研究调试异常时,我发现了以下文章和线程,以及其他提供相同信息的文章: https://www.natashatherobot.com/xcode-debugging-trick/ X
我在我的 asp.net 核心应用程序中使用了 Orchard Localization。 Startup.cs services.AddPortableObjectLocalization(opti
我有一个正在积极开发中的 python 程序,它使用 gettext 进行翻译。 我有一个带有翻译的 .POT 文件,但它有点过时了。我有一个脚本来生成最新的 .PO 文件。有没有办法检查 .POT
我在项目中使用 Poedit 进行本地化。每当我用 poedit 更改条目时,它都会重新排序所有元素。我认为它根据行号和文件对元素重新排序,但由于我在这个项目中与许多编码人员一起工作,poedit 不
看起来 django 不想创建/更新 .po我的项目的文件(或者 django 不知道我正在使用任何其他语言)。 # mkdir locale # python manage.py makemessa
我几乎觉得问这个很愚蠢,但是......那里有任何好的示例 .po 文件吗?我一直在阅读 GNU gettext 手册,虽然它指定了一般结构,但并没有像我想要的那样详细。另外,我真的很想要一个实际充实
我想从 PO 文件中删除所有已翻译的字符串,或者生成一个仅包含未翻译字符串的 PO 文件。 那可能吗? 最佳答案 我找到了方法: msgattrib --untranslated source.po
我正在使用一套 .po由公司翻译系统生成的文件(使用 Pootle,如果相关)。我无法将这些文件转换为 .mo (与 .po 文件对应的二进制文件)使用 msgfmt实用程序(使用 -C 运算符,检查
我想在 gettext .po 文件中以某种方式使用变量,例如: msgid "ui_settings_connect_text" msgstr "Connect to another running
有谁知道从 PO 文件中批量删除所有模糊翻译的方法。就像是: if#,fuzzy == TRUE Then SET msgstr=""AND REMOVE #,fuzzy 最佳答案 如果安装了 get
我正在使用 .po 和 .mo 文件来翻译我的网站。我的问题是,是否可以将参数传递到 .po translation file 中的翻译句子中? ? 例如:en -> 嗨,我叫莎拉,我是个酒鬼我想用两
我们有两个 .po 文件,每个文件来自一个软件的不同分支。 我们需要将这些组合成一个 .po 文件。 两个文件之间存在重复项,理想的处理方式是让一个文件的字符串受到青睐(一致)。 我们有一个 SUSE
我有一个 .po 文件,其中大多数翻译的字符串与原始字符串相同。然而,很少有不同的。如何快速找到与原版不同的内容? 最佳答案 使用podiff 我用过它,它对我有用。它是C语言的,所以你必须编译它。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是偏离
在 Django 中运行 django-admin.py makemessages -l de 创建翻译文件后,您可以使用纯文本编辑器或 Poedit 来填写它们。 Poedit 的优势在于它提供了专
我无法在文档中找到,但我不知道如何翻译包含可变内容的短语。 我的 Django View 中有以下短语: apple_count = 100 a = _('I have %d apples' %
我有一个下面的正则表达式,如果它找到 PO Box office 组合则返回 true \b[P|p]*(OST|ost)*\.*\s*[O|o|0]*(ffice|FFICE)*\.*\s*[B|b
我有一个这样声明的变量: @property (nonatomic, retain) NSMutableArray *aInfo; 一开始,如果我这样声明变量: self.aInfo = [[NSMu
我一直在调试我的代码,发现我的管理器被取消初始化(这是我的错误的原因 - 没有调用委托(delegate)方法)。 奇怪的是,在调试过程中,我在设置管理器的委托(delegate)(弱)后使用了“po
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我是一名优秀的程序员,十分优秀!