作者gw10313 (GoCrazy)
看板java
标题[问题] 资料存取的问题
时间Mon Jul 18 18:32:04 2016
想请问一下
JAVA有没有方法可以让资料用类似资料库的方式储存跟存取在记忆体内
目前我有一个资料库如下
--
A | B | C
----------------
1 | 1 | 5
1 | 2 | 5
2 | 3 | 4
--
可是除了资料数量很大以外
同时我也需要一直跟资料库存取
造成大多数时间都在跟资料库做指令跟等待资料库回应
想请问一下是否有其他方法可以让资料放在记忆体内可以快速存取的方法
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.117.80.55
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1468837927.A.DDB.html
1F:推 darkk6: 要达成很简单,问题是你是还是要用 SQL 的方式去存取 07/18 19:01
2F:→ darkk6: 修正: "是不是"还是要用 SQL.... 07/18 19:02
3F:→ gw10313: 如果可以的话不用SQL也没关系 07/18 19:04
4F:→ gw10313: 只是还是需要有类似SQL的抓取资料的方法就可以 07/18 19:05
5F:→ gw10313: 目前我都是在用资料去比对A栏位的值然後抓B跟C 07/18 19:05
6F:推 darkk6: 还是要用 SQL query 语法去抓资料就是了? 07/18 19:10
7F:→ gw10313: 不限SQL 只要能抓出资料就可以 07/18 19:14
8F:推 darkk6: 那其实可以自己写一个 class 用 Map 和 List 去做就好啦 07/18 19:30
9F:→ gw10313: 请问是什麽意思 我不太懂 囧 07/18 21:06
10F:→ eieio: 你是不懂什麽是 Map,还是不懂怎麽用 Map 做? 07/18 21:16
11F:→ gw10313: 我是不太懂怎麽用MAP做 没有一个想法要怎麽把这东西 07/18 21:20
12F:→ gw10313: 转换成 我要的东西 07/18 21:20
13F:→ Expsun: 你写Java可是不知道Map @@ 可以去官网看Collections 07/18 21:41
14F:→ gw10313: 我知道MAP 只是没有一个想法要怎麽去用再我要的东西上面 07/18 21:45
15F:→ gw10313: 我先来看看好了 07/18 21:46
16F:推 SHANGOYANYI: memcache / coherence 07/18 21:49
17F:推 steven11329: 问题是你的资料量多大?记忆体够放吗? 07/18 22:21
18F:推 ripple0129: HSQLDB不知道是不是你要的 07/18 23:23
19F:→ gw10313: 目前是三十万笔资料左右 感觉应该够(?) 07/18 23:40
20F:→ gw10313: 因为我目前程式都写好了 主要是太多一笔一笔SQL的呼叫 07/18 23:42
21F:→ gw10313: 所以造成程式效率低落 想要找其他方法加速程式效率 07/18 23:43
22F:→ gw10313: HSQLDB 我也会去看看 希望能找到方法解决 07/18 23:43
23F:推 p23j8a4b9z: 你这应该是後面db要处理 跟前面没什麽关系吧 07/19 00:34
24F:→ p23j8a4b9z: 如果要写入 最好是包成一个档案在写入 07/19 00:36
25F:推 p23j8a4b9z: 或是用connection pool 开多个去存取 07/19 00:38
26F:→ p23j8a4b9z: 我倒是觉得这个跟你写法没什麽关系 不做处理一次run一 07/19 00:39
27F:→ p23j8a4b9z: 个sql会慢非常正常 07/19 00:39
28F:推 haha02: 我觉得你把存取资料库的方法跟呼叫的方式描述一下吧 07/19 00:46
29F:→ haha02: 搞不好根本就是写法的问题 例如每下一次SQL开关一次连线 07/19 00:47
--
我存取资料库的方式是用statement去对我的MYSQL资料库做存取
然後我下的SQL只有简单的 "select * from tableA where A=1;"
其中我的程式有一个do while回圈主要的SQL都下在里面
Statement stmt = conn.createStatement();
do{
SQL="Select * from tableA where A="+变数; //主要是回圈变数会变
rs=stmt.executeQuery(SQL); //执行每次的SQL
if(rs.next()){ //如果有这笔资料就做我要的计算
do something;
}
}while();
--
大概是这样 我大概知道是太常跟资料库下SQL
每笔资料进来都有新的变数 所以我就会跟资料库下SQL
可是这样造成我程式效率低落
所以才来这边想要请问一下大家有什麽比较好的方法
前面没有说清楚真的不好意思
--
※ 编辑: gw10313 (140.117.80.55), 07/19/2016 04:07:54
30F:→ jej: TableA有三十万笔 用do while 要很快... 07/19 05:04
31F:→ jej: ColumnA要做index吧 记忆体式的db或许适合你 07/19 05:07
32F:→ jej: 不然就是 30万一次查出来 用java8的stream 记忆体够就行 07/19 05:11
33F:→ gw10313: 我有对columnA做index 还是觉得很慢QQ 07/19 08:49
34F:→ dennisxkimo: 我看过一个文章 少用select * 07/19 11:41
35F:→ dennisxkimo: 我有些大table会用到TEMPORARY TABLE 07/19 11:51
36F:→ dennisxkimo: 不过我资料是静态历史纪录 条件下资料丢temp然後分析 07/19 11:54
37F:推 yyc1217: 搜寻java in-memory indexed database就有很多library 07/19 15:11
38F:推 haha02: 改用PreparedStatement应该可以改善一点点 07/20 22:10
39F:→ marsyang1: guava的Loading Cache, or 试试redis 07/21 20:49