SpringBoot内嵌H2数据库部署到Linux不能访问H2界面为啥?

在上一章节中,我给大家详细讲解了H2数据库的安装配置,接下来我就带大家在Spring Boot中整合H2数据库,实现代码操作。

我们在resource目录下创建一个db文件夹,在里面创建一个scheme.sql数据库脚本文件,供程序启动时创建出数据库中的表。

并且我们可以打开H2的web控制台,可以看到已经成功的自动帮我们创建出了db02这个数据库。

我们在上面的基础之上,对案例进行改造,把H2的连接模式从内嵌模式改成服务器模式,这种连接方式可以同时允许连接多个客户端,而内嵌模式默认情况下只能连接一个客户端。

注意:嵌入式连接模式,只允许一个连接,如果想多个连接,比如在代码中进行连接和h2控制台中连接,可以使用服务器模式或者混合模式来连接。

H2作为一个内存数据库,主要是用于开发调试或者是学习,真正开发时是不会使用的,所以对于H2这种内存数据库,各位感兴趣的话就玩一玩,也没必要特别的精通。

H2管理系统让你能够通过一个浏览器对H2的SQL数据库进行管理操作。H2管理系统不仅可以连接H2数据库,也可以连接其他支持JDBC接口的数据库。

这是一个B/C/S应用,在服务器和浏览器上都要运行H2的管理程序。根据平台不同,H2管理系统支持多种启动应用的方式。

方式一:单击[开始],[程序],[H2],和[H2 Console(Command Line)]。当使用SUN JDK1.5时,一个标题为H2 Console的窗口将弹出。当使用SUN JDK1.6时,一个数据库图标将被加入WINDOWS到系统托盘。如果既无窗口弹出也没有图标加入到系统托盘,很可能是你的JDK没有正确安装(如果确认自己的JDK安装正确,可以尝试用另外一种方式启动控制台)。另外一个浏览器窗口将被打开,指向的URL是 http:/localhost:8082,是H2管理系统的登录页面。

方式二:打开文件浏览器,切换目录到h2/Bbin,双击运行h2.bat。一个控制台窗口将弹出,如果有问题,将有错误信息在这个窗口里显示。一个浏览器窗口将被打开,指向的URL是,是H2管理系统的登录页面。

在你启动服务时,如果你安装了防护墙,你可能会收到一个防护墙的安全警告。如果不需要其他计算机访问你这台计算机上的H2数据库,你可以让防火墙阻塞H2对外服务的端口,但是本地计算机仍可以访问这些端口。当你需要其他计算机也能访问这台计算机的H2数据库时,你需要让防火墙开放H2对外服务的端口。

有报告显示使用卡巴斯基7.0的防火墙时,使用IP地址访问本地的H2时,速度非常的缓慢,替代的方案是使用localhost代替IP地址来访问。

如果你得到错误的信息,你可能未安装JDK,或是需要将JAVA的可执行文件路径加入到环境变量PATH 中。

如果端口已经被其他应用占用,你需要使用其他端口来启动H2控制台。改变H2的控制台端口需要修改配置文件.h2.server.properties。这个文件存储在用户目录下(在Windows系统中,这个文件通常在Documents and Settings/username)。这个相应的入口实体是webPort.

服务器启动成功后,你就可以使用WEB浏览器访问服务,浏览器需要支持JavaScript。在启动的服务器上启动浏览器,打开URL。在启动服务器之外的计算机上,你需要提供启动服务器的IP地址,如192.168.0.2:8082.如果你在服务器上启用了SSL,URL需要使用头.

支持多个并发的浏览器会话。由于数据对象是存储在服务器上的,同时工作的会话数受限于服务器的内存。

在登录页,你提交连接信息就可以登录到数据库。设置JDBC作为连接数据库的驱动,填入JDBC URL、用户名、密码,单击[Connect]。你能保存和恢复以前设置的信息,这些设置都存储在属性文件中。

多个驱动可以被设置,每个驱动之间通过;分号分隔(WINDOWS),其他系统通过:冒号分隔。在路径中空格被支持,但是这些设置不能被引用。

