OCS与数据库结合使用示例

更新时间:

缓存与数据库相结合使用,是常见的一种应用搭配场景。本文以简单的Java例子,介绍OCS搭配MySQL数据库使用。

在程序中添加MySQL数据库的连接信息:

    // JDBC driver name and database URL
    static final String JDBC_DRIVER = “com.mysql.jdbc.Driver”;
    static final String DB_URL = “jdbc:mysql://xxxxxxx.mysql.rds.aliyuncs.com/testdb”; //MySQL数据库URL
    
    //  Database用户名及密码
    static final String DB_USER = “xxxxxx”;
    static final String DB_PASS = “xxxxxx”;

设想这样一个场景:我们需要从数据库的tableone表中查找区域不属于北京的记录总数,用SQL表示就是:

SELECT count() FROM testdb.tableone where region != ‘beijing';

假定这个表中的数据如下,则这条SQL查询返回的结果就是7:

ID

NAME

REGION

1

Tanghan

beijing

2

Jack

hangzhou

3

Michelle

shenzhen

4

BossChen

shanghai

5

MengTang

qingdao

6

QianQian

shanghai

7

XiaoXiong

shanghai

8

intdos

beijing

9

Robinshi

beijing

10

iydong

hangzhou

如果这个查询被调用到的频率很高,多个用户反复不断的在数据库中查这个数据,我们就可以把这个查询结果放到OCS缓存中去。

看下面的代码片段,我们用for循环模拟用户连续20次在数据库中查询上述SQL语句:

             for (int i = 1; i <= 20; i++) { 
                String sql = “SELECT count()  FROM testdb.tableone where region != ‘beijing’”; 
                String key =”non-beijing”; //给SQL语句自定义一个key 
                //在OCS缓存里按key查找 
               String value =  (String) cache.get(key); 
                 
                if (value == null) { 
                    // 在OCS缓存里没有命中 
                    // step 1:从My SQL数据库中查询 
                    //Load MySQL Driver 
                      Class.forName(JDBC_DRIVER); 
                     con = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS); 
 
 
                    ps = con.prepareStatement(sql); 
                    ResultSet result = ps.executeQuery(sql); 
                    result.next(); 
                     
                    value=result.getString(1); 
 
 
                    System.out.println(“从MySQL中查询数据.  Key= “+key+” Value=”+value); 
                     
                   // step 2:把数据库返回的数据作为value存放到OCS缓存中去 
                    cache.set(key, EXPIRE_TIME, value); 
                     
                } else { 
                    // 在OCS缓存里命中 
                    System.out.println(“从OCS中读取数据.     Key= “+key+” Value=”+value); 
                } 
                 
            }// end of for 
在这段代码中我们可以看到,我们给这条SQL语句标记了一个key,当有用户要执行这条SQL的时候,我们首先按照key在OCS缓存中查找:如果没有对应的缓存数据,则连接MySQL数据库执行SQL查询,把结果返回给用户,并把这个查询结果存到OCS缓存中去;如果OCS中已经有了对应的缓存数据,则直接把缓存数据返回给用户。 运行结果如下:
    从MySQL中查询数据.  Key= non-beijing, Value=7
    从OCS中读取数据.     Key= non-beijing, Value=7
    从OCS中读取数据.     Key= non-beijing, Value=7
    从OCS中读取数据.     Key= non-beijing, Value=7

    …… ……

从结果可以看出,程序第1次是从MySQL数据库当中查询数据,后面的19次都是从OCS缓存中获取key对应的value直接返回。也就是说,OCS降低了程序去连接MySQL数据库执行SQL查询的次数,减轻了对数据库的负载压力。用户对热点数据访问的频率越高,OCS的这种优势就越明显。