H2数据库使用和配置
约 2855 字大约 10 分钟
2024-11-17
1. 类型
1.Embedded 嵌入式
URL jdbc:h2:〜/test表示数据库存储在用户主目录中以“ test”开头的文件中。
”~”这个符号代表的就是当前登录到操作系统的用户对应的用户目录,所以testdatabase数据库对应的文件存放在登录到操作系统的用户对应的用户目录当中,比如我当前是使用Administrator用户登录操作系统的,所以在”C:\Documents and Settings\Administrator.h2”目录中就可以找到test数据库对应的数据库文件了
支持绝对位置,如jdbc:h2:/data/db/test。
在嵌入式模式下,数据库与应用程序以相同的过程运行。任何时候都只能有一个进程访问数据库。
如果您拥有权限,则不存在的数据库将自动创建。形式为jdbc:h2:./data/test的URL相对于当前工作目录(启动应用程序的目录)。
建议使用相对于〜或绝对位置的位置。
2.Remote (client/server) 远程连接
URL jdbc:h2:tcp://localhost/〜/test表示通过TCP / IP连接到此计算机上运行的H2 TCP服务器,
并在用户主目录中打开一个名为test的数据库。 必须首先启动服务器。 任意数量的客户端都可以连接到同一数据库。
适用与嵌入式数据库相同的位置规则。
3.In-Memory 内存
URL jdbc:h2:mem:test意味着打开一个名为“test”的内存数据库。数据不持久,当最后一个数据库连接关闭时,数据会丢失。
多个线程可以访问同一个数据库,但是数据只能在同一个进程中可见。
- DB_CLOSE_DELAY:要求最后一个正在连接的连接断开后,不要关闭数据库
- MODE=MySQL:兼容模式,H2兼容多种数据库,该值可以为:DB2、Derby、HSQLDB、MSSQLServer、MySQL、Oracle、PostgreSQL
- AUTO_RECONNECT=TRUE:连接丢失后自动重新连接
- AUTO_SERVER=TRUE:启动自动混合模式,允许开启多个连接,该参数不支持在内存中运行模式
- TRACE_LEVEL_SYSTEM_OUT、TRACE_LEVEL_FILE:输出跟踪日志到控制台或文件, 取值0为OFF,1为ERROR(默认值),2为INFO,3为DEBUG
- SET TRACE_MAX_FILE_SIZE mb:设置跟踪日志文件的大小,默认为16M
``
数据库支持多种连接模式和连接设置,不同的连接模式和连接设置是通过不同的URL来区分的,URL中的设置是不区分大小写。
URL Format and Examples | |
---|---|
Embedded (local) connection | jdbc:h2:[file:][<path\>\]<databaseName> jdbc:h2:~/test jdbc:h2:file:/data/sample jdbc:h2:file:C:/data/sample (Windows only) |
In-memory (private) | jdbc:h2:mem: |
In-memory (named) | jdbc:h2:mem:<databaseName> jdbc:h2:mem:test_mem |
Server mode (remote connections) using TCP/IP | jdbc:h2:tcp://<server>[:<port>]/[<path>]<databaseName> jdbc:h2:tcp://localhost/~/test jdbc:h2:tcp://dbserv:8084/~/sample jdbc:h2:tcp://localhost/mem:test |
Server mode (remote connections) using TLS | jdbc:h2:ssl://<server>[:<port>]/<databaseName> jdbc:h2:ssl://localhost:8085/~/sample; |
Using encrypted files | jdbc:h2:<url>;CIPHER=AES jdbc:h2:ssl://localhost/~/test;CIPHER=AES jdbc:h2:file:~/secure;CIPHER=AES |
File locking methods | jdbc:h2:<url>;FILE_LOCK={FILE|SOCKET|NO} jdbc:h2:file:~/private;CIPHER=AES;FILE_LOCK=SOCKET |
Only open if it already exists | jdbc:h2:<url>;IFEXISTS=TRUE jdbc:h2:file:~/sample;IFEXISTS=TRUE |
Don't close the database when the VM exits | jdbc:h2:<url>;DB_CLOSE_ON_EXIT=FALSE |
Execute SQL on connection | jdbc:h2:<url>;INIT=RUNSCRIPT FROM '~/create.sql' jdbc:h2:file:~/sample;INIT=RUNSCRIPT FROM '~/create.sql'\;RUNSCRIPT FROM '~/populate.sql' |
User name and/or password | jdbc:h2:<url>[;USER=<username>\][;PASSWORD=] jdbc:h2:file:~/sample;USER=sa;PASSWORD=123 |
Debug trace settings | jdbc:h2:<url>;TRACE_LEVEL_FILE=<level 0..3> jdbc:h2:file:~/sample;TRACE_LEVEL_FILE=3 |
Ignore unknown settings | jdbc:h2:<url>;IGNORE_UNKNOWN_SETTINGS=TRUE |
Custom file access mode | jdbc:h2:<url>;ACCESS_MODE_DATA=rws |
Database in a zip file | jdbc:h2:zip:<zipFileName>!/<databaseName> jdbc:h2:zip:~/db.zip!/test |
Compatibility mode | jdbc:h2:<url>;MODE=<databaseType> jdbc:h2:~/test;MODE=MYSQL |
Auto-reconnect | jdbc:h2:<url>;AUTO_RECONNECT=TRUE jdbc:h2:tcp://localhost/~/test;AUTO_RECONNECT=TRUE |
Automatic mixed mode | jdbc:h2:<url>;AUTO_SERVER=TRUE jdbc:h2:~/test;AUTO_SERVER=TRUE |
Page size | jdbc:h2:<url>;PAGE_SIZE=512 |
[Changing other settings] | jdbc:h2:<url>;<setting>=<value>[;<setting>=<value>...] jdbc:h2:file:~/sample;TRACE_LEVEL_SYSTEM_OUT=3 |
2. 内嵌多连接
path: D:/IdeaProjects/treasure-chest/database/src/main/resources/db/testdb.mv.db
url: jdbc:h2:D:/IdeaProjects/treasure-chest/database/src/main/resources/db/testdb
spring:
h2:
console:
#线上运行时需要设置为false,避免暴露公网
enabled: true
#进行该配置,你就可以通过YOUR_URL/h2访问h2 web consloe。YOUR_URL是你程序的访问URl。默认为/h2-console
path: /h2
#进行该配置后,h2 web console就可以在远程访问了。否则只能在本机访问。
settings:
web-allow-others: true
sql:
init:
schema-locations: classpath:db/schema-h2.sql
data-locations: classpath:db/schema-h2.sql
datasource:
# type: org.h2.jdbcx.JdbcConnectionPool
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 内嵌模式
url: jdbc:h2:./database/src/main/resources/db/testdb;AUTO_SERVER=TRUE;MODE=PostgreSQL
# 远程模式
# url: jdbc:h2:tcp://localhost:8081/./database/src/main/resources/db/testdb;AUTO_SERVER=TRUE;MODE=PostgreSQL
driver-class-name: org.h2.Driver
username: root
password: root
# 初始连接数
initialSize: 20
# 最小连接池数量
minIdle: 20
# 最大连接池数量
maxActive: 100
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
# 控制台登录http://localhost:8081/druid/login.html
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: admin
login-password: admin
3. 数据类型
由于H2是由java语言编写的,所以提供的数据类型都和java契合,下面给出数据类型列表:
1.基本的数据类型有哪些?
1、数字方面
整数(INT)
布尔型(BOOLEAN)
微整数(TINYINT)
小整数(SMALLINT)
大整数(BIGINT)
标识符(IDENTITY)
货币数(DECIMAL)
双精度实数(DOUBLE)
实数(REAL)
2、时间方面
时间(TIME)
日期(DATE)--在H2中存储为date字段类型将只有年月日
时间戳(TIMESTAMP)
3、字符文本方面
二进制(BINARY)
其他类型(OTHER)
可变字符串(VARCHAR)
不区分大小写可变字符串(VARCHAR_IGNORECASE)
字符(CHAR)
二进制大对象(BLOB)
文本大对象(CLOB)
通用唯一标识符(UUID)
数组(ARRAY)
2.具体数据类型的简介
整数(INT)INT | INTEGER | MEDIUMINT | INT4 | SIGNED
值的范围为: -2147483648 到 2147483647.
对应到Java类型: java.lang.Integer.
例如:INT
布尔型(BOOLEAN)BOOLEAN | BIT | BOOL
可能的值为: TRUE 和 FALSE。
对应到Java类型: java.lang.Boolean.
例如:BOOLEAN
微整数(TINYINT)TINYINT
值的范围为: -128 到 127.
对应到Java类型: java.lang.Byte.
例如:TINYINT
小整数(SMALLINT)SMALLINT | INT2 | YEAR
值的范围为: -32768 到 32767.
对应到Java类型: java.lang.Short.
例如:SMALLINT
大整数(BIGINT)BIGINT | INT8
值的范围为: -9223372036854775808 到 9223372036854775807.
对应到Java类型: java.lang.Long.
例如:BIGINT
标识符(IDENTITY)IDENTITY
自增值,值的范围为: -9223372036854775808 到 9223372036854775807。使用的值不能再重用,即使事务回滚。
对应到Java类型: java.lang.Long.
例如:IDENTITY
货币数(DECIMAL){ DECIMAL | NUMBER | DEC | NUMERIC } ( precisionInt [ , scaleInt ] )
固定整数位和小数位。这个数据类型经常用于存储货币等类型的值。
对应到Java类型: java.math.BigDecimal.
例如:DECIMAL(20, 2)
双精度实数(DOUBLE){ DOUBLE [ PRECISION ] | FLOAT | FLOAT4 | FLOAT8 }
浮点数。不能应用到表示货币等值,因为有四舍五入的问题。
对应到Java类型: java.lang.Double.
例如:DOUBLE
实数(REAL)REAL
单精度浮点数。不能应用到表示货币等值,因为有四舍五入的问题。
对应到Java类型: java.lang.Float.
例如:REAL
时间(TIME)TIME
格式为 hh:mm:ss.
对应到Java类型:java.sql.Time.
例如:TIME
日期(DATE)DATE
格式为 yyyy-MM-dd.
对应到Java类型: java.sql.Date
例如:DATE <span style="color:#FF0000;">需要特别注意的是这里,我们在oracle中定义成date是可以保存时分秒的,而在H2中则不会</span>
时间戳(TIMESTAMP)
{ TIMESTAMP | DATETIME | SMALLDATETIME }
格式为 yyyy-MM-dd hh:mm:ss[.nnnnnnnnn].
对应到Java类型: java.sql.Timestamp (java.util.Date 也支持).
例如:TIMESTAMP
二进制(BINARY){ BINARY | VARBINARY | LONGVARBINARY | RAW | BYTEA } [ ( precisionInt ) ]
表示一个字节数组。针对更长的数组,使用 BLOB 类型。最大的尺寸为 2 GB,当使用这种数据类型时,整个对象都会保存在内存中,在内存中的尺寸是一个精确的指定值,只有实际的数据会被持久化。对于大的文本数据,还是使用 BLOB 和 CLOB 更合适。
对应到Java类型: byte[].
例如:BINARY(1000)
其他类型(OTHER)OTHER
这个类型允许存储可序列化的JAVA对象。在内部,使用的是一个字节数组。序列化和反序列化只在客户端端完成。反序列化仅在 getObject 被调用时才被调用。JAVA操作因为安全的原因并不能在数据库引擎内被执行。可以使用 PreparedStatement.setObject 存储对象。
对应到Java类型: java.lang.Object (或者是任何子类).
例如:OTHER
可变字符串(VARCHAR){ VARCHAR | LONGVARCHAR | VARCHAR2 | NVARCHAR| NVARCHAR2 | VARCHAR_CASESENSITIVE} [ ( precisionInt ) ]
Unicode 字符串。使用两个单引号('') 表示一个引用。最大的长度是Integer.MAX_VALUE,字符串的实际长度是精确指定的,仅实际的数据会被持久化。当使用这种数据类型时,整个文本都会保存在内存中。更多的文本数据,使用 CLOB 更合适。
对应到Java类型: java.lang.String.
例如:VARCHAR(255)
不区分大小写的可变字符串(VARCHAR_IGNORECASE )VARCHAR_IGNORECASE [ ( precisionInt ) ]
与 VARCHAR 类型类似,只是在比较时不区分大小写。存储时是混合大小写存储的。当使用这种数据类型时,整个文本都会保存在内存中。更多的文本数据,使用 CLOB 更合适。
例如:VARCHAR_IGNORECASE
字符(CHAR)
{ CHAR | CHARACTER | NCHAR } [ ( precisionInt ) ]
这个类型支持是针对其他数据库或老的应用的兼容性。与VARCHAR 的不同是尾空格将被忽略并且不会被持久化。 Unicode 字符串。使用两个单引号('') 表示一个引用。最大的长度是Integer.MAX_VALUE,字符串的实际长度是精确指定的,仅实际的数据会被持久化。当使用这种数据类型时,整个文本都会保存在内存中。更多的文本数据,使用 CLOB 更合适。
对应到Java类型: java.lang.String.
例如:CHAR(10)
二进制大对象(BLOB)
{ BLOB | TINYBLOB | MEDIUMBLOB | LONGBLOB | IMAGE | OID } [ ( precisionInt ) ]
类似于BINARY,但是针对的是非常大的值如文件或是图片。跟BINARY不同的是,大对象并不完全保存在内存中。使用 PreparedStatement.setBinaryStream 存储对象,详细请参见 CLOB 和 高级 / 大对象。
对应到Java类型: java.sql.Blob (java.io.InputStream 也支持)。
例如:BLOB
文本大对象(CLOB)
{ CLOB | TINYTEXT | TEXT | MEDIUMTEXT | LONGTEXT | NTEXT | NCLOB } [ ( precisionInt ) ]
CLOB类似于 VARCHAR,但是针对的是非常大的值。与 VARCHAR不同的是,CLOB 对象并不完全保存在内存中,而是使用的流。CLOB 可以用于文档或文本,如果XML、HTML文档,文本文件、未限制尺寸的备忘录等。使用 PreparedStatement.setCharacterStream 存储对象。详细请参见 高级 / 大对象。
VARCHAR 用于相对较小的文本(如200个字符以内)。小的 CLOB 值被就地存储,但是也比 VARCHAR 要大。
对应到Java类型: java.sql.Clob (java.io.Reader 也支持).
例如:CLOB
通用唯一标识符(UUID)
UUID
UUID(Universally unique identifier),是一个128BIT的值,使用 PreparedStatement.setBytes 或 setString 去存储值。
对应到Java类型: java.util.UUID.
例如:UUID
数组(ARRAY)ARRAY
一组值,可以使用值列表 (1, 2) 或 PreparedStatement.setObject(.., new Object[] {..}) 存储对象。
对应到Java类型: java.lang.Object[] (没有任何原始类型数组被支持).