几种数据库的jdbc驱动实现

2023-11-02

要实现自己的JDBC驱动,最重要的是实现以下几个接口:

  • java.sql.Driver
  • java.sql.Connection
  • java.sql.Statement
  • java.sql.ResultSet

这篇文章讲解了如何实现一个简单的jdbc驱动: http://www.javaworld.com/javaworld/jw-05-2002/jw-0517-jdbcdriver.html

 

但是一个成熟的jdbc驱动, 光实现以上4个接口是不够的。用户经常使用数据库的元数据(metadata)信息, 比如返回某个库中所有表的相关信息; 或者结果集(ResultSet)的元数据信息, 比如返回某结果集所有列的列名。靠以上4接口不能实现,所以还得实现一些java.sql.XXMetaData的接口,另外还有一些例如java.sql.DataSource, java.sql.Savepoint都是比较重要的。

1. cloudbase

对于所有jdbc实现来说, Driver接口最重要的方法就是connect().以下是cloudbase中CBDriver的connect()方法实现.

  public Connection connect( String url, java.util.Properties info)
    throws SQLException
  {
    if( !acceptsURL( url))
    {
      return null;
    }

    String[] connParams = parseUrl( url);
    String host = connParams[0];
    int port = Integer.parseInt( connParams[1]);
    String user = "test";
    String password = "test";
    CBConnection conn = new CBConnection( host, port, user, password);
    return conn;
  }
 

客户端通过CBConnection建立一个socket连接到CBServer上去, 形成一个输入和一个输出流。

CBConnection( String server, int port, String user, String pass)
    throws SQLException
  {
    try
    {
      socket = new Socket( server, port);
      socket.setSoTimeout( 900);
      
      InputStream inStream = socket.getInputStream( );
      InputStreamReader inStreamReader = new InputStreamReader( inStream);
      sockIn = new BufferedReader( inStreamReader);
      sockOut = new PrintStream( socket.getOutputStream( ));
      
      String payload = user + "\t" + pass;
      sockOut.println( payload);
      
      String dbMetaDataStr = sockIn.readLine( );
      dbMetaData = new CBDBMetaData( this, dbMetaDataStr);
      
      this.port = port;
      this.user = user;
      this.server = server;
      cmdMap = new Hashtable<String,Callback>( );
      srr = new ServerResponseReader( );
      srr.start( );
    }
...
  }
 


客户端连接的时候首先把user和password写入到输入流中, 服务端CBServer验证后,会把数据库的元数据(DataBaseMetaData)信息发信给客户端, 见com.business.cloudbase.net.DBMetaData类, 它把数据库元数据放入到一个map中,通过StringBuiilder把这个map序列化写入到socket接收端。

 

下面说以两个例子说明cloudbase的jdbc驱动是怎么工作的:

(1) sql查询

(2) 获得当前库所有表的信息

