最近看mysql提供的支持java语言的驱动包底层实现,我对于mysql不了解,所以现在卡在了驱动包在向mysql server调用rollback、commit以及其他的操作时候是如何被mysql server接受得到指令,当然具体指令我也不清楚,但是大概了解类似于oracle的undo回滚一样,我是这么想的!今天在iteye主要是询问以下问题?

1.mysql server如何接受client端的指令

2.比如rollback操作,指令长啥样?

3.mysql server接受指令后,后续操作实现(宽泛点亦可,讲深篇幅不够,兴许还看不懂)

以下我是在看mysql底层包所查到的相关代码

public QueryResult executeQuery(final Query dQuery) throws QueryException {

log.finest("Executing streamed query: " + dQuery);

this.hasMoreResults = false;

final StreamedQueryPacket packet = new StreamedQueryPacket(dQuery);

try {

// make sure we are in a good state

packetFetcher.clearInputStream();

packet.send(writer);

} catch (IOException e) {

throw new QueryException("Could not send query: " + e.getMessage(),

-1,

SQLExceptionMapper.SQLStates.CONNECTION_EXCEPTION.getSqlState(),

e);

}

final RawPacket rawPacket;

final ResultPacket resultPacket;

try {

rawPacket = packetFetcher.getRawPacket();

resultPacket = ResultPacketFactory.createResultPacket(rawPacket);

} catch (IOException e) {

throw new QueryException("Could not read resultset: " + e.getMessage(),

-1,

SQLExceptionMapper.SQLStates.CONNECTION_EXCEPTION.getSqlState(),

e);

}

switch (resultPacket.getResultType()) {

case ERROR:

final ErrorPacket ep = (ErrorPacket) resultPacket;

checkIfCancelled();

log.warning("Could not execute query " + dQuery + ": " + ((ErrorPacket) resultPacket).getMessage());

throw new QueryException(ep.getMessage(),

ep.getErrorNumber(),

ep.getSqlState());

case OK:

final OKPacket okpacket = (OKPacket) resultPacket;

this.hasMoreResults = okpacket.getServerStatus().contains(ServerStatus.MORE_RESULTS_EXISTS);

final QueryResult updateResult = new DrizzleUpdateResult(okpacket.getAffectedRows(),

okpacket.getWarnings(),

okpacket.getMessage(),

okpacket.getInsertId());

log.fine("OK, " + okpacket.getAffectedRows());

return updateResult;

case RESULTSET:

log.fine("SELECT executed, fetching result set");

try {

return this.createDrizzleQueryResult((ResultSetPacket) resultPacket);

} catch (IOException e) {

throw new QueryException("Could not read result set: " + e.getMessage(),

-1,

SQLExceptionMapper.SQLStates.CONNECTION_EXCEPTION.getSqlState(),

e);

}

default:

log.severe("Could not parse result..." + resultPacket.getResultType());

throw new QueryException("Could not parse result", (short) -1, SQLExceptionMapper.SQLStates.INTERRUPTED_EXCEPTION.getSqlState());

}

}

public int send(final OutputStream ostream) throws IOException,

QueryException

{

if (query.length() > MAX_PACKET_LENGTH - HEADER_LENGTH)

{

// Query can not be sent on only one network packet

return sendSplittedQuery(ostream);

}

else

{

byte[] byteHeader = Utils.copyWithLength(

intToByteArray( query.length() + 1), 5);

byteHeader[3] = (byte) 0;

byteHeader[4] = (byte) 0x03;

ostream.write(byteHeader);

query.writeTo(ostream);

ostream.flush();

return 0;

}

}

private int sendSplittedQuery(OutputStream ostream) throws QueryException,

IOException

{

int remainingBytes = query.length();

int offset = 0;

int packetIndex = 0;

while (remainingBytes >= 0L)

{

int packLength = Math.min(remainingBytes, MAX_PACKET_LENGTH);

byte[] byteHeader = null;

if (packetIndex == 0)

{

byteHeader = Utils.copyWithLength(intToByteArray(packLength), 5);

// Add the command byte

byteHeader[4] = (byte) 0x03;

// And remove 1 byte from available data length

packLength -= 1;

}

else

{

byteHeader = Utils.copyWithLength(intToByteArray(packLength), 4);

}

byteHeader[3] = (byte) packetIndex;

if(log.isLoggable(Level.FINEST)) {

log.finest("Sending packet " + packetIndex + " with length = "

+ packLength + " / " + remainingBytes);

}

ostream.write(byteHeader);

if(log.isLoggable(Level.FINEST)) {

log.finest("Header is " + MySQLProtocol.hexdump(byteHeader, 0));

}

if (packLength > 0)

{

query.writeTo(ostream, offset, packLength);

}

ostream.flush();

if (remainingBytes >= MAX_PACKET_LENGTH)

{

remainingBytes -= packLength;

offset += packLength;

packetIndex++;

}

else

remainingBytes = -1;

}

return packetIndex;

}

2014年4月23日 15:18

