springboot H2 linux下搭建使用
这次研究是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下搭建使用的更多相关文章
- MongoDB学习笔记—Linux下搭建MongoDB环境
1.MongoDB简单说明 a MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应用提供可扩展的高性能数据存储解决方案. b MongoDB是一个介于关系 ...
- Linux下搭建个人网站
前不久在阿里买了一个服务器,然后开始第一次尝试搭建自己的个人网站.前端采用了bootstrap框架,后端采用的是PHP,数据库使用的是Mysql.新手第一次在linux下搭建遇见很多问题,在这里分享一 ...
- Linux下搭建PHP环境
转载于: http://www.uxtribe.com/php/405.html 该站下有系列PHP文章. 在Linux下搭建PHP环境比Windows下要复杂得多.除了安装Apache,PHP等软件 ...
- Java学习心得之 Linux下搭建Java环境
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Java学习心得之 Linux下搭建Java环境 1.前言2.JDK安装3.配置环境变量4. ...
- Java学习心得之 Linux下搭建JavaWeb环境
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Java学习心得之 Linux下搭建JavaWeb环境 1. 前言2. Java安装3. t ...
- Ruby学习心得之 Linux下搭建Ruby环境
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Ruby学习心得之 Linux下搭建Ruby环境1.前言2.Linux下安装Ruby环境 一 ...
- Linux下搭建Lotus Domino集群
Linux下搭建Lotus Domino 集群 本文内容是Linux平台下Lotus Domino服务器部署案例(http://chenguang.blog.51cto.com/350944/1334 ...
- Linux下搭建 Cocos2d-x-2.1.4 编译环境
[tonyfield 2013.09.04 ] 参考 Linux下搭建 Cocos2d-x-2.1.4 编译环境 导入 HelloCpp 例程 1. Java 入口 HelloCpp.java Hel ...
- Linux下搭建tomcat集群全记录(转)
本文将讲述如何在Linux下搭建tomcat集群,以及搭建过程中可能的遇到的问题和解决方法.为简单起见,本文演示搭建的集群只有两个tomact节点外加一个apache组成,三者将安装在同一机器上:ap ...
随机推荐
- CMake教程——Leeds_Garden
本系列适合 乐于学习新知识的人 想要深入学习C++的人 赞美作者的人 系列目录 初步入门 基本操作 (更新中) 创作不易,欢迎分享,把知识分享给更多有需要的人.
- C# 从补码中获取有符号数的实际数值
C# 从补码中获取有符号数的实际数值 原理 计算机存储数据时,默认是存储数据的补码.有符号的数粗存在符号位(最高位). 这里就会提到原码.反码.补码的概念. 原码:用符号位和数值表示带符号数,正数的符 ...
- 基于webgl(threejs)的路面编辑
楔子 在很多应用中,特别是一些园区类的应用. 都需要对园区的地面 环境进行展示,路面就是地面的一部分. 通常的做法是,都是建模的时候把相关的元素都建好,然后导入到展示系统中进行展示. 不过有些情况下, ...
- 它把RabbitMQ的复杂全屏蔽了,我朋友用它后被老板一夜提拔为.NET架构师
本文技术源自外企,并已在多个世界500强大型项目开发中运用. 本文适合有初/中级.NET知识的同学阅读.(支持.NET/.NET Framework/.NET Core) RabbitMQ作为一款主流 ...
- 基于 Apache Hudi 和DBT 构建开放的Lakehouse
本博客的重点展示如何利用增量数据处理和执行字段级更新来构建一个开放式 Lakehouse. 我们很高兴地宣布,用户现在可以使用 Apache Hudi + dbt 来构建开放Lakehouse. 在深 ...
- Java开发学习(二十八)----拦截器(Interceptor)详细解析
一.拦截器概念 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如 ...
- Android Module配置C++支持
AndroidStudio提供了创建项目时选择C++支持的模板,但是新建Module的时候并没有C++模板, 要如何配置Module的C++支持呢? 虽然Module没有提供C++模板,但是我们可以手 ...
- 关于python文件写入问题
第一种.用for循环不断打开文件写入关闭 测试代码数据如下: import time begin = time.perf_counter() def a(f, lis): f.write(lis + ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 四.创建一个Blazor应用程序 1. 第一种创 ...
- KingbaseES 创建只读(read_only)用户
数据库版本: prod=> select version(); version --------------------------------------------------------- ...