Câu hỏi cũ nhưng tôi đã dành rất nhiều thời gian để tìm hiểu cách lưu cơ sở dữ liệu H2 được nhúng vào một tệp và tôi muốn chia sẻ những gì tôi đã học được.
Khi @ebaxt cho biết bạn có thể định cấu hình vị trí của cơ sở dữ liệu được nhúng trong chuỗi kết nối. Nếu bạn muốn lưu nó trong việc sử dụng hệ thống tập tin ~/
cú pháp:
jdbc:h2:~/example/embeddedDb
Nếu bạn muốn lưu nó bên trong thư mục dự án của bạn, bạn phải sử dụng ./
cú pháp
jdbc:h2:./example/embeddedDb
này sẽ tạo embeddedDb.mv.db
tập tin trong example
thư mục bên trong thư mục chính của bạn hoặc bên trong thư mục gốc của dự án của bạn. Nhưng điều này sẽ xóa cơ sở dữ liệu mỗi khi ứng dụng bắt đầu. Để tránh điều này tôi sử dụng INIT
tài sản để nói với H2 để tạo ra các sơ đồ (Queue trong trường hợp của tôi) chỉ khi nó không tồn tại:
INIT=create schema if not exists Queue;
Sau đó, trong kịch bản DDL của bạn, bạn phải sử dụng tạo bảng nếu không tồn tại tuyên bố, để tạo ra tất cả các bảng của bạn:
// create-db.sql
CREATE TABLE IF NOT EXISTS Queue (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
...
);
và nói với H2 để chạy các kịch bản mỗi khi nó được kết nối:
// if you want to store the script in the file system
runscript from '~/example/create-db.sql'
// if you want to store the script in the project folder
runscript from './example/create-db.sql'
Tóm tắt này là những gì bạn phải làm gì để cre ăn cơ sở dữ liệu (EmbeddedDb) trong java chú thích cách:
import org.springframework.jdbc.datasource.DriverManagerDataSource;
@Bean
DataSource datasource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUsername("embedded");
dataSource.setPassword("embedded");
dataSource.setUrl("jdbc:h2:~/example/EmbeddedDb;INIT=create schema if not exists Queue\\; runscript from '~/example/create-db.sql'");
return dataSource;
}
hoặc sử dụng XML:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
destroy-method="close">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:~/example/EmbeddedDb;INIT=create schema if not exists Queue\; runscript from '~/example/create-db.sql'" />
<property name="username" value="embedded" />
<property name="password" value="embedded" />
</bean>
Với phương pháp này, các cơ sở dữ liệu sẽ được tạo ra chỉ nếu đây là lần đầu tiên ứng dụng chạy hoặc nếu cơ sở dữ liệu tệp không tồn tại. Nếu không, chỉ có kết nối sẽ được tải.
Bạn cũng có thể theo dõi tình trạng cơ sở dữ liệu với một giao diện đẹp bằng cách sử dụng thư viện hsqldb, thêm đậu sau:
import org.h2.tools.Server;
import org.hsqldb.util.DatabaseManagerSwing;
@Bean(initMethod = "start", destroyMethod = "stop")
public Server startDBManager() throws SQLException {
DatabaseManagerSwing.main(new String[] { "--url", "jdbc:h2:~/example/EmbeddedDb", "--user", "embedded", "--password", "embedded" });
return Server.createWebServer();
}
Tài liệu tham khảo:
http://www.mkyong.com/spring/spring-embedded-database-examples/
http://www.h2database.com/html/features.html#embedded_databases (Execute SQL trên phần Connect)
Bạn có thể cung cấp thêm thông tin về những gì bạn muốn thực hiện không? Bạn đang cố gắng chuyển sang cơ sở dữ liệu khác? –
URL cơ sở dữ liệu của bạn là gì? –
Tôi muốn có H2 DB của tôi được lưu trữ trong đĩa thay vì trong bộ nhớ (như tôi có bây giờ). – Pomario