Post Jobs

对象转成字节数组,海量数据

最近公司在一个项目上遇到了一个问题: 对于查 海量数据的sql,
往往花费了十几秒, 甚至更多. 结果是什么呢? 首先占了mysql很多的处理数,
这个倒不是特别大的事. 系统不至于崩溃. 但它占用了cpu巨大的处理量,
这会导致系统崩溃, 服务器瘫痪. 有没有什么办法来解决这种巨大数据量的sql
呢? 我先是想到了内存, 毕竟内存读取数据比硬盘要快得多.
接着开源项目memcached就成了首选了.接下来看看怎么解决这个问题吧.
memcached我就不多介绍了, google搜吧,
一大把.主要关心的是它的key=>value 存储方式 和 slab
chunk内存分片的管理. 这里主要讨论key=>value 存储方式. key 是
value的数组标示, 这有点像php的数组, arr[‘one’] = 1;one就是key
1就是value. 只能是一一对应. 公司的情况是比如说s1 = “select * from
huge_info_table where time>2011-01-01 and time<=2012-01-01”,
每次s1的time范围不同, 可能没交集 也 可能有交集. s1就是key,
它的查询结果就是value. 显然按每条sql来当做key, 内存里会有很多重复的数据,
原因是time有交集. 因此, 怎么管理好key就是关键. 按整天的sql来存储key,
每当一堆key被保存. 再一次取的时候, 如果有交集部分, 也就是有已经保存过的,
就直接从memcache里面取. 如果没有就否则将key重新存进去. s1 = “select *
from huge_info_table where time>2011-01-01 and time<=2011-02-01”
s2 = “select * from huge_info_table where time>2011-02-01 and
time<=2011-03-01” s3 = “select * from huge_info_table where
time>2011-03-01 and time<=2011-04-01”

mysql>
mysql> delimiter $$
mysql>
mysql> CREATE PROCEDURE myProc()
    -> BEGIN
    ->     DECLARE lock_result INT;
    ->     IF get_lock('sp_critical_section_lock',60) THEN
    ->        /* This block can only be run by one user at a time*/
    ->        SELECT 'got lock';
    ->        /* Critical code here */
    ->       SET lock_result=release_lock('sp_critical_section_lock');
    ->     ELSE
    ->        SELECT 'failed to acquire lock';
    ->        /* Error handling here */
    ->     END IF;
    -> END$$
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> delimiter ;
mysql> call myProc();
+----------+
| got lock |
+----------+
| got lock |
+----------+
1 row in set (0.02 sec)

Query OK, 0 rows affected (0.02 sec)

mysql>
mysql> drop procedure myProc;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql>

java代码

phptest.php

public static byte[] convertToByteArray(Object obj) throws IOException
  {
    ObjectOutputStream os = null;

    ByteArrayOutputStream byteStream = new ByteArrayOutputStream(5000);
    os = new ObjectOutputStream(new BufferedOutputStream(byteStream));
    os.flush();
    os.writeObject(obj);
    os.flush();
    byte[] sendBuf = byteStream.toByteArray();
    os.close();
    return sendBuf;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图