JDBC中DataBaseMetaData.getTables()方法实现此接口, 返回ResultSet类型。此结果集包含以下几列:

  1. TABLE_CAT String => 表类别(可为 null
  2. TABLE_SCHEM String => 表模式(可为 null
  3. TABLE_NAME String => 表名称
  4. TABLE_TYPE String => 表类型。典型的类型是 "TABLE"、"VIEW"、"SYSTEM TABLE"、"GLOBAL TEMPORARY"、"LOCAL TEMPORARY"、"ALIAS" 和 "SYNONYM"。
  5. REMARKS String => 表的解释性注释
  6. TYPE_CAT String => 类型的类别(可为 null
  7. TYPE_SCHEM String => 类型模式(可为 null
  8. TYPE_NAME String => 类型名称(可为 null
  9. SELF_REFERENCING_COL_NAME String => 有类型表的指定 "identifier" 列的名称(可为 null
  10. REF_GENERATION String => 指定在 SELF_REFERENCING_COL_NAME 中创建值的方式。这些值为 "SYSTEM"、"USER" 和 "DERIVED"。(可能为 null

这是jdbc规定的。

 

2. hsqldb

hsqldb把数据库的元数据也存在hsqldb的表中, 这些表是系统表. 因此获取元数据,就是select系统表的数据.

Server端每接收到一个客户端的连接, 就建立一个线程和一个新的会话(Session).

 

3. derby

derby的服务器端实现在drba包里.

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

几种数据库的jdbc驱动实现 的相关文章

  • MySQL如何根据字段是否存在来插入新记录或更新字段?

    我正在尝试实现一个评级系统 在数据库表中保留以下两个字段 评级 当前评级 num rates 迄今为止提交的评分数量 UPDATE mytable SET rating rating num rates theRating num rate
  • Oracle SQL——从字符串中删除部分重复项

    我有一个表 其中有一列包含字符串 如下所示 static text here 1abcdefg1abcdefgpxq 从这个字符串1abcdefg重复两次 所以我想删除该部分字符串 然后返回 static text here 1abcdef
  • 标记个体内事件发生后发生的日期

    我有一组长格式的数据 每人几行 人 id 其中事件 事件 1 应该只发生一次 事件发生后 该人不应再有任何数据 如果事件发生后出现任何记录 我想使用名为 flag flag 1 的新变量创建一个查询 例如 下面标记了 id 5 因为在该人的
  • SQL 更新数据集中的位置

    id1 id2 bool 1 1 F 1 2 F 2 1 F UPDATE table name SET bool T WHERE id1 id2 IN 1 1 2 1 Need work here 所以基本上我想选择条件为 id1 id2
  • 插入后触发更新表列?

    在同一个表中添加任何记录后 我需要更新表中的列 这是我的sql代码 CREATE TRIGGER dbo EmployeeInsert ON dbo APP Employees AFTER INSERT AS BEGIN SET NOCOU
  • SQL 用新值替换旧值

    我有一个名为tbl Products 其中有一列名为articlenumber并且充满了像这样的数字s401 s402 etc 我生成了一个包含新商品编号的列表 它将替换旧的商品编号 s401 I00010 s402 I00020 s403
  • 如何从Java中的连接获取查询字符串?

    我正在编写一个方法 尝试记录数据库调用 形成连接到它的连接 在查询之后 有很多地方调用方法 connect 来启动并调用 cleanUp 方法来结束 我不能并且不想修改每个地方 所以顺序是这样的 Connection con connect
  • SQL:比较不同表中的两个计数

    我有 3 张桌子 一张桌子上有世界上每个国家及其代币 NAME CODE Afghanistan AFG Albania AL Algeria DZ American Samoa AMSA Andorra AND Angola ANG An
  • 在 plsql 中立即执行

    如何从这段代码中得到结果 EXECUTE IMMEDIATE SELECT FROM table name through for loop 通常的方法看起来像这样 for items in select from this table l
  • MySQL 中的断言

    我有一个针对大型数据库运行的 SQL 脚本 我想在开始时提出几个简单的查询 作为健全性检查 有没有办法在MySQL中写断言 或者任何类型的 选择 如果它与该值不匹配 则中止整个脚本 一些疯狂的代码 要点是 SET可能会引发 mysql 变量
  • 获取查询的行号

    我有一个查询将返回一行 当表排序时 有什么方法可以找到我正在查询的行的行索引吗 我试过了rowid但当我期待第 7 行时却得到了 582 Eg CategoryID Name I9GDS720K4 CatA LPQTOR25XR CatB
  • 具有 LINQ 支持的最完整的 ORM?

    我正在寻找一个提供完整或接近完整的 LINQ 支持的 ORM LINQ 到 SQL 支持 LINQ 内部的所有内容 Contains Math Log 等 在不创建新数据上下文的情况下无法预先加载关系属性 ADO NET 实体框架 糟糕的
  • 从存储过程中的动态 SQL 获取结果

    我正在编写一个存储过程 需要在过程中动态构造 SQL 语句以引用传入的表名称 我需要让这个 SQL 语句返回一个结果 然后我可以在整个过程的其余部分中使用该结果 我尝试过使用临时表和所有内容 但我不断收到一条消息 提示我需要声明变量等 例如
  • 使用MySQL计算单个表中借方和贷方的余额

    下面的 MySQL 表包含带有关联金额的借方或贷方 操作 如何选择具有非零 余额 的所有 CLIENT ID 我尝试将表连接到自身以计算所有借方和贷方总额 但有些东西无法正常工作 CLIENT ID ACTION TYPE ACTION A
  • java中import和class.forName的区别

    import 和 class forName 都会加载类文件 当我在jsp文件中做一个导入mysql数据的例子时 需要通过class forName导入驱动类 当我通过import语句导入jdbc驱动程序时 它无法从tomcat服务器中的m
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • 如果执行没有事务的删除语句,是否会删除部分内容?

    如果表myTable包含100000000条记录 我执行DELETE FROM myTable 没有开始交易并且出现问题 例如服务器电源故障 会删除一些记录吗 否 如果数据库引擎符合ACID http en wikipedia org wi
  • 在 Postgres 中的数组字段上应用聚合函数?

    是否可以对整数 字段 或其他数字数组 中的所有值应用聚合 如 avg stddev CREATE TABLE widget measurement integer insert into widget measurement values
  • 将多行合并为一行并根据行数附加列

    我正在尝试将同一个表的多行合并为一个 我有一个像这样的示例表 Col1 Col2 Col3 Col4 Col5 Col6 1 BH1 CB 12 CC CC Conveyor Mal 1 BH1 CB 104 ZC ZC Full Emp
  • 让 Prometheus 发送 SQL 查询

    我正在尝试使用普罗米修斯 https prometheus io 监视我的 MySQL 数据库 但似乎找不到添加 SQL 查询的区域 例如 我想运行一个返回值的 SQL 查询 然后将该值添加到图表中 发送警报 有没有办法让 Promethe

随机推荐

  • DDD的分层架构

    DDD作为一种指导思想 还是有一些相对来说可以落地的东西 比如说他这个分层架构 整体分为以下四层 实际上基于上图 我们可以把我们项目工程文件再具体一点 填写到上面的图片上 用户接口层 user interface 用户接口层负责向用户显示信
  • poi生成word文档,包含插入表格

    package com controller import java io FileInputStream import java io FileOutputStream import java io IOException import
  • 「京谈客服系统」出击:京东再起TO B战事

    对于企业而言 基于京谈的技术支持 企业能够获得的不仅仅是客服系统的优化重塑 更多的是把业务直接建立在京东对于客服系统的理解之上 从产业的视角重新定义自身客服体系 作者 皮爷 出品 产业家 数字化浪潮正滚滚而来 8月2日 财富 杂志发布了最新
  • PostgreSQL:“more than one owned sequence found“异常问题解决

    问题 本地数据库正常 但还原部署到服务器数据库后 添加表记录时提示 more than one owned sequence found 的异常报错 解决方案 这个问题是自增列引起的 可能迁移或还原数据表结构时出现异常 解决的办法是重置标识
  • 算法-分治算法

    文章目录 分治算法 什么是分治算法 分治算法的优点 分治算法的核心思想 分治算法的技巧 分治算法的边界 分治算法的常见题型及讲解 归并排序及逆序对问题 归并排序 逆序对问题 快速排序和第k小数 快速排序 第k小数 树的遍历 树的先序遍历 树
  • 高手需要具备的思维模型

    01 思维模型 决定了你的人生状态 电影 教父 中 有一句经典台词 花半秒钟看透本质的人 和花一辈子都看不清的人 注定拥有截然不同的命运 思维模型 决定了你的人生状态 2014年 张一鸣观察到移动互联网时代面临的问题 信息爆炸式增长的同时
  • MATLAB零基础入门(一)

    大家好 我是Henry 上一期的Python爬虫实践中 Henry导入了Matplotlib库进行了新冠疫情的每日新增的绘图 其实Matplotlib的原型是另一门应用非常广泛的语言 Matlab 最近Henry也学习了一些Matlab的绘
  • 【C/C++时间系列】通过gmtime()函数将时间戳转换成GMT时间

    GMT Greenwich Mean Time 格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时 也就是在格林尼治时 的时间 地球每天的自转是有些不规则的 而且正在缓慢减速 所以 格林尼治时间已经不再被作为标准时间使用 现在的标准时间
  • 记一次成功把Vue2后台项目改造成Vite2的踩坑经历

    文章目录 前言 一 项目背景 1 1 为什么要选择Vite 二 迁移前的准备 2 1 补全 vue后缀 2 2 移动public index html的位置 2 2 1 通过vite plugin html插件来修改页面标题 2 3 新建v
  • CCF计算机软件能力认证 C++ 权限查询

    问题描述 授权 authorization 是各类业务系统不可缺少的组成部分 系统用户通过授权机制获得系统中各个模块的操作权限 本题中的授权机制是这样设计的 每位用户具有若干角色 每种角色具有若干权限 例如 用户 david 具有 mana
  • Python Flask简介及安装

    Python Flask简介及安装 Flask 是一个 Python 实现的 Web 开发微框架 一 Flask 简介 Flask 诞生于2010年 是 Armin ronacher 人名 用 Python 语言基于 Werkzeug 工具
  • 嵌入式复习题(五)程序分析题

    1 定时器 假设定时器内部时钟为16MHz 1 完成下面的注释 2 可以定时的时间为 5 ms htim3 Instance TIM3 htim3 Init Prescaler 799 预分频系数为799 htim3 Init Counte
  • 【Network】计算机网络基础知识总结

    阅读目录 网络层次划分 OSI七层网络模型 IP地址 子网掩码及网络划分 ARP RARP协议 路由选择协议 TCP IP协议 UDP协议 DNS协议 NAT协议 DHCP协议 HTTP协议 一个举例 网络层次划分 为了使不同计算机厂家生产
  • 神经网络学说的主要观点,对神经网络的简单理解

    心理学中定位说和模块说的区别是 整体说和神经网络学说的区别是 模块说和神经网络学说的区别是 简单说下 希望对你有帮助 定位说认为 大脑的具体功能是对应具体的部位 模块说认为 大脑的具体功能是由多个部位形成的模块共同实现的 而不是具体到位置
  • 论文理解:Generating Diverse High-Fidelity Images with VQ-VAE-2

    深度生成模型都有什么问题 研究者将常见的生成模型分为两种 一种是基于似然的模型 包括 VAE 及其变体 基于流的模型 以及自回归 autoregressive 模型 另一种是隐式生成模型 如生成对抗网络 GAN 这些模型都会存在某些方面的缺
  • 例说数据结构&STL(九)——map

    1 白话map map是STL的一个关联容器 它提供一对一 其中第一个可以称为关键字 每个关键字只能在map中出现一次 第二个可能称为该关键字的值 的数据处理能力 由于这个特性 它完成有可能在我们处理一对一数据的时候 在编程上提供快速通道
  • 【Linux】进程信号及信号产生

    文章目录 一 生活层面的信号 二 进程信号 三 硬件中断 四 信号产生 五 Term Core 1 核心转储的意义 2 云服务器为什么关闭核心转储 3 core dump标志 六 总结 结束语 一 生活层面的信号 在学习进程信号前 我们不妨
  • list 返回json 时 结果出现“$ref“:“$.data[0]“

    1 传入list的对象必须不是创建的一个对象 因为创建一个对象即使复制不同 但是hashcode相同 到json是无法解析 例如 new CheckFavoriteSupplierDto 需要每个都要new新对象 写for循环外会出现 re
  • 【电压质量】提高隔离电源系统的电压质量(Simulink实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 仿真1 2 2 仿真2 3 参考文献 4 Simulink实现 1 概述 为了提高隔
  • 几种数据库的jdbc驱动实现

    要实现自己的JDBC驱动 最重要的是实现以下几个接口 java sql Driver java sql Connection java sql Statement java sql ResultSet 这篇文章讲解了如何实现一个简单的jdb