发表于: 2017-12-28 23:35:55

1 530


今天完成的事情:

25、不关闭连接池的时候,在Main函数里写1000个循环调用

方法1

spring + mybatis + C3p0整合的项目里写循环。因为dataSource又经过了封装,实现了请求数据库接口的类自动关闭。循环调用正常,查询、插入都正常。

package com.bpzj.task1.test;

import com.bpzj.task1.service.StudentService;

public class MainRepeatTest {
private static StudentService studentService =new StudentService();

   public static void main(String[] args) {
for (int i =1; i<1001;i++) {
studentService.insert(i);
       }
}
}



单个mapper bean的有初始化数量的数据库连接,mapper bean被销毁时,连接池也被销毁。但是如果使用mapper bean的方法(mybatis实现的sql语句映射)进行循环(也就是循环执行同一个mapper bean实例的某个sql映射方法),这时,方法结束后,会自动断开连接,也就不会出现连接没有正常关闭的情况。

如果把循环放在外面,也就是循环创建mapper bean实例,会造成报错:too many connection ,这是因为mysql有默认的最大连接数量。每创建一个mapper bean,都生成一个连接池,到了最大数量,就会报错。

 

方法2

pojo类中使用C3p0数据库,已经使用的连接用完不关闭,会在达到设置允许的最大连接数量后,出现程序暂停。这种情况是直接使用connection进行sql语句的操作,需要手动关闭(或者写成自动关闭的形式)。


26、接DB中断后TryCatch是否能正常处理

25,方法1mybatis自动管理了连接的中断和开启,没想到怎么测试

方法2:在sql语句执行前,关闭connectiontry catch正常起作用。

 

27、代码是否符合规范,如果DB的表格有改动,应该改哪些内容,需要多久

不是特别规范,因为规范也没看太多,后边每天要看点。

如果改动DB表,需要改动

Domain层,业务对象的属性、方法、构造器(时间:根据表改,很快)

DAO层,接口是否重新设计,数据库查询、插入等方法也需要改动(这块改动应该不小,如果能巧妙的设计几个通用、扩展性强的接口效果应该会好点)。

Implmybatissql语句),也要跟着上面的改。主要改动应该在这了。

service层,目前还没涉及到吧。我的理解。

好像底层的接口设计的不好,越往上改动量越大

配置方面:框架整合好,几乎不用改。

28、插入100万数据

使用mysql文件插入(原生mysql语句)

sql文件,在sql语句中写循环,100万:36s

 

DELIMITER // -- 修改MySQL delimiter:'//'

-- 创建插入数据的存储过程
DROP PROCEDURE IF EXISTS `add_vote_record_memory` //
CREATE PROCEDURE `add_vote_record_memory`(IN n INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i < n DO
INSERT INTO `sign_up`.`student`
VALUES (NULL,NOW(), NOW(), '曲艳行', '3169119846', 1, '11月18日--11月22日', '燕山大学', 2641, 'http://www.jnshu.com/daily/40038', '老大最帅', '郑州分院王鹏举', '知乎');
SET i = i + 1;
END WHILE;
END //
DELIMITER ;  -- 改回默认的 MySQL delimiter:';'

CALL add_vote_record_memory(1000000);


spring + mybatis

spring + mybatis + druid(5个连接) + 单线程,100万数据:77min

spring + mybatis + druid(150个连接) + 单线程,100万数据:59min

 

spring + mybatis 是用了对象,每次插入都新建一个Student对象。性能损失严重。

 

jdbc + 数据池 + sql语句拼接(没有对象)

用拼接sql语句优化下:

1、拼接sql语句。

mysql有语句最大长度限制:show variables like '%max_allowed_packet%';  我的默认是4M4194304。如果想改,可以在my.inilinux下是my.cnf)添加:

max_allowed_packet = 6M 

重启服务

大概十几秒(这个放在了一个普通类里,日志配置失败了)

3000万数据、2亿数据

明天再弄吧

 

C3p0连接池的几种配置方法

 

配置方式

获取数据源

spring管理

spring bean dataSource

一般不直接获取

基础方式

java 类,setter方法设置每一项

 

c3p0.properties文档

DataSource ds = new ComboPooledDataSource();

c3p0-config.xml文档

DataSource ds = new ComboPooledDataSource("mySource");

()种参数是多个配置时的name属性

 

明天计划的事情:

b+树索引、任务1总结、任务2浏览。

遇到的问题:

任务26表述不是很清晰,按程序自己的原因导致和mysql服务器之间连接中断这种情况,而不是关闭mysql服务器造成的连接中断

收获:

又想了想jdbc,可以这么理解:

初始化jdbc驱动,就相当于打开cmd,它为连接mysql准备了一个环境

建立连接,就相当于mysql –uroot –p ,新建一个连接

Statement,相当于一个输入sql语句的环境,Statement. execute 就相当于回车提交sql语句。

 

mysql

mysql有语句最大长度限制:show variables like '%max_allowed_packet%';  我的默认是4M4194304。如果想改,可以在my.inilinux下是my.cnf)添加:

max_allowed_packet = 6M 

truncate清楚数据、主键id记录:TRUNCATE TABLE <表名>;

查看最大连接数show variables like '%max_connections%';

java 关闭流

实现了AutoClose接口的类,可以使用try(){}实现自动关闭。

 

 

 



返回列表 返回列表
评论

    分享到