这次研究是H2数据库了,关键还是再Linux下进行搭建部署的,被这个数据库快弄死了弄了4天时间,现在大致可以用了,还有些细节需要修正。

我这边使用的是springboot集成模式。直接使用代码启停方式的就和我的描述就不一样了。

H2数据库有3钟模式mem,file,remote 3种模式。

内存就不说了,这个就是临时的,我觉得用内存还不如jvm内存呢。没啥意思。当然也是由于我没有细究的缘故。

file模式是本地模式。本地创建相应的数据库文件,然后进行调用。这里会存在个问题就是本地用了file之后,我其他电脑想访问这个数据库就是没法打开。报错是数据库被占用。这个是真心难受。

那么使用remote模式这边会存在直接springboot启动起不来。

那么这会就需要借用H2数据库官网上的启动方式了。网址:http://www.h2database.com/

这里将最新版的程序下载下来。version 2.1.214这个版本,在本地解压后bin目录下有个h2w.bat 文件,windows下直接启动就好了。Linux下就需要使用指令去启动了。

相关指令如下:

java -cp h2-2.1.214.jar org.h2.tools.Server -web -webAllowOthers -tcp -tcpAllowOthers -ifNotExists

这里我详细说几个参数webAllowOthers,web管理界面是否在其他IP中可以访问,tcpAllowOthers ,其他电脑是否可以通过remote模式访问该系统的H2数据库,ifNotExists数据库不存在时是否允许创建,一般linux启动的时候这个是不开启的,不然你的linux系统中会充斥着一堆杂七杂八的数据库。通过linux系统自启。

如果你想修改默认的tcp端口,那也是可以的需要将这个入参带上    -tcpPort 19200

如果大家好奇有哪些入参可以带入,我在这边就稍微截点源码出来:

 1 public void init(String... args) {
2 // set the serverPropertiesDir, because it's used in loadProperties()
3 for (int i = 0; args != null && i < args.length; i++) {
4 if ("-properties".equals(args[i])) {
5 serverPropertiesDir = args[++i];
6 }
7 }
8 Properties prop = loadProperties();
9 port = SortedProperties.getIntProperty(prop,
10 "webPort", Constants.DEFAULT_HTTP_PORT);
11 ssl = SortedProperties.getBooleanProperty(prop,
12 "webSSL", false);
13 allowOthers = SortedProperties.getBooleanProperty(prop,
14 "webAllowOthers", false);
15 setExternalNames(SortedProperties.getStringProperty(prop, "webExternalNames", null));
16 setAdminPassword(SortedProperties.getStringProperty(prop, "webAdminPassword", null));
17 commandHistoryString = prop.getProperty(COMMAND_HISTORY);
18 for (int i = 0; args != null && i < args.length; i++) {
19 String a = args[i];
20 if (Tool.isOption(a, "-webPort")) {
21 port = Integer.decode(args[++i]);
22 } else if (Tool.isOption(a, "-webSSL")) {
23 ssl = true;
24 } else if (Tool.isOption(a, "-webAllowOthers")) {
25 allowOthers = true;
26 } else if (Tool.isOption(a, "-webExternalNames")) {
27 setExternalNames(args[++i]);
28 } else if (Tool.isOption(a, "-webDaemon")) {
29 isDaemon = true;
30 } else if (Tool.isOption(a, "-baseDir")) {
31 String baseDir = args[++i];
32 SysProperties.setBaseDir(baseDir);
33 } else if (Tool.isOption(a, "-ifExists")) {
34 ifExists = true;
35 } else if (Tool.isOption(a, "-ifNotExists")) {
36 ifExists = false;
37 } else if (Tool.isOption(a, "-webAdminPassword")) {
38 setAdminPassword(args[++i]);
39 } else if (Tool.isOption(a, "-properties")) {
40 // already set
41 i++;
42 } else if (Tool.isOption(a, "-trace")) {
43 trace = true;
44 }
45 }
46 // if (driverList != null) {
47 // try {
48 // String[] drivers =
49 // StringUtils.arraySplit(driverList, ',', false);
50 // URL[] urls = new URL[drivers.length];
51 // for(int i=0; i<drivers.length; i++) {
52 // urls[i] = new URL(drivers[i]);
53 // }
54 // urlClassLoader = URLClassLoader.newInstance(urls);
55 // } catch (MalformedURLException e) {
56 // TraceSystem.traceThrowable(e);
57 // }
58 // }
59 for (String[] lang : LANGUAGES) {
60 languages.add(lang[0]);
61 }
62 if (allowOthers) {
63 key = null;
64 }
65 updateURL();
66 }
 1 public void init(String... args) {
2 port = Constants.DEFAULT_TCP_PORT;
3 for (int i = 0; args != null && i < args.length; i++) {
4 String a = args[i];
5 if (Tool.isOption(a, "-trace")) {
6 trace = true;
7 } else if (Tool.isOption(a, "-tcpSSL")) {
8 ssl = true;
9 } else if (Tool.isOption(a, "-tcpPort")) {
10 port = Integer.decode(args[++i]);
11 portIsSet = true;
12 } else if (Tool.isOption(a, "-tcpPassword")) {
13 managementPassword = args[++i];
14 } else if (Tool.isOption(a, "-baseDir")) {
15 baseDir = args[++i];
16 } else if (Tool.isOption(a, "-key")) {
17 key = args[++i];
18 keyDatabase = args[++i];
19 } else if (Tool.isOption(a, "-tcpAllowOthers")) {
20 allowOthers = true;
21 } else if (Tool.isOption(a, "-tcpDaemon")) {
22 isDaemon = true;
23 } else if (Tool.isOption(a, "-ifExists")) {
24 ifExists = true;
25 } else if (Tool.isOption(a, "-ifNotExists")) {
26 ifExists = false;
27 }
28 }
29 }

