求救关于mysql在linux下应用程序查询缓存sql_cache无法命中的问题~。

liuzhengkang 2011-11-14 03:03:41
linux系统是CentOS-5.6,mysql的my.cnf配置文件如下:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
lower_case_table_names=1
query_cache_size=32M
#Query cache type to use.
query_cache_type=2
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 2
max_connections = 100
lower_case_table_names=1
#skip-networking
innodb_log_buffer_size=3M
innodb_buffer_pool_size=64M
innodb_log_file_size=16M
innodb_flush_log_at_trx_commit=1
innodb_additional_mem_pool_size=2M
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

#Set the default character set.
default-character-set=utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid


测试的sql语句:
select sql_cache id,name,type from yl_npc;


测试的java程序代码片段:

/**
* 查询缓存测试
*/
public void queryCacheTest() {
Connection conn = null;
PreparedStatement prepar = null;
ResultSet result = null;

String sql = "select sql_cache id,name,type from yl_npc";
try {
conn = openConnect();
prepar = conn.prepareStatement(sql);
result = prepar.executeQuery();
while (result.next()) {
System.out.println("id:"+result.getInt("id")+",name:"+result.getString("name"));
}
} catch (Exception e) {
e.printStackTrace();
log.error("",e);
} finally {
closeConnect(result, null, prepar, conn);
}
}


问题是:
在终端里多次执行上面的sql语句,查询是Qcache_hits 是可以命中的,同样的sql语句,但不知道为什么在应用程序里就命中不了。而且在window系统下就不会有这问题,只有在linux下才命中不了,很困惑。。。
淡痛啊,百思不解,请教各位大牛帮忙,小弟谢谢了。


...全文
194 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
WWWWA 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 liuzhengkang 的回复:]
淡痛,最后的结论是太旧的东西不用,太新的东西也别用,要的是主流、稳定、速度。
[/Quote]
最重要的是稳定
呵呵,提问题的一定要将问题说明白。比如 版本、字符集、系统、操作步骤等等
liuzhengkang 2011-11-18
  • 打赏
  • 举报
回复
淡痛,最后的结论是太旧的东西不用,太新的东西也别用,要的是主流、稳定、速度。
liuzhengkang 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 acmain_chm 的回复:]

是不是用了连接池?

检查一下你的show status like 'Com_select'; 有没有增长?
[/Quote]
回复了那么多,为什么还重复反问。难道是我表达问题越来越不行了吗。
这些都不重要了,把linux下的mysql升级到5.1之后就没问题了。
5.0的只有在终端才能命中,而在程序就命中不了,可能是字符集不一样吧。
ACMAIN_CHM 2011-11-16
  • 打赏
  • 举报
回复
是不是用了连接池?

检查一下你的show status like 'Com_select'; 有没有增长?
liuzhengkang 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wwwwb 的回复:]

详细说明你是怎样测试的,在测试过程中,对表进行删除、更新没有?
[/Quote]
没有啊,我只是测试缓存命中,整个过程都是简单的测试。上面都贴了代码和测试过程的说明。
window下有mysql,linux下也有mysql,相同的java程序。
出现的情况是:
在window下是没有问题,不管是在程序,还是在控制台都可以命中。
而在linux下,只有在终端才能命中,而在程序就命中不了。

还有一点不同的就是window下的mysql是5.1,linux下的mysql是5.0;
后来我把linux下的mysql升级到5.1,就没有问题了。
只是不明白为什么mysql5.0只有在linux终端才能命中,而在程序就命中不了。
wwwwb 2011-11-16
  • 打赏
  • 举报
回复
详细说明你是怎样测试的,在测试过程中,对表进行删除、更新没有?
jiahehao 2011-11-16
  • 打赏
  • 举报
回复
关注。你的程序是不是并发访问?存在对该表做操作的行为?
如果该表在两次访问中间被修改过,这个表相关的缓存就会被清空,你当然就命中不了。
wwwwb 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 liuzhengkang 的回复:]
引用 15 楼 wwwwb 的回复:

详细说明你是怎样测试的,在测试过程中,对表进行删除、更新没有?

没有啊,我只是测试缓存命中,整个过程都是简单的测试。上面都贴了代码和测试过程的说明。
window下有mysql,linux下也有mysql,相同的java程序。
出现的情况是:
在window下是没有问题,不管是在程序,还是在控制台都可以命中。
而在linux下,只有在终端才……
[/Quote]
版本相同才能比较,将WINDOWS的MYSQL为5.0再测试
无天 2011-11-16
  • 打赏
  • 举报
