1.H2 数据库介绍(度娘的)
H2数据库是一个用Java编写的开源的关系型数据库管理系统(RDBMS),具有轻量级、快速、免费的特点。它可以嵌入到Java应用程序中作为嵌入式数据库运行,也可以在客户端-服务器模式下运行,允许远程访问。H2数据库主要用于测试和开发阶段,但也适用于轻量级的生产应用。
以下是H2数据库的主要特点:
- 轻量级和快速:H2数据库非常小巧,通常以一个单一的JAR文件提供,易于集成到Java应用程序中。它对内存和处理器的要求较低,从而提供了高效的性能。
- 内存数据库:H2支持内存模式,即数据库可以存储在RAM中,这提供了非常高的访问速度和查询性能。但请注意,在这种模式下,数据不会持久存储在磁盘上。
- 嵌入式数据库:在嵌入式模式下,H2数据库可以嵌入到Java应用程序中,无需安装或管理一个独立的数据库系统。
- 客户端-服务器模式:除了嵌入式模式外,H2也可以配置为一个独立的数据库服务器,支持远程访问。
- 支持SQL和JDBC:H2数据库兼容大多数SQL标准,并提供了JDBC API,使得开发者能够使用标准的SQL语句进行数据库操作。
- 附加功能:H2还提供了基于磁盘或内存的数据库和表、只读数据库支持、临时表等附加功能。
H2数据库的使用场景非常广泛,包括但不限于企业应用开发、桌面应用开发、移动应用开发等。在这些场景中,H2数据库能够提供一个可靠、容量大、运行稳定、响应迅速、性能高的数据存储环境。此外,当某些场景下数据模型必须为关系型时,H2数据库也可以充当Memcached使用,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据。
总的来说,H2数据库是一个功能强大、灵活且易于使用的轻量级数据库,特别适用于需要快速、高效且易于集成的数据库解决方案的场景。
官方致命文档:H2 Database Engine
备注:作者通过内嵌以及服务器两种方式连接H2数据库,均测试成功。步骤描述涉及两种方式。
2.通过官方文档连接下载H2数据库包:
3.mySql数据库转换成H2数据库:
Idea下载mysqlToH2插件。IDea 工具栏点开 MySql To H2,将Mysql数据库导出的sql语句转换一下。如下图:
4.解压步骤2中下载的H2数据库,执行bin目录下.bat文件(window环境)
5.执行后在菜单栏找到h2-ConSole图标,右键图标创建一个新的数据库。linux系统可通过命令创建(自行度娘)。
6.通过h2-console连接刚创建的数据库
7.连接创建好的数据库:通过下图框中执行sql语句,也可以通过h2控制台工具执行sql语句。这里通过步骤3 mySql转h2的sql文件直接执行是不成功的,需要做部分修改。主要是修改点有:部分字段数据类型
7.1 数据库修改对比:
备注:本人迁移的数据库表比较少,基本上是手动修改的;如果有其他更好的办法,可以相互交流。
8.renren-damin下 pom.xml配置。
dependencies下添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除默认的 Tomcat 依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!--h2数据库-->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.224</version>
</dependency>
build下添加:
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>db</directory>
<filtering>true</filtering>
<includes>
<include>**/*</include>
</includes>
<targetPath>${project.build.outputDirectory}/db</targetPath>
</resource>
<resource>
<directory>${project.basedir}/dist</directory>
<targetPath>META-INF/resources</targetPath>
</resource>
注:此处DB文件夹也是框架自带的,如果框架内嵌方式连接数据库,可将DB路径下 mysql.sql文件替换成自己生成的sql文件。如图:
9.内嵌方式手动执行sql文件。在renren-admin->src->main->java->io->renren->common->config目录(路径根据自己实际情况来)下创建H2DataSourceConfig类。如果在步骤7中自己创建了数据库文件,H2DataSourceConfig类执行要生成的数据库文件也可以用步骤7生成的替代。
package io.renren.common.config;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.jdbc.datasource.init.ScriptUtils;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.io.File;
import java.util.List;
/**
- 初始化h2数据库
*/
@Slf4j
@Service
@AutoConfigureAfter(DataSource.class) //DataSource创建完后才初始化此类
public class H2DataSourceConfig {
/**
* 初始化sql文件所在位置
*/
private static final List<String> SCHEMAS = Lists.newArrayList(
"db/mysql.sql"
/* "db/generator/mysql.sql",
"db/region_data/mysql.sql"*/
);
@Autowired
DataSource dataSource;
@Value("${h2.file-path}")
private String filePath;
@Value("${h2.db-name}")
private String dbName;
@PostConstruct
public void init() throws Exception {
//初始化本地数据库
// 创建一个标识文件,只有在第一次初始化数据库时会创建,如果系统用户目录下有这个文件,就不会重新执行sql脚本
File f = new File(filePath + File.separator+dbName+".lock");
if(!f.exists()){
log.info("--------------初始化h2数据----------------------");
log.info("{}",f.getPath());
f.getParentFile().mkdirs();
f.createNewFile();
for (String schema : SCHEMAS) {
// 加载资源文件
Resource resource = new ClassPathResource(schema);
EncodedResource encodedResource = new EncodedResource(resource, "utf-8");
// 手动执行SQL语句
ScriptUtils.executeSqlScript(dataSource.getConnection(),encodedResource);
}
}
}
}
10.renren-admin 下 application.yml配置修改:
10.1
Tomcat
server:
jetty:
acceptors: 2
selectors: 4
request-header-size: 8192
max-http-form-post-size: 1048576
port: 8888
servlet:
context-path: /network-admin
session:
cookie:
http-only: true
10.2
h2:
#如需通过可视化界面访问数据库,需要配置以下参数
console:
path: /h2-console #h2嵌入式数据库控制台,可以通过浏览器访问
enabled: true
resources:
static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
#h2数据库配置
h2:
#数据库名称
db-name: netool
#数据库文件地址
#file-path: E:\h2\data\file
file-path: /opt/h2-test/file
- renren-admin下application-prod.yml 配置文件修改(根据自己实际使用配置文件对应修改)
内嵌模式连接:
driver-class-name: org.h2.Driver
#内嵌连接模式
url: jdbc:h2:file:${h2.file-path}/${h2.db-name};MODE=MYSQL
username: root
password: 123456
initialization-mode: always
服务器模式连接:
driver-class-name: org.h2.Driver
#混合连接模式
#url: jdbc:h2:tcp://192.168.2.74/E:/h2/data/data/netool
#url: jdbc:h2:tcp://192.168.2.20/./netool
username: root
password: 123456
initialization-mode: always
12.总结:服务器模式需要手动先启动h2数据库,内嵌模式不需要。linux系统可用下面的启动命令:java -jar h2-2.2.224.jar -tcp -tcpAllowOthers -webAllowOthers 或者
java -cp h2*.jar org.h2.tools.Server -webDaemon -tcpAllowOthers -baseDir /opt/h2-data/h2/data/dist baseDir为自己数据库路径。
版权归原作者 不一般的小白 所有, 如有侵权,请联系我们删除。