引言
在java语言里访问数据库一般是通过jdbc去访问,jdbc一般用于客户端去联接数据库,并且把相应的sql语句传给数据库服务器,服务器接收到sql请求就开始分发给sql执行引擎解析sql并执行相应任务,在服务器端执行完得到的结果(对于那些更改操作没有相关结果)传输给对应的客户端。
通常情况下,我们经常去编写jdbc客户端,看如何建立连接与服务器交互。如果我们也需要在服务端建立类似mysql一样的sql引擎,使得客户端直接采用类似jdbc的方式去与服务端提交标准sql,最后完成相应的执行任务。
在java中,已经有相关的开源产品来完成这样类似的任务的。其中就有一个sql 引擎h2 就引人注目。该项目的源代码是在sourceforge上可以下载,采用的语言是java,它已经完成了整套sql执行过程流程,只需要你去完成相应的逻辑代码,就能搭建一套完备的sql执行服务器。
同样,对于mysql的java jdbc实现有相应的jar,在开源社区也有相应的jdbc规范实现SqlLine,只需要向其提供h2的驱动客户端就能够访问h2 sql引擎。
h2代码结构
查看源码,可以看到四个重要的package,其中:
- org.h2.jdbc包实现java jdbc的一系列接口,并且提供相应的jdbc驱动org.h2.Driver供java客户端来使用;
- org.h2.server包是h2 sql引擎的服务端实现代码。接收sql请求并解析,最后执行相应DDL,DML操作;
- org.h2.ddl和org.h2.dml包是各种sql命令的执行逻辑实现。如果需要对某种特定的sql类型个性化,那么可以修改这两个包下面对应的执行类。
h2引擎分析
h2构建sql执行引擎服务器,就需要在服务器端监听相应的sql请求。h2服务器的启动类是org.h2.tools.Server,这里面会产生一个org.h2.server.TcpServer对象用于创建相应的监听线程,不断地去接收外来相关请求。
public void listen() { listenerThread = Thread.currentThread(); String threadName = listenerThread.getName(); try { while (!stop) { //不断接收客户端的sql请求 Socket s = serverSocket.accept(); //接收外来的sql请求 TcpServerThread c = new TcpServerThread(s, this, nextThreadId++); 产生一个TcpServerThread Runnable类对象 running.add(c); Thread thread = new Thread(c, threadName + " thread"); //另外创建一个线程去处理sql请求 thread.setDaemon(isDaemon); c.setThread(thread); thread.start(); //新线程TcpServerThread正式运行,初始化客户端传过来的连接信息,及循环通过org.h2.server.TcpServerThread.process()方法根据不同的sql请求类型(例如:update,select,或其它请求类型)去处理sql语句及请求。 } serverSocket = NetUtils.closeSilently(serverSocket); } catch (Exception e) { if (!stop) { TraceSystem.traceThrowable(e); } } stopManagementDb(); }
sql主要分为两大类:1. DDL(例如create表,alter表); 2. DML(例如select表,update表)。每个大类里面也有许多较小的类型。根据不同的类型就走不同的分支代码,例如查询、更新等操作,类型代码在org.h2.engine.SessionRemote类中。最终,不同的类型会产生一个对应的org.h2.command.Command对象,进行相应的操作。因此,如果要修改某个sql类型的执行逻辑,我们只需要在对应的Command类中进行修改。把sql语句转变成Command对象,这需要一个过程,包括解析(parse)sql,最终产生一个Command的继承类org.h2.command.CommandContainer对象。
我们将以DDL或者DML中的create/update等操作时的代码逻辑如下:
if (commit == null) { commit = session.prepareLocal("COMMIT"); //做好相关准备工作(包括解析sql,生成一个org.h2.command.Prepared对象,最后把他们封装成CommandContainer对象) } int old = session.getModificationId(); commit.executeUpdate(); // 执行相应的command
其它
如果需要了解h2的运行流程及client与server端的通信协议,可以参考这篇文章:https://github.com/codefollower/H2-Research/blob/master/docs/协议实现分析/H2数据库client-server协议全解.java
相关推荐
# snakerflow-spring-boot-starter ...3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
H2 database 是一个非常著名的数据库,其性能相当优秀,支持嵌入,client-server模式,支持内存表,cached,text表, 本压缩包 包含 H2 database 源代码和文档 本版本 为最新版本 2010-12-12
SpringBoot 练习:使用 H2 数据库的源代码: 用idea带的 spring-initializr 创建工具创建一个新项目,然后添加依赖和测试用的SQL
与现有工具不同,此开放源代码项目在导出文件周围提供了javax.sql.DataSource包装器,用于使用内存不足的数据库对导出文件中编码的表数据运行SQL查询。 在Java 8下, datapump项目生成一个〜70KB的.jar文件。样本...
通用代码生成器 支持多数据源 #orale com.hotent.cgm.db.impl.OracleHelper #mysql com.hotent.cgm.db.impl.MySqlHelper #h2 com.hotent.cgm.db.impl.H2Helper #sql2005 com.hotent.cgm.db.impl.Sql2005Helper #db2 ...
数据库维护: 在线维护数据库,修改表结构,执行sql.数据源管理: 配置多数据源.代码生成器: 在线生成代码,打包下载.可自定义模板.定时任务: 配置定时任务,使用动态脚本编写任务内容.系统监控: 监控系统资源使用情况....
使用插件架构,并为以下数据库提供附加功能:MySQL / MariaDB,PostgreSQL,Greenplum,Oracle,DB2 LUW,Exasol,SQL Server,Sybase / SAP ASE,SQLite,Firebird,H2,HSQLDB,Derby,Teradata,Vertica,...
5.01-5-手动编译qt源代码过程讲解 `+ }3 y$ y* r 6.01-6-手动实现信号与槽的连接过程4 M. l0 {# Q6 I& B/ G0 i- M1 L1 c 7.01-7-计算器实现思路讲解 8.02-1- 计算器功能的实现4 M) ?/ t H2 }: W/ I. T2 ^ 9.02-2- 对...
alchemy以为脚手架开发的web系统,能够在界面上开发基于flink的sql任务,也支持拉取jar包上传任务。 大家如果觉得有帮助的话,请帮忙点个star 环境 Java 8 Maven3.x Flink 1.8.0(表和hadoop依赖项加入lib目录下...
本文档旨在为初学Activiti的朋友提供入门级别的参考,不会对其原理及其结构进行深层次的探究(更多是因为目前自身理解还不是很透彻),只是为大家理清思路,方便以后更深层次的学习。本文档还有一个重要的特点,那...
在这里,您可以找到该项目的源代码和文档。 该项目将完全支持MongoDB,MySQL,PostgreSQL,H2和SQLITE。 如何安装 玛文 <groupId>com.github.celesteoficial</groupId> <artifactId>databases <version>...
演示简单的 Java 应用程序如何使用 Teiid Embedded 与多个异构数据源/存储(关系数据库、NO-SQL、内存数据网格/缓存、平面文件、Web 服务等)交互。 演示如何为 Teiid 新用户或 Teiid starter 开发新的翻译器/连接...
java简易版开心农场源码 手拉手(hand ...1、使用,源代码完全开源,无商业限制。 2、使用目前最主流的J2EE开发框架,简单易学,学习成本低。 3、数据库无限制,支持MySql、Oracle、SQL Server、H2等数
源代码位于以下路径中:“ product / src / maun / java”,并且还会在此路径中生成一些文件:“ product \ target \”我已经基于SOLID原理设计了项目。数据和生产就绪我想提到我已经将h2用作数据库,但是作为产品...
掌握HTML 网页的基本结构,学会利用HTML " "标记符来编写简单的网页,达到能够编写和阅读HTML网页源代码的目的。 " "实验要求: " "1)熟悉并掌握HTML标记符的用法和功能; " "2)掌握HTML 网页的基本结构,学会利用...
支持各种数据库的分页功能(包括:Mysql/Oracle/SqlServer/Sysbase/PostgreSql/FireBird/H2等) 支持数据库序列功能 组合查询功能,无需动态拼接查询条件,提高开发效率 透明防止SQL注入 表字段查询透明脱敏 NOSQL...
# R% _1 X 65.10 动态sql的实现 66.11 任务 67.1.项目演示 68.2.resultMap 69.3. 页面验证 70.01 商品详细信息介绍8 d& C& c9 g l6 H7 X 71.02 商品详细跳转 72.03 商品详细功能. s$ p" [6 {* r- y) [. R8 D: a 73....
本系统构建的信息流仅是实际业务流所包含的信息的一个有限反映,以昌宏化工经过加工处理后的数据作为主要数据源,并未包含实际业务流中最底层的明细数据。 图2 – 信息流程 信息流中所关注的信息分类: ...