{"id":15336582,"url":"https://github.com/myxof/hypersql","last_synced_at":"2025-07-13T17:38:25.453Z","repository":{"id":82541113,"uuid":"119542027","full_name":"MyXOF/HyperSQL","owner":"MyXOF","description":"HyperSQL source code. A maven project","archived":false,"fork":false,"pushed_at":"2018-01-31T10:32:57.000Z","size":1878,"stargazers_count":4,"open_issues_count":1,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-15T03:11:43.526Z","etag":null,"topics":["hypersql","maven"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MyXOF.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-01-30T13:48:50.000Z","updated_at":"2023-07-14T11:40:58.000Z","dependencies_parsed_at":null,"dependency_job_id":"a7307f34-5d02-47dc-8b72-95ecbc294e18","html_url":"https://github.com/MyXOF/HyperSQL","commit_stats":{"total_commits":8,"total_committers":2,"mean_commits":4.0,"dds":0.25,"last_synced_commit":"d080bc5823c7c7b37a8ff309859f28f089d8da25"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MyXOF%2FHyperSQL","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MyXOF%2FHyperSQL/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MyXOF%2FHyperSQL/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MyXOF%2FHyperSQL/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MyXOF","download_url":"https://codeload.github.com/MyXOF/HyperSQL/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248997079,"owners_count":21195799,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hypersql","maven"],"created_at":"2024-10-01T10:16:33.811Z","updated_at":"2025-04-15T03:12:03.378Z","avatar_url":"https://github.com/MyXOF.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# HyperSQL\n\n[![Build Status](https://travis-ci.org/MyXOF/HyperSQL.svg?branch=master)](https://travis-ci.org/MyXOF/HyperSQL)\n\n包含了HyperSQL项目的源码，已经转化为Maven项目，可以用Eclipse或者IDEA直接导入。\n\n\n## 代码分析\n\n### Server\n\n类**org.hssqldb.server.Server**是启动的入口，运行这个类在控制台里会出现下面的输出:\n\n```shell\n[Server@28d93b30]: Startup sequence initiated from main() method\n[Server@28d93b30]: Could not load properties from file\n[Server@28d93b30]: Using cli/default properties only\n[Server@28d93b30]: Initiating startup sequence...\n[Server@28d93b30]: Server socket opened successfully in 6 ms.\n[Server@28d93b30]: Database [index=0, id=0, db=file:test, alias=] opened successfully in 3233 ms.\n[Server@28d93b30]: Startup sequence completed in 3241 ms.\n[Server@28d93b30]: 2018-01-31 11:19:44.077 HSQLDB server 2.3.5 is online on port 9001\n[Server@28d93b30]: To close normally, connect and execute SHUTDOWN SQL\n[Server@28d93b30]: From command line, use [Ctrl]+[C] to abort abruptly\n```\n\n输出信息中比较有用的是`[Server@28d93b30]: 2018-01-31 11:19:44.077 HSQLDB server 2.3.5 is online on port 9001` 这一行，这表明服务器现在监听9001端口，之后如果要用JDBC去连接，端口就是9001。\n\n程序内部将启动一个后台线程serverThread，名字是“HSQLDB Server”\n\n```java\npublic int start() {\n  //ignore some codes..\n\n  serverThread = new ServerThread(\"HSQLDB Server \");\n\n  if (isDaemon) {\n    serverThread.setDaemon(true);\n  }\n\n  serverThread.start();\n\n  //ignore some codes..\n\n  return previousState;\n}\n```\n\n在serverThread启动的过程中会打开socket连接，用于处理外部的请求。对于每到来的一个请求，都会创建一个线程进行处理。\n\n```java\nprivate void run() {\n\n  //ignore some codes...\n\n  try {\n    // Faster init first:\n    // It is huge waste to fully open the databases, only\n    // to find that the socket address is already in use\n    openServerSocket();\n  } catch (Exception e) {\n    setServerError(e);\n    printError(\"run()/openServerSocket(): \");\n    printStackTrace(e);\n    shutdown(true);\n    return;\n  }\n  \n  //ignore some codes...\n\n  try {\n    /*\n     * This loop is necessary for UNIX w/ Sun Java 1.3 because\n     * in that case the socket.close() elsewhere will not\n     * interrupt this accept().\n     */\n    while (socket != null) {\n      try {\n        handleConnection(socket.accept());\n      } catch (java.io.InterruptedIOException iioe) {}\n    }\n  } catch (IOException ioe) {\n    if (getState() == ServerConstants.SERVER_STATE_ONLINE) {\n      setServerError(ioe);\n      printError(this + \".run()/handleConnection(): \");\n      printStackTrace(ioe);\n    }\n  } catch (Throwable t) {\n    printWithThread(t.toString());\n  } finally {\n    shutdown(false);    // or maybe getServerError() != null?\n  }\n}\n\npublic void handleConnection(Socket s) {\n \n  Thread   t;\n  Runnable r;\n  String   ctn;\n\n  //ignore some codes...\n\n  if (serverProtocol == ServerConstants.SC_PROTOCOL_HSQL) {\n    r   = new ServerConnection(s, this);\n    ctn = ((ServerConnection) r).getConnectionThreadName();\n  } else {\n    r   = new WebServerConnection(s, (WebServer) this);\n    ctn = ((WebServerConnection) r).getConnectionThreadName();\n  }\n\n  t = new Thread(serverConnectionThreadGroup, r, ctn);\n\n  t.start();\n  printWithThread(\"handleConnection() exited\");\n}\n```\n\n在ServerConnection类中，最终转到了odbcExecDirect函数里面的session.execute(r)方法对SQL语句进行处理。\n\n```Java\nprivate void odbcExecDirect(String inStatement)  throws RecoverableOdbcFailure, IOException {\n  //ignore some codes...\n\n  Result r = Result.newExecuteDirectRequest();\n\n  r.setPrepareOrExecuteProperties(\n    statement, 0, 0, StatementTypes.RETURN_COUNT, 0,\n    ResultProperties.defaultPropsValue,\n    ResultConstants.RETURN_NO_GENERATED_KEYS, null, null);\n\n  Result rOut = session.execute(r);\n\n  //ignore some codes...\n}\n```\n\n在Session的execute方法里面EXECDIRECT和BATCHEXECDIRECT分别代表单条执行SQL语句和批量执行SQL语句所对应的逻辑。executeXXXStatement方法负责解析SQL语句并执行，performPostExecute方法负责将结果返回。\n\n```Java\ncase ResultConstants.EXECDIRECT : {\n  Result result = executeDirectStatement(cmd);\n\n  result = performPostExecute(cmd, result);\n  return result;\n}\ncase ResultConstants.BATCHEXECDIRECT : {\n  isBatch = true;\n\n  Result result = executeDirectBatchStatement(cmd);\n\n  result = performPostExecute(cmd, result);\n  return result;\n}\n```\n\n对于SQL解析部分，HyperSQL里面没有采用流行的开源工具antlr而是自己实现了解析，这里不做过多分析。\n\n### JDBC\n\n如果想通过JDBC连接HyperSQL，首先需要在pom文件中加入下面的依赖：\n\n```xml\n\u003c!-- https://mvnrepository.com/artifact/org.hsqldb/hsqldb --\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.hsqldb\u003c/groupId\u003e\n    \u003cartifactId\u003ehsqldb\u003c/artifactId\u003e\n    \u003cversion\u003e2.4.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n之后可以通过标准的SQL语句对HyperSQL进行操作。\n\n```java\nimport java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.ResultSet;\nimport java.sql.SQLException;\nimport java.sql.Statement;\n\npublic class HyperSQLTest {\n\t\n\tpublic static void main(String[] args) throws SQLException {\n\t\tConnection conn = null;\n        String sql;\n\n        String url = \"jdbc:hsqldb:hsql://127.0.0.1:9001\";\n        try {\n\n        \tClass.forName(\"org.hsqldb.jdbcDriver\");\n            System.out.println(\"成功加载HyperSQL驱动程序\");\n            conn = DriverManager.getConnection(url);\n            Statement stmt = conn.createStatement();\n            \n            sql = \"create table student(NO char(20),name varchar(20),primary key(NO))\";\n            int result = stmt.executeUpdate(sql);// executeUpdate语句会返回一个受影响的行数，如果返回-1就没有成功\n            if (result != -1) {\n                System.out.println(\"创建数据表成功\");\n                sql = \"insert into student(NO,name) values('2012001','123')\";\n                result = stmt.executeUpdate(sql);\n                sql = \"insert into student(NO,name) values('2012002','123')\";\n                result = stmt.executeUpdate(sql);\n                sql = \"select * from student\";\n                ResultSet rs = stmt.executeQuery(sql);// executeQuery会返回结果的集合，否则返回空值\n                System.out.println(\"学号\\t姓名\");\n                while (rs.next()) {\n                    System.out.println(rs.getString(1) + \"\\t\" + rs.getString(2));// 入如果返回的是int类型可以用getInt()\n                }\n            }\n        } catch (SQLException e) {\n            System.out.println(\"HyperSQL操作错误\");\n            e.printStackTrace();\n        } catch (Exception e) {\n            e.printStackTrace();\n        } finally {\n            conn.close();\n        }\n\t}\n}\n\n```\n\n\n\n\n\n\n\n\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmyxof%2Fhypersql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmyxof%2Fhypersql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmyxof%2Fhypersql/lists"}