TCP server running at tcp://192.168.1.126:9092 (others can connect)
Web Console server running at http://192.168.1.126:8082 (others can connect)

在这里你会发现,tcp的默认端口是9092,web访问的端口是8082

从这两张图中也可以看出,带不带端口效果都是一致的。

当然这些参数你也可以在H2的源码中找到相应的地方在,在这个类中:org.h2.engine.Constants。

在linux系统中直接将其以程序的形式进行启动后,其他应用就可以通过remote的形式进行调用了。友情提示,启动H2的时候需要使用nohup进行启动。

这里我将我的H2配置信息发出来

 1 #设置H2驱动
2 spring.datasource.driver-class-name=org.h2.Driver
3 #设置H2远程TCP地址
4 spring.datasource.url = jdbc:h2:tcp://192.168.?.???/~/test1
5 #设置web界面是否启用
6 spring.h2.console.enabled=true
7 #设置其他ip地址是否可以访问webConsole
8 spring.h2.console.settings.web-allow-others=true
9 #设置H2默认地址
10 spring.h2.console.path=/h2
11 #实际地址就是 url:端口/程序默认地址/h2 这些配置信息可以去 org.springframework.boot.autoconfigure.h2下的H2ConsoleProperties中进行查看,真的不是我不想多点参数控制,而是springboot就只开放了这些。这是真心难受啊。

其他小知识,在h2的webConsole控制台如下图

这里有个配置功能,然后你一开始点击是能点击进去的,进入配置控制界面。但是一保存时候发现一直要输入密码,关键是我前前后后找了1天都没找到密码是哪里设置的。真心吐血,后面发现,保存之后他就会在windows系统中的用户目录下创建一个.h2.server.properties一个文件,自从有了这个文件就需要输入密码了。删掉就没有了。

后面我通过代码跟踪的形式去查了源码发现他的登录接口核心代码

 1 private String adminLogin() {
2 String password = attributes.getProperty("password");
3 if (password == null || password.isEmpty() || !server.checkAdminPassword(password)) {//将if屏蔽了就可以不用管密码了
4 return "adminLogin.jsp";
5 }
6 String back = (String) session.remove("adminBack");
7 session.put("admin", true);
8 return back != null ? back : "admin.do";
9 }
10
11 boolean checkAdminPassword(String password) {
12 if (adminPassword == null) {
13 return false;
14 }
15 byte[] salt = Arrays.copyOf(adminPassword, 32);
16 byte[] hash = new byte[32];
17 System.arraycopy(adminPassword, 32, hash, 0, 32);
18 return Utils.compareSecure(hash, SHA256.getHashWithSalt(password.getBytes(StandardCharsets.UTF_8), salt));
19 }

看到这里的小伙伴应该知道他的坑爹之处了吧,密码不能为空,管理员默认密码也不能为空。关键是我执行到adminPassword的时候他是空的。真的是坑爹啊。当然将其屏蔽调就可以了,我调整之后,我的系统进入webConsole的配置界面已经不需要这个该死的密码认证了。真是白花了我一天的时间,在这里我为那1天时间默哀10秒钟。