H2控制台主页面分为三个主要的部分:顶部的工具栏,左边的是对象树,右边的是查询和结果输出栏。数据库对象(如表)都被列在左边的树形上。在查询栏上输入SQL语句点击Run,结果就被输出到命令行的下面。

可以通过在树上点击增加表名和字段名。如果单击表,当这个查询栏是空的时候,”SELECT*FROM 将被自动增加到查询栏。当输入一个表的查询时,对象树上将自动的展开这张表例如,你输入SELECT*FROM TEST TWHERE T,对象树上的表TEST将自动的展开。

断开数据库,点击工具栏上的Disconnect即可,这个时候,数据库服务仍在继续运行,等待着一个新的会话进行连接。

停止服务需要右键点击系统托盘的H2图标,选择[Exit]。如果没有系统托盘的H2图标,切换到[Preferences]单击[Shutdown],在 WINDOWS上在服务器启动的窗口下按[Ctrl]+[C],或者直接关闭WINDOWS上的控制台窗口。

JAVA应用要连接到数据库,首先需要加载数据库驱动,然后获得一个数据库连接,下面是一个简单的例子:

缺省情况下,如果URL指定的数据库并不存在,一个新的空的数据库将被自动的创建。创建数据库的用户自动成为这个数据库的超级管理员。

H2目前支持三种服务器模式:WEB服务器模式(H2控制台)、TCP服务器模式(CIS连接)和PG服务器模式( PostgreSQL客户端)。可以通过多种方式启动服务器模式,通常的方式是通过服务器工具。

要连接另一台计算机的的数据库,只能通过TCP方式进行连接,使用下面的连接驱动和数据库URL:

这个方法仅能停止TCP服务,如果进程内的其他服务还在运行,他们将不受影响。为了避免数据库被重新打开,在使用这个方法前,需要将所有的数据库连接都关闭。远程停止服务,需要能远程连接到这台服务器上。关闭服务器可以通过使用密码来保护(启动时也需要使用和创建的密码),命令行参数可以通过-tcpPassword来实现。

最简单(目前)的方法就是将数据库内嵌到应用中,这样就意味着应用启动的时候就打开了一个连接(好的办法是使用Servlet,看下面的说明)。数据库能被多个session和应用访问,他们跟应用运行在一个进程内,大部分的Servlet容器只适用一个进程(如Tomcat),这些容器都是没有问题的(除非你使用集群)。Tomcat使用多线程和多类加载器。如果多个应用同时访问同一个数据库,你需要将数据库的jar文件放在shared/lib或是server/lib目录。好的方案是WEB应用启动时打开数据库,WEB应用停止时关闭数据库。如果是多个应用,只需要一个应用来处理启动和关闭。好的方案是一个session一个连接,或者是一个请求(action)一个连接,连接使用完后尽可能的关闭它,当然不关闭并不会引起可怕的后果。

关于具体访问数据库的细节,你可以看DbStarter.java。在这个工具中缺省打开的内嵌数据库URL为jdbc:h2:~/test,用户名sa,密码sa。如果你要去使用这个连接,你可以使用下面的访问方式:

DbStarter 也能够启动TCP服务,但是缺省状态下是不允许的。可以通过修改web.xml下的参数db.tcpServer来启用。下面是完整的配置选项,这些选项需要放在description标签和 listener / filter标签中间:

当WEB应用停止时,数据库连接将被自动关闭,如果还启动了TCP服务,TCP服务也将被自动关闭。

H2控制台是一个包含在WEB服务中的独立的应用,但是它也能作为一个servlet使用。为了做到这点,你需要将h2*.jar文件添加到你的应用中,在你的web.xml文件中增加下面的配置:

CSV文件在数据库系统中支持CSVREAD和CSVWRITE方法,也可以把它作为数据库之外的一个工具来使用。

数据库升级的推荐方案是,老版本的数据库的数据备份成SQL脚本的方式,在新版本的数据库上执行这些SQL来恢复数据。

备份数据库有多种方式。如可以直接拷贝数据库文件,但是不建议在数据库在使用的时候去拷贝文件,另外数据库文件是二进制的,不能直接读懂,并且数据库文件可能会比较大,推荐的备份方式是创建压缩的SQL脚本文件,并且H2提供了数据导出的脚本工具:

