mysql实验
实验步骤
同一台电脑装了两个mysql,端口号不同,mysql5.6安装好之后只有一个my-default的文件,将其中添加一些错误内容,改mysql依然可以启动成功
,说明使用的不是该文件,将my-default.ini改名为my.ini,再向其中添加一些错误内容,则启动失败,则说明,mysql5.6启动时读取的配置文件
名称默认为my.ini
使用框架springmvc+spring+hibernate,但是插入数据时使用的JdbcDaoSupport中的jdbcTemplete,所以在这里hibernate也算是没有使用到,
由于要获取同一个connection对象,所以在这里封装了个方法
public static final ThreadLocal<Connection> cs = new ThreadLocal<Connection>(); public static Connection getConnection(DataSource dataSource) throws SQLException{ Connection c = cs.get(); if(null==c){ c=dataSource.getConnection(); cs.set(c); } return c; }
dao插入数据代码
package com.h3c.itac.alarm.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.sql.DataSource; import org.springframework.jdbc.core.support.JdbcDaoSupport; import org.springframework.stereotype.Repository; import com.h3c.itac.alarm.po.SyslogAlarm; import com.h3c.itac.util.ConnectionUtil; @Repository public class SyslogAlarmDao extends JdbcDaoSupport{ @Resource public void setDatasource(DataSource dataSource){ this.setDataSource(dataSource); } private long count = 0L; String sql1=""; String sql2=""; PreparedStatement ps1 = null; PreparedStatement ps2 = null; Connection con = null; @PostConstruct public void set() throws SQLException{ sql1 = "insert into alarm(id,adesk_alarm_id,serial_no,level,source,type,device_id,create_time,upload_time,order_id,title,location,customer_id)" +"values(?,?,?,?,?,?,?,?,?,?,?,?,?)"; sql2 = "insert into syslogalarm values(?,?,?,?,?,?,?,?)"; con = ConnectionUtil.getConnection(this.getDataSource()); // con.setAutoCommit(false); ps1 = con.prepareStatement(sql1); ps2 = con.prepareStatement(sql2); PreparedStatement ps3 = con.prepareStatement("select max(id) from alarm"); ResultSet rs = ps3.executeQuery(); while(rs.next()){ count = rs.getLong(); } System.out.println("alarm id最大值为 :"+count); } public void insert(SyslogAlarm sAlarm) throws SQLException{ count++; ps1.setLong(,count); ps1.setLong(,sAlarm.getAlarm().getAdeskAlarmId()); ps1.setString(,sAlarm.getAlarm().getSerialNo()); ps1.setInt(, sAlarm.getAlarm().getLevel()); ps1.setInt(, sAlarm.getAlarm().getSource()); ps1.setInt(,sAlarm.getAlarm().getType()); ps1.setLong(, sAlarm.getAlarm().getDevice().getId()); ps1.setLong(, sAlarm.getAlarm().getCreateTime()); ps1.setLong(, sAlarm.getAlarm().getUploadTime()); ps1.setLong(,count); ps1.setString(, sAlarm.getAlarm().getTitle()); ps1.setString(, sAlarm.getAlarm().getLocation()); ps1.setLong(,sAlarm.getAlarm().getDevice().getCustomer().getId()); ps2.setLong(,count); ps2.setString(, sAlarm.getDescription()); ps2.setString(,sAlarm.getReason()); ps2.setString(,sAlarm.getAdvise()); ps2.setString(, sAlarm.getVariables()); ps2.setString(, sAlarm.getLogContent()); ps2.setLong(,sAlarm.getPriginalLogId()); ps2.setLong(, count); ps1.addBatch(); ps2.addBatch(); ==){ excuteRemainderBatchSQL(); } } public void excuteRemainderBatchSQL() throws SQLException{ ps1.executeBatch(); ps1.clearBatch(); ps2.executeBatch(); ps2.clearBatch(); // con.commit(); // con.setAutoCommit(true); } }
测试类
package com.h3c.itac.alarm.dao; import java.sql.SQLException; import java.util.Date; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.h3c.itac.alarm.po.Alarm; import com.h3c.itac.alarm.po.SyslogAlarm; import com.h3c.itac.customer.Customer; import com.h3c.itac.device.Device; public class TestSyslogAlarmDao { public SyslogAlarmDao getSyslogAlarmDao() { ApplicationContext ac = new ClassPathXmlApplicationContext( "applicationContext.xml"); return (SyslogAlarmDao) ac.getBean("syslogAlarmDao"); } @Test public void init(){ ApplicationContext ac = new ClassPathXmlApplicationContext( "applicationContext.xml"); } /**每次清库1800 * 2,自动提交(2.388,2.388,2.871,2.809,2.683)平均2.6278 * 1,手动提交(2.825,2.717,2.294,2.076,2.169)平均2.4162 * 不清库,每次1800 * 2,自动提交(2.981,3.261,3.433,1.888,1.935) * 1,手动提交(2.091,2.293,3.354,1.95,2.371,) * 5000 * 2,自动提交(6.397,5.43,6.584,6.35,4.853) 平均5.9228 * 1,手动提交(4.166,5.913,4.634,2.762,4.962) 平均4.4874 */ @Test public void testInsert() throws SQLException, ClassNotFoundException{ double start = System.currentTimeMillis(); SyslogAlarmDao sad = this.getSyslogAlarmDao(); ;i<;i++){ Customer c = new Customer(); c.setId(1L); Device d = new Device(); d.setId(1L); d.setCustomer(c); Alarm alarm = new Alarm(); alarm.setAdeskAlarmId((long) i); alarm.setCreateTime(new Date().getTime()); alarm.setDevice(d); alarm.setLevel(); alarm.setLocation("location "+i); alarm.setSerialNo("serialno "+i); alarm.setSource(); alarm.setTitle("title "+i); alarm.setType(); alarm.setUploadTime(new Date().getTime()); SyslogAlarm sa = new SyslogAlarm(); sa.setAdvise("advise "+i); sa.setAlarm(alarm); sa.setDescription("description "+i); sa.setLogContent("logcontent "+i); sa.setPriginalLogId(); sa.setReason("reason "+i); sa.setVariables(); sad.insert(sa); } sad.excuteRemainderBatchSQL(); double end300 = System.currentTimeMillis(); System.); } }
如果只是将my-default.ini文件改名为my.ini文件,而不该内部配置,则在执行testInsert的时候速度超慢,即便是插入600条也需要将近二十多秒
然后找来其他版本的my.ini文件,替换掉改名后的my.ini文件,则速度比较快,可以想到问题就出在之前版本的my.ini和改名后的my.ini的文件配置内容上
然后用Compare对比改名前后的my.ini文件内容使用Compare辅助工具进行测试,(使用Compare对比在改名的my.ini文件中不存在的内容,将之前版本的my.ini文件内容逐行添加到改名后文件中,停止mysql服务,保存修改后文件,清空数据库,运行testInsert方法,观察运行时间,如果这条没有效果,继续添加下条配置)
后来就发现有一个配置起了作用
# If set to 1, InnoDB will flush (fsync) the transaction logs to the
# disk at each commit, which offers full ACID behavior. If you are
# willing to compromise this safety, and you are running small
# transactions, you may set this to 0 or 2 to reduce disk I/O to the
# logs. Value 0 means that the log is only written to the log file and
# the log file flushed to disk approximately once per second. Value 2
# means the log is written to the log file at each commit, but the log
# file is only flushed to disk approximately once per second.
innodb_flush_log_at_trx_commit = 2
一、当该配置为2的时候,代码还是如上,自动提交事务,则插入数据速度明显提升,和使用之前版本的my.ini文件几乎是相同的,
二、当该配置为1的时候,代码依然如上,自动提交事务,则插入数据速度又变得明显超慢
三、当该配置依然为1的时候,手动提交事务,即将上述代码con.setAutoCommit(false);和con.commit();的注释去掉,则插入数据也有明显提升,和第一种情况差不多,当插入数据过多时比第一种要快多一些
四、当该配置为2的时候,手动提交事务,即将上述代码con.setAutoCommit(false);和con.commit();的注释去掉,插入速度也会有明显提升。
五、去掉innodb_flush_log_at_trx_commit = 2配置,设置为手动提交事务,插入速度也会明显提升
六、去掉innodb_flush_log_at_trx_commit = 2配置,自动提交事务,速度又是明显超慢。
综上,如果用的是mysql5.6版本,要更改默认配置,目前我们采用的是将my-default.ini文件名改成,my.ini文件名,这样就可以在其中进行文件配置修改
通过上面测试结果也可看出,不管是配置为1或者2,只要是手动提交事务,则都可一提高插入速度,这个是在jdbc中进行的测试,至于hibernate需要就不清楚了
my.ini
# For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html # *** DO NOT EDIT THIS FILE. It's a template which will be copied to the # *** default location during install, and will be replaced if you # *** upgrade to a newer version of MySQL. [mysqld] # generic configuration options port = socket = /tmp/mysql.sock character-set-server=utf8 innodb_print_all_deadlocks= innodb_locks_unsafe_for_binlog= expire_logs_days= event_scheduler= # If , InnoDB will flush (fsync) the transaction logs to the # disk at each commit, which offers full ACID behavior. If you are # willing to compromise this safety, and you are running small # transactions, you may or to reduce disk I/O to the # logs. Value means that the log is only written to the log file and # the log file flushed to disk approximately once per second. Value # means the log is written to the log file at each commit, but the log # file is only flushed to disk approximately once per second. innodb_flush_log_at_trx_commit =
mysql实验的更多相关文章
- MySQL实验准备(二)--Python模拟数据(MySQL数据库)
Python模拟数据(MySQL数据库) 数据模拟 目的:模拟多个表的插入和查询数据的模拟,再通过基准测试脚本测试服务器性能和收集数据,仿真模拟. 备注: 如果需要基础的python环境,可以查看&l ...
- MySQL实验准备(一)--环境准备
MySQL实验脚本准备(一) python操纵数据库的实验环境 安装pip 1.下载脚本文件 [root@db01 .vnc]# wget https://bootstrap.pypa.io/get- ...
- MySQL实验 内连接优化order by+limit 以及添加索引再次改进
MySQL实验 内连接优化order by+limit 以及添加索引再次改进 在进行子查询优化双参数limit时我萌生了测试更加符合实际生产需要的ORDER BY + LIMIT的想法,或许我们也可以 ...
- MySQL实验 子查询优化双参数limit
MySQL实验 子查询优化双参数limit 没想到双参数limit还有优化的余地,为了亲眼见到,今天来亲自实验一下. 实验准备 使用MySQL官方的大数据库employees进行实验,导入该示例库 ...
- Centos7+lnmp+zabbix4+分离mysql实验
一.简介 1.什么是zabbix zabbix是一个企业级的.开源的.分布式的监控套件. zabbix可以对网络和服务进行完整性,健康性的监控.zabbix利用灵活的告警机制,可以实验微信,短信和邮件 ...
- JDBC入门之一--连接Mysql实验
工具:mysql-connector-java-5.1.40.eclipse 1)首先要将mysql-connector-java包整合到eclipse中,右击项目,然后选择build path,出现 ...
- mysql 实验论证 innodb表级锁与行级锁
innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的. 表锁演示(无索引) Session1: mysql> set autocommit=0; mysql> select * ...
- MySQL实验1: 新建一个名为 library 的数据库,包含 book、reader 两张表,根据自己的理解安排表的内容并插入数据。
数据表(table)简称表,它是数据库最重要的组成部分之一.数据库只是一个框架,表才是实质内容. 实验: 新建一个名为 library的数据库,包含 book.reader两张表,根据自己的理解安排表 ...
- mysql 实验
http://yangyaru0108.blog.51cto.com/6616699/1205001
随机推荐
- phpexecel 导入导出,格式
1.日期时间合并到c中 =a1 &b1 或 =a1 + b1 这些都是运算符 2.此时c1的值是这条公式,而并不是公式运算的结果 复制c,粘贴到d,选择粘贴值 3.此时c是时间日期格式的,如需 ...
- Android自动化压力测试之Monkey Test Android常见的错误类型及黑白名单的使用方法(四)
Android常见的错误类型有两种 1.ANR类型 1)在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸) 2)BroadcastReceiver在10秒内没有执行完毕 2.Crash类型 1)异 ...
- Liferay 6.2 改造系列之二十一:修改WebSphare下JSONWS服务不生效的BUG
问题原因是WebSphare下,servletContext.getContextPath()获取到的值为“/”而非空字符串. 在/portal-master/portal-impl/src/com/ ...
- Webbrowser中显示MHT文件
把MHT文件存成临时文件,用WEBBROWSER的Navigate方法打开,代码如下: //从程序集中读取资源文件 Assembly asmm = Assembly.GetCallingAssembl ...
- XSS攻击&SQL注入攻击&CSRF攻击?
- XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意 ...
- SQL初级第二课
随着我们数据库越来越复杂 我们要掌握的姿势也要也来越多.... 首先建立个表 create table shop(code int primary key identity (1,1),name va ...
- Postman - HTTP接口测试工具
Postman 是一个 Chrome 的 插件,它主要是用来模拟各种HTTP请求的(如:get/post/delete/put..等等),下面介绍下Postman的安装和使用方法: 一.安装Postm ...
- HDU5739 Fantasia(点双连通分量 + Block Forest Data Structure)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5739 Description Professor Zhang has an undirect ...
- POJ1815 Friendship(字典序最小最小割割边集)
看了题解.当时也觉得用邻接矩阵挺好写的,直接memset:然而邻接矩阵不懂得改,于是就放开那个模板,写了Dinic.. 方法是,按字典序枚举每一条满流的边,然后令其容量减1,如果最大流改变了,这条边就 ...
- jqgrid在colModel中多次调用同一个字段值
Debug: 代码1: { name : 'input', index : 'input', width : 100, align : "center", formatter : ...