![](/img/trans.png)
[英]Why I can't connect to an new H2 In-Memory database after closing?
[英]Can I have H2 autocreate a schema in an in-memory database?
(我已經看過內存中的H2 數據庫 - Init schema via Spring/Hibernate問題;它在這里不適用。)
我想知道 H2 中是否有一個設置可以讓我在連接到它時自動創建一個架構。 如果有幫助,我只對內存中的情況感興趣。
H2 支持 URL 末尾的各種以分號分隔的修飾符,但我沒有找到用於自動創建架構的修飾符。 有這樣的功能嗎?
是的,H2 支持在連接時執行 SQL 語句。 你可以運行一個腳本,或者只運行一兩個語句:
String url = "jdbc:h2:mem:test;" +
"INIT=CREATE SCHEMA IF NOT EXISTS TEST"
String url = "jdbc:h2:mem:test;" +
"INIT=CREATE SCHEMA IF NOT EXISTS TEST\\;" +
"SET SCHEMA TEST";
String url = "jdbc:h2:mem;" +
"INIT=RUNSCRIPT FROM '~/create.sql'\\;" +
"RUNSCRIPT FROM '~/populate.sql'";
請注意雙反斜杠 ( \\\\
) 僅在 Java 中是必需的。 之前的反斜杠;
在INIT
是必需的。
如果您將 spring 與application.yml
一起application.yml
,以下內容對您有用:
spring:
datasource:
url: jdbc:h2:mem:mydb;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL;INIT=CREATE SCHEMA IF NOT EXISTS calendar
Thomas 所寫的內容是正確的,除此之外,如果您想初始化多個模式,您可以使用以下內容。 注意有一個\\\\;
將兩個 create 語句分開。
EmbeddedDatabase db = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.setName("testDb;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;INIT=create " +
"schema if not exists " +
"schema_a\\;create schema if not exists schema_b;" +
"DB_CLOSE_DELAY=-1;")
.addScript("sql/provPlan/createTable.sql")
.addScript("sql/provPlan/insertData.sql")
.addScript("sql/provPlan/insertSpecRel.sql")
.build();
參考: http : //www.h2database.com/html/features.html#execute_sql_on_connection
“默認情況下,當應用程序調用DriverManager.getConnection(url, ...)
並且 URL 中指定的數據庫尚不存在時,會創建一個新的(空)數據庫。”— H2 數據庫。
附錄:@Thomas Mueller 展示了如何在 Connection上執行 SQL ,但我有時只是在代碼中創建和填充,如下所示。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/** @see http://stackoverflow.com/questions/5225700 */
public class H2MemTest {
public static void main(String[] args) throws Exception {
Connection conn = DriverManager.getConnection("jdbc:h2:mem:", "sa", "");
Statement st = conn.createStatement();
st.execute("create table customer(id integer, name varchar(10))");
st.execute("insert into customer values (1, 'Thomas')");
Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery("select name from customer");
while (rset.next()) {
String name = rset.getString(1);
System.out.println(name);
}
}
}
如果您將 Spring Framework 與application.yml
一起application.yml
,並且無法讓測試在INIT
屬性上找到 SQL 文件,則可以使用classpath:
表示法。
例如,如果您在src/test/resources
上有一個init.sql
SQL 文件, 只需使用:
url=jdbc:h2:~/test;INIT=RUNSCRIPT FROM 'classpath:init.sql';DB_CLOSE_DELAY=-1;
如果您使用的是 spring 和 xml 配置,這里是一個應該如何完成的示例:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" depends-on="h2Server">
<property name="driverClassName" value="org.h2.Driver"/>
<property name="url"
value="jdbc:h2:mem:testdb;INIT=RUNSCRIPT FROM 'classpath:db/create_tables.sql'\;RUNSCRIPT FROM 'classpath:db/insert.sql';TRACE_LEVEL_FILE=4;TRACE_LEVEL_SYSTEM_OUT=3;"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.