也可能通过SQL命令脚本去备份数据库,关于更多的命令选项,请查看SQL命令脚本。备份也能通过远程来做,但是文件被创建在服务器上,你可以通过FTP服务获取备份的脚本文件。

关于更多的命令的选项,请参考SQL命令RUNSCRIPT。恢复也能通过远程来实现,但是恢复的文件需要在服务器上。可以通过FTP服务器上传恢复需要的脚本文件。也可以通过RUNSCRIPT执行SQL脚本,SQL脚本文件内也可以引用另外的SQL脚本文件,在服务器模式下,也可以远程执行SQL脚本,但是要求脚本文件和被引用的脚本未见都在服务器上。

SQL命令BACKUP和备份工具都能创建全库的备份文件的压缩包。但是,这个文件的内容并不可读,相比脚本方式,BACKUP命令并不锁定数据库对象,也不阻塞用户,但是BACKUP命令备份结果是事务一致的。:

备份工具 (org.h2.tools.Backup)不能创建在线备份;程序在执行的时候,数据库不能使用。

并不支持数据库运行的同时创建数据库备份,除非是文件系统支持创建快照,但是快照不能保证数据拷贝顺序的正确性。

这些工具也能在程序中通过调用相应的方法来使用,相关详细的调用说明,请参考JavaDoc文档。

基础框架支持通过JDBC连接数据库。你也可以通过OpenOffice框架连接到H2数据库。首先将JDBC驱动增加到OpenOffice中,下面的步骤可以连接到H2数据库:

你可以访问存于用户当前目录的数据库。使用H2数据通过NeoOffice (去掉X11的OpenOffice):

如果H2的数据库已经打开,打开一个连接很快。如果要打开和关闭许多连接,使用连接池,可以提升性能。H2包含了一个简单的连接池,它是基于Christian dHeureuse的Mini Connection Pool Manager。还有其他更复杂的开源连接池可以使用,如Apache Commons DBCP。H2从内置连接池获取连接比使用DriverManager.getConnection()性能提升两倍左右。内置的连接池使用方法如下:

H2包含了两种全文检索的实现。一种通过使用Apache Lucene来实现,另一种是通过存储索引文件到数据库里的一张特殊表来实现的(私有实现)。

如果你要用到私有全文检索,你需要在每个数据库里都初始化它。然后你能创建一张表用于全文检索的索引,如:

PUBLIC是schema的名字, TEST是索引表名。字段名列表是可选的,在上面的例子中,所有的字段都被索引,索引的更新是实时的,使用下面的查询语句可以进行搜索:

使用Lucene实现的全文检索,你需要将Lucene加入到 classpath中,并且处理相关的依赖,如果你使用H2控制台,你能增加Lucene的jar文件到环境变量H2DRIVERS或CLASSPATH中。通过下面的语句初始化Lucene全文检索:

如果你需要是使用Lucene全文检索,你每个数据库都需要初始化。你也能通过下面的语句创建全文索引表:

PUBLIC是schema名, TEST是表名. 字段名列表是可选的,在上面的例子中,所有的字段都被索引,索引的更新是实时的,使用下面的查询语句可以进行搜索:

数据库支持用户自定义变量,自定义变量使用@开头,能够被用于任何表达式和参数中。变量是不能持久的,作为范围为session,这就意味着变量只在定义它的那个session里是有效的。一个变量通常使用SET命令来声明:

变量不能被设置为NULL值,变量的类型是变量自动分配的,也就是说,在变量使用前变量的定义并不是必须(也不是必需)的,在声明变量时没有限制,大对象(LOB)也被支持。

如果未设置时区,将使用系统中当前的时区。存储在H2数据库文件中的日期和时间是使用GMT(格林威治时间)。如果数据库被另一个时区的系统打开,日期和时间将根据时区进行换算。如果你希望移动数据从一个时区的系统到另一个时区的系统,并且不希望发生时区换算,你需要使用脚本命令或工具将数据导出为SQL脚本文件,再使用RUNSCRIPT在新时区的系统中导入数据。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注