mysql实践小结,【java_mysql】实践小结

实践小结

一、项目内容

1.做一个网页,需要用户登录之后,能够看到百度地图的展示。需要将数据库的内容筛选出来,然后放到百度地图中展示。(效果如图一)

2.第三方mysql数据库有100张表,每张表的量级在百万条数据,每条记录为20个字段左右。

3.增量拷贝这100张表,表的数据会持续增长。

二、项目内容及遇到的问题、解决方法

1.项目:

599eecadb32866c03fb8a64e39bfa48c.gif

1.1前端的实现:

1.1.1简单的登录页面,(html/css/js)

1.1.2百度地图的调用

1.1.3对用户行为的捕捉:百度地图具有19个层级即放缩效果,需要捕捉用户的鼠标拖拽或是滚轮放缩或是双击放缩行为,将用户行为发送到服务器端,获取实时数据。ajax进行异步获取并展示。

1.2页面的跳转

1.2.1使用servlet进行跳转控制,mysql进行用户验证。

2.用户数据的获取(服务器端)

2.1数据量是巨大的,不可能直接从数据库中获取,所以,需要使用缓存redis,将mysql的数据筛选后存入redis中。先简单了解下redis:

Redis是一款开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存也可持久化的日志型、Key-Value高性能数据库。Redis与其他Key-Value缓存产品相比有以下三个特点:

支持数据持久化,可以将内存中的数据保存在磁盘中,重启可再次加载使用

支持简单的Key-Value类型的数据,同时还提供List、Set、Zset、Hash等数据结构的存储

支持数据的备份,即Master-Slave模式的数据备份

总之,就是使用redis存取会非常快。本项目中的筛选出来的数据是不重复的,所以选用HMSET进行存储。

3.数据的拷贝,mysql->mysql

3.1对于数据量较大的数据库,通常需要进行分页查找。一般的数据库设计都会额外增加一个自增字段id,是一个主键。这个额外增加的主键非常有用,对于分页很有帮助。

分页的查询语句可以写成:

select * from tables where id>0 and id<= 10000;

如果使用limit而没有利用到主键,那将是非常慢的遍历查询。用explain或desc就可以看出。

项目中,使用了封装好的数据库读取方法,得到的结果是一个List>的集合。

3.2对于list集合内的元素需要进行key-value拆分,貌似dbutil可以直接使用map进行插入,但是这里不采用。考虑到效率问题,毕竟一个map对应一个insert,是比较慢的。批量插入对于数据量大师非常必要的。批量插入的方法:①事务型的addbatch②一次插入多条insert into tables values(),();

考虑到事务对于数据库有一定的压力。,本次项目采用第二种方法:一次插入多条。所以将需要插入的数据合并成一条完成的mysql语句。

在合并的过程当中,犯了一个很低级的错误:使用String string="insert into tables values";对字符串进行拼接,这是非常吃内存且吃CPU的方式,1000条查询到的记录都处理不了。经提醒,stringbuffer/stringbuilder才是正确的方式。

最后的时间:100万单表数据copy使用不到十分钟。可以开多线程进行多表的存储。

4.项目中遇到的一些问题及处理方法:

4.1java.lang.NullPointerException

原因:字符串变量未初始化;接口类型的对象没有用具体的类初始化。

解决方法:

List list;//wrong

List list = new ArrayList();//true

4.2.insert into插入错误:data too long

原因:插入的字长太长,通常是因为插入的字段与实际存储的字段不是同一个,没有对应插入。如:table{id,name}插入是,将name与id的位置弄反。

解决方法:将每个字段实际顺序与每个字段插入数据对其。

4.3数据库中有一个字段是微信名的,这个字段的坑非常多。需要更改数据库字段的存储格式,也需要更改数据库的存储格式,字段的格式直接在可视化mysql的varchar里面设置更改,数据库的需要到配置文件中my.ini中更改。

4.4insert into 字段中含有单引号的。

sql:

insert into tb(field) values('a''bc');

mysql中用\'

insert into tb(field) values('a\'bc');

Java操作是:

String value=”abc’d”;

if(value.contains("'"))value=value.replace("'", "\\\'");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值