回复
两个测试用例的条件是一模一样吗?就只是一个window一个linux吗?
其他的有没有不同。
liuzhengkang 2011-11-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 rucypli 的回复:]

先别用程序访问 先分别用mysql访问试试命中否
[/Quote]
用mysql访问是可以命中的,只是在程序里命中不了。
[Quote=引用 12 楼 acmain_chm 的回复:]

你是不是用了连接池?
[/Quote]
是啊,用的是c3p0的连接池。
ACMAIN_CHM 2011-11-14
  • 打赏
  • 举报
回复
你是不是用了连接池?
rucypli 2011-11-14
  • 打赏
  • 举报
回复
先别用程序访问 先分别用mysql访问试试命中否
liuzhengkang 2011-11-14
  • 打赏
  • 举报
回复
windows:
mysql> show variables like '%cache%';
+------------------------------+------------+
| Variable_name | Value |
+------------------------------+------------+
| binlog_cache_size | 32768 |
| have_query_cache | YES |
| key_cache_age_threshold | 300 |
| key_cache_block_size | 1024 |
| key_cache_division_limit | 100 |
| max_binlog_cache_size | 4294963200 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 268435456 |
| query_cache_type | DEMAND |
| query_cache_wlock_invalidate | OFF |
| table_definition_cache | 256 |
| table_open_cache | 256 |
| thread_cache_size | 8 |
+------------------------------+------------+
14 rows in set (0.00 sec)



Linux:
mysql> show variables like '%cache%';
+------------------------------+------------+
| Variable_name | Value |
+------------------------------+------------+
| bdb_cache_size | 8384512 |
| binlog_cache_size | 32768 |
| have_query_cache | YES |
| key_cache_age_threshold | 300 |
| key_cache_block_size | 1024 |
| key_cache_division_limit | 100 |
| max_binlog_cache_size | 4294963200 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 33554432 |
| query_cache_type | DEMAND |
| query_cache_wlock_invalidate | OFF |
| table_cache | 64 |
| thread_cache_size | 0 |
+------------------------------+------------+
14 rows in set (0.00 sec)
ACMAIN_CHM 2011-11-14
  • 打赏
  • 举报
回复
贴出你两台机的 show variables like '%cache%';
以做对比。
WWWWA 2011-11-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liuzhengkang 的回复:]
是2台服务器,一台是window,一台是linux,都安装了mysql。然后跑一样的程序。
判断命中,我是通过这个:SHOW STATUS LIKE ’Qcache_hits’;
[/Quote]
2台服务器的MYSQL配置是一样的?Qcache_hits分别是多少?
liuzhengkang 2011-11-14
  • 打赏
  • 举报
回复
是2台服务器,一台是window,一台是linux,都安装了mysql。然后跑一样的程序。
判断命中,我是通过这个:SHOW STATUS LIKE ’Qcache_hits’;
wwwwb 2011-11-14
  • 打赏
  • 举报
回复
你测试的是同一台服务器?你是怎么判断没有命中的?
liuzhengkang 2011-11-14
  • 打赏
  • 举报
回复
可能还没说清楚,我是这样测试的,
window下有mysql,linux下也有mysql,相同的java程序。
出现的情况是:
在window下是没有问题,不管是在程序,还是在控制台都可以命中。
而在linux下,只有在终端才能命中,而在程序就命中不了。
liuzhengkang 2011-11-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wwwwb 的回复:]

MYSQL在服务器上,客户端有WINDOWS、LINUX,同样的JAVA程序,
在WINDOWS下可以命中,LINUX下不能,是这样?
连接字串是什么
[/Quote]
是这样的,而且在linux下终端执行同样的sql语句却可以命中。

连接是使用c3p0连接池的,连接池配置如下:

#mySql 驱动driverClass
DRIVER_CLASS = com.mysql.jdbc.Driver
URL = jdbc\:mysql\://127.0.0.1\:3306/pgame

USER = root
PASS_WORD = 123456

MAX_STATEMENTS = 0
CHECKOUT_TIMEOUT = 0
CONNECTION_TEST_PERIOD = 60
INIT_POOL_SIZE = 10
MAX_IDLE_TIME = 60
MAX_POOL_SIZE = 100
MinPoolSize=3
wwwwb 2011-11-14
  • 打赏
  • 举报
回复
MYSQL在服务器上,客户端有WINDOWS、LINUX,同样的JAVA程序,
在WINDOWS下可以命中,LINUX下不能,是这样?
连接字串是什么
加载更多回复(2)

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