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下才命中不了,很困惑
淡痛啊,百思不解,请教各位大牛帮忙,小弟谢谢了。

解决方案 »

  1.   

    show variables  like '%cache%';贴出来以供分析。 或者你自己也可以对比一下两个系统有何不同。
      

  2.   


    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)就是系统不同啊,一个window,一个linux;不过应该不关系统的事。
    就是不明白同样的sql语句,为什么在终端可以命中,而在java应用程序里却命中不了,
      

  3.   

    MYSQL在服务器上,客户端有WINDOWS、LINUX,同样的JAVA程序,
    在WINDOWS下可以命中,LINUX下不能,是这样?
    连接字串是什么
      

  4.   

    是这样的,而且在linux下终端执行同样的sql语句却可以命中。连接是使用c3p0连接池的,连接池配置如下:#mySql 驱动driverClass
    DRIVER_CLASS = com.mysql.jdbc.Driver
    URL = jdbc\:mysql\://127.0.0.1\:3306/pgameUSER = 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
      

  5.   

    可能还没说清楚,我是这样测试的,
    window下有mysql,linux下也有mysql,相同的java程序。
    出现的情况是:
    在window下是没有问题,不管是在程序,还是在控制台都可以命中。
    而在linux下,只有在终端才能命中,而在程序就命中不了。
      

  6.   

    是2台服务器,一台是window,一台是linux,都安装了mysql。然后跑一样的程序。
    判断命中,我是通过这个:SHOW STATUS LIKE ’Qcache_hits’; 
      

  7.   

    2台服务器的MYSQL配置是一样的?Qcache_hits分别是多少?
      

  8.   

    贴出你两台机的 show variables like '%cache%';
    以做对比。
      

  9.   

    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)
      

  10.   

    先别用程序访问  先分别用mysql访问试试命中否
      

  11.   

    用mysql访问是可以命中的,只是在程序里命中不了。
    是啊,用的是c3p0的连接池。
      

  12.   

    没有啊,我只是测试缓存命中,整个过程都是简单的测试。上面都贴了代码和测试过程的说明。
    window下有mysql,linux下也有mysql,相同的java程序。
    出现的情况是:
    在window下是没有问题,不管是在程序,还是在控制台都可以命中。
    而在linux下,只有在终端才能命中,而在程序就命中不了。还有一点不同的就是window下的mysql是5.1,linux下的mysql是5.0;
    后来我把linux下的mysql升级到5.1,就没有问题了。
    只是不明白为什么mysql5.0只有在linux终端才能命中,而在程序就命中不了。
      

  13.   

    是不是用了连接池?检查一下你的show status like 'Com_select'; 有没有增长?
      

  14.   

    两个测试用例的条件是一模一样吗?就只是一个window一个linux吗?
    其他的有没有不同。
      

  15.   

    版本相同才能比较,将WINDOWS的MYSQL为5.0再测试
      

  16.   

    回复了那么多,为什么还重复反问。难道是我表达问题越来越不行了吗。
    这些都不重要了,把linux下的mysql升级到5.1之后就没问题了。
    5.0的只有在终端才能命中,而在程序就命中不了,可能是字符集不一样吧。