springboot H2 linux下搭建使用的更多相关文章

  1. MongoDB学习笔记—Linux下搭建MongoDB环境

    1.MongoDB简单说明 a MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应用提供可扩展的高性能数据存储解决方案. b MongoDB是一个介于关系 ...

  2. Linux下搭建个人网站

    前不久在阿里买了一个服务器,然后开始第一次尝试搭建自己的个人网站.前端采用了bootstrap框架,后端采用的是PHP,数据库使用的是Mysql.新手第一次在linux下搭建遇见很多问题,在这里分享一 ...

  3. Linux下搭建PHP环境

    转载于: http://www.uxtribe.com/php/405.html 该站下有系列PHP文章. 在Linux下搭建PHP环境比Windows下要复杂得多.除了安装Apache,PHP等软件 ...

  4. Java学习心得之 Linux下搭建Java环境

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Java学习心得之 Linux下搭建Java环境 1.前言2.JDK安装3.配置环境变量4. ...

  5. Java学习心得之 Linux下搭建JavaWeb环境

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Java学习心得之 Linux下搭建JavaWeb环境 1. 前言2. Java安装3. t ...

  6. Ruby学习心得之 Linux下搭建Ruby环境

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Ruby学习心得之 Linux下搭建Ruby环境1.前言2.Linux下安装Ruby环境 一 ...

  7. Linux下搭建Lotus Domino集群

    Linux下搭建Lotus Domino 集群 本文内容是Linux平台下Lotus Domino服务器部署案例(http://chenguang.blog.51cto.com/350944/1334 ...

  8. Linux下搭建 Cocos2d-x-2.1.4 编译环境

    [tonyfield 2013.09.04 ] 参考 Linux下搭建 Cocos2d-x-2.1.4 编译环境 导入 HelloCpp 例程 1. Java 入口 HelloCpp.java Hel ...

  9. Linux下搭建tomcat集群全记录(转)

    本文将讲述如何在Linux下搭建tomcat集群,以及搭建过程中可能的遇到的问题和解决方法.为简单起见,本文演示搭建的集群只有两个tomact节点外加一个apache组成,三者将安装在同一机器上:ap ...

随机推荐

  1. Random的概述和基本使用与生成指定范围的随机数

    Random类用来生成随机数字,使用起来需要三个步骤 1.导包 import java.util.Random; 2.创建 Random random = new Random();//小括号中留空即 ...

  2. npm run dev 启动项目报错我的解决办法

    我的报错截屏 解决方案   1.    config文件中 index 文件中的 host 值如果是数字串就将其改为 localhost 2.    再次尝试 如果有遇到其他问题阔以将 node-mo ...

  3. 蔚来杯2022牛客暑期多校训练营7 CFGJ

    比赛链接 C 题解 方法一 知识点:思维. 先统计没有出现的数,每个都可以随便放,所以作为补位用的. 将原数组左移一位作为预定的答案数组,然后开始检查.如果和原数组一样,则用补位数字填充,如果不一样就 ...

  4. Dolphin Scheduler 1.2.0 部署参数分析

    本文章经授权转载 1 组件介绍 Apache Dolphin Scheduler是一个分布式易扩展的可视化DAG工作流任务调度系统.致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程 ...

  5. LuoguP5322 [BJOI2019]排兵布阵(DP)

    城为物,人为容,价值?排序后,一切都明了 #include <iostream> #include <cstdio> #include <cstring> #inc ...

  6. java-servlet-EL表达式和java标签

    1      Servlet线程安全问题 1st.              为什么说servlet会有线程安全问题? 容器默认情况下,对于某个servlet,只会创建一个实例. 容器收到一个请求,就 ...

  7. 操作系统学习笔记4 | CPU管理 && 多进程图像

    操作系统的核心功能就是管理计算机硬件,而CPU就是计算机中最核心的硬件.而通过学习笔记3的简史回顾,操作系统通过多进程图像实现对CPU的管理.所以多进程图像是操作系统的核心图像. 参考资料: 课程:哈 ...

  8. 乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - 官方扩展集锦(Microsoft.Extensions on Nuget)

    什么是Microsoft.Extensions .NET Platform Extensions是一套.Net官方的API集合,提供了一些常用的编程模式和实用工具,例如依赖项注入.日志记录.缓存.Ho ...

  9. Excelize 发布 2.3.0 版本, Go 语言 Excel 文档基础库

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...

  10. Vue 3-150行代码实现新国标红绿灯效果案例

    昨天刷视频,都是关于新国标红绿灯的,看大家议论纷纷,下班就用150行代码通过Vue组件实践红绿模拟演示,视频也跟大家展示过了.今天接着更新图文版本,大家跟着优雅哥通过该案例实操模拟一下. 不过新国标红 ...