big*_*mus 12 java mysql connection-pooling apache-commons-dbcp
在查看我的查询日志时,我看到一个奇怪的模式,我没有解释.
在几乎所有查询之后,我都"从DUAL中选择1".
我不知道它来自何处,我当然不会明确地进行查询.
日志基本上如下所示:
10 Query SELECT some normal query
10 Query select 1 from DUAL
10 Query SELECT some normal query
10 Query select 1 from DUAL
10 Query SELECT some normal query
10 Query select 1 from DUAL
10 Query SELECT some normal query
10 Query select 1 from DUAL
10 Query SELECT some normal query
10 Query select 1 from DUAL
...etc...
Run Code Online (Sandbox Code Playgroud)
以前有人遇到过这个问题吗?
MySQL版本:5.0.51
驱动程序:使用JDBC的Java 6应用程序.MySQL的连接器的Java-5.1.6-bin.jar
连接池:commons-dbcp 1.2.2
validationQuery被设置为"从DUAL中选择1"(显然),并且当验证查询非空时,显然连接池默认testOnBorrow和testOnReturn为true.
这给我带来的另一个问题是,我是否真的需要验证查询,或者我是否可以通过禁用它或至少降低其使用频率来提高性能.不幸的是,编写我们的"数据库管理员"的开发人员不再和我们在一起了,所以我不能要求他为我辩护.任何输入将不胜感激.我将深入挖掘API并谷歌一段时间,如果我发现任何值得的东西,我会报告.
编辑:添加了一些更多的信息
EDIT2:为以后发现此问题的任何人添加了正确答案中要求的信息
Gar*_*vis 24
它可能来自您的应用程序正在使用的连接池.我们使用简单的查询来测试连接.
刚刚在源代码中快速查看了mysql-connector-j,它并非来自那里.
最可能的原因是连接池.
公共连接池:
commons-dbcp有一个配置属性validationQuery,它与你看到的语句相结合testOnBorrow并testOnReturn可能导致你看到的语句.
C3P0有preferredTestQuery,testConnectionOnCheckin,testConnectionOnCheckout和idleConnectionTestPeriod
对于它的价值,我倾向于配置连接测试和结账/借用,即使这意味着一点额外的网络聊天.
小智 5
我已经执行了100次插入/删除并在DBCP和C3PO上进行了测试.
DBCP :: testOnBorrow = true会将响应时间影响超过4倍.
C3P0 :: testConnectionOnCheckout = true会将响应时间影响超过3倍.
结果如下:DBCP - BasicDataSource
100个事务的平均时间(插入操作)testOnBorrow = false :: 219.01 ms testOnBorrow = true :: 1071.56 ms
100次交易的平均时间(删除操作)testOnBorrow = false :: 223.4 ms testOnBorrow = true :: 1067.51 ms
C3PO - ComboPooledDataSource 100个事务的平均时间(插入操作)testConnectionOnCheckout = false :: 220.08 ms testConnectionOnCheckout = true :: 661.44 ms
100个事务的平均时间(删除操作)testConnectionOnCheckout = false :: 216.52 ms testConnectionOnCheckout = true :: 648.29 ms
结论:在DBCP中设置testOnBorrow = true或在C3PO中设置testConnectionOnCheckout = true会使性能下降3-4倍.是否有任何其他设置可以提高性能.
-Durga Prasad
| 归档时间: |
|
| 查看次数: |
24318 次 |
| 最近记录: |