全部产品
云市场

OCS与数据库结合使用示例

更新时间:2017-06-07 13:26:11

缓存与数据库相结合使用,是常见的一种应用搭配场景。下面是一个简单的Java例子,用OCS搭配MySQL数据库使用。Java示例代码在此
这个示例代码中,因为要与数据库结合,所以程序需要依赖一个JDBC的jar包才能运行。支持MySQL的JDBC jar包在此解压后添加到Java工程中 

在程序中添加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
1Tanghanbeijing
2Jackhangzhou
3Michelleshenzhen
4BossChenshanghai
5MengTangqingdao
6QianQianshanghai
7XiaoXiongshanghai
8intdosbeijing
9Robinshibeijing
10iydonghangzhou

如果这个查询被调用到的频率很高,多个用户反复不断的在数据库中查这个数据,我们就可以把这个查询结果放到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的这种优势就越明显。