mysql 驱动指令_Mysql的驱动包如何发送指令给MYSQL SERVER相关推荐

  1. linux mysql odbc驱动安装_MySQL ODBC 驱动安装

    阅读目录 一.在线安装 1.yum在线安装驱动 2.配置驱动 3.测试连接 二.编译安装 1.MySQL创建测试用户和测试库 2.安装驱动 3.配置驱动 4.测试 一.在线安装 1.yum在线安装驱动 ...

  2. 二进制安装的mysql怎么卸载_mysql安装-----二进制包安装及卸载

    1. 首先准备好二进制安装包 mysql-advanced-5.6.25-linux-glibc2.5-x86_64.tar.gz 2. 进行安装 shell> groupadd mysql s ...

  3. lepus mysql 复制监控_MySQL数据库之CentOS搭建lepus3.8监控MySQL

    本文主要向大家介绍了MySQL数据库之CentOS搭建lepus3.8监控MySQL ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. LNMP环境 yum -y install ...

  4. 0基础能学mysql数据库吗_mysql学习入门:零基础如何使用mysql创建数据库表?

    零基础如何自学Mysql创建数据库,是Mysql学习者必经之路,Mysql是受欢迎的关系数据库管理系统,WEB应用方面MySQL是很好的RDBMS应用软件之一.如何使用Mysql创建数据库表,打开My ...

  5. mysql 闪回_MySQL数据误删除的快速解决方法(MySQL闪回工具)

    概述 Binlog2sql是一个Python开发开源的MySQL Binlog解析工具,能够将Binlog解析为原始的SQL,也支持将Binlog解析为回滚的SQL,去除主键的INSERT SQL,是 ...

  6. jdbc版本低MySQL版本高_Mysql JDBC驱动版本与Mysql版本的对应问题解决

    好长时间不用Mysql了, 昨天朋友有一个小项目在我的机器上跑的一点问题都没有, 到他的机器上却是报服务器内部错误(500), 用QQ上远程协助(太慢 好长时间不用Mysql了, 昨天朋友有一个小项目 ...

  7. linux mysql odbc驱动安装_mysql odb驱动_Mysql的odbc driver安装配置(Linux)

    一.下载与安装 下载地址(tar.gz):https://dev.mysql.com/downloads/connector/odbc/ 安装: #tar -zxvf mysql-connector- ...

  8. 武汉mysql ocp考点_MySQL OCP考试复习系列–开篇:了解MySQL考试

    MySQL OCP考试复习系列–开篇:了解MySQL考试 嗯,那个决定去考MySQL OCP了,事实上最近工作一直围绕着DB2,MySQL要去考的话需要好好的复习的啊. 150分钟,100道多选,答对 ...

  9. mysql dba管理_Mysql DBA 高级运维学习之路-mysql数据库常用管理应用

    1.创建数据库 命令语法:create database 注意库名不能数字开头 (1)创建linzhongniao库 mysql> create database linzhongniao; Q ...

  10. mysql 密码大小写_MySQL数据库加密和解密~认证登陆密码(mysql.user)和MySQL不区分大小写...

    MySQL数据库认证密码有两种方式: 1:MySQL 4.1版本之前是MySQL323加密 2:MySQL 4.1和之后的版本都是MySQLSHA1加密 还有函数:AES_ENCRYPT()加密函数和 ...

最新文章

  1. springMVC对异常处理的支持
  2. 解决ssm项目表单数据提交到数据库乱码问题
  3. C语言 泛型链表 如何计算(结构体中各元素)相对内存地址?(字节对齐,结构体对齐)offsetof()函数 ( (struct X*)0 ) -> Y)语法(匿名结构体)
  4. windows远程桌面超出最大连接数强制登录命令
  5. Seize Operation Master
  6. Java Socket编程中使用ObjectOutputStream 和 ObjectInputStream 出现问题
  7. 设计模式--观察者模式--Java实现
  8. 蓝桥杯 ALGO-12 算法训练 幂方分解
  9. DJ 算法的队列优先优化
  10. 中断按键c语言程序设计,C语言程序设计:INT0及INT1中断计数
  11. 用Python绘制折线图(下)
  12. ppt流程图箭头分叉_职场PPT实战:流程图只能箭头方框?设计师教你新思路
  13. Scrapy爬虫以及Scrapyd爬虫部署
  14. html图片轮播代码 贴吧,JS实现简易图片轮播效果的方法
  15. QLabel setText 标红 加粗
  16. 微信自定义分享功能实现
  17. Could not start on port 1099 3837
  18. ffmpeg 实现音频aac编码
  19. 生成器进阶--yield from
  20. About Garbage Collector and finilize()

热门文章

  1. 关于ES6 Class语法相关总结
  2. python-PIL-16bit-灰度图像生成-tiff
  3. Java solrj client 添加JavaEntity Bean
  4. 在线读取office 文件(Word excel 等)
  5. 按要求编写Java程序(阶乘)
  6. 追求--MarsCoara
  7. 3.使用SqlCommand执行SQL语句
  8. 在 Nvidia 显卡下设置装备铺排双浮现器
  9. String转LocalDateTime
  10. 与代数式xyz所对应的C语言表达式是,C程序习题集讲解.doc