Saya punya database H2 dengan URL "jdbc:h2:test"
. Saya membuat tabel menggunakan CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64));
. Saya kemudian memilih semuanya dari tabel (kosong) ini menggunakan SELECT * FROM PERSON
. Sejauh ini baik.
Namun, jika saya mengubah URL ke "jdbc:h2:mem:test"
, satu-satunya perbedaan adalah database sekarang hanya dalam memori, ini memberi saya org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL statement: SELECT * FROM PERSON [42102-154]
. Saya mungkin melewatkan sesuatu yang sederhana di sini, tetapi bantuan apa pun akan dihargai.
Person
lagi. H2 tidak tahu apa-apa tentang database yang Anda buat di disk sebelumnya.Jawaban:
DB_CLOSE_DELAY=-1
hbm2ddl menutup koneksi setelah membuat tabel, jadi h2 membuangnya.
Jika Anda memiliki koneksi-url Anda dikonfigurasi seperti ini
konten basis data terputus pada saat koneksi terakhir ditutup.
Jika Anda ingin menyimpan konten Anda, Anda harus mengkonfigurasi url seperti ini
Jika demikian, h2 akan menyimpan kontennya selama vm hidup.
Perhatikan titik koma (
;
) daripada titik dua (:
).Lihat bagian In-Memory Databases di halaman Features . Kutipan:
sumber
jdbc:h2:mem:;DB_CLOSE_DELAY=-1
tidak berfungsi.Saya tahu ini bukan kasus Anda, tetapi saya memiliki masalah yang sama karena H2 membuat tabel dengan nama UPPERCASE kemudian berperilaku case-sensitive, meskipun dalam semua skrip (termasuk dalam skrip penciptaan) saya menggunakan huruf kecil.
Dipecahkan dengan menambahkan
;DATABASE_TO_UPPER=false
ke URL koneksi.sumber
DATABASE_TO_UPPER=false
hal ini sebagai pernyataan SQL dalam skrip init? (Sama seperti pernyataan sepertiSET MODE PostgreSQL;
) Jika demikian, apa sintaks yang tepat?Sulit dikatakan. Saya membuat program untuk menguji ini:
Tes berjalan sampai selesai, tanpa kegagalan dan tanpa hasil yang tidak terduga. Versi h2 mana yang Anda jalankan?
sumber
Database in-memory H2 menyimpan data dalam memori di dalam JVM. Ketika JVM keluar, data ini hilang.
Saya menduga bahwa apa yang Anda lakukan mirip dengan dua kelas Java di bawah ini. Salah satu dari kelas-kelas ini membuat tabel dan yang lain mencoba untuk memasukkannya:
dan
Ketika saya menjalankan kelas-kelas ini satu demi satu, saya mendapat hasil sebagai berikut:
Segera setelah
java
proses pertama keluar, tabel yang dibuat olehCreateTable
tidak ada lagi. Jadi, ketika kelas InsertIntoTable datang, tidak ada tabel untuk dimasukkan.Ketika saya mengubah string koneksi ke
jdbc:h2:test
, saya menemukan bahwa tidak ada kesalahan seperti itu. Saya juga menemukan bahwa filetest.h2.db
telah muncul. Di sinilah H2 meletakkan tabel, dan karena itu telah disimpan di disk, tabel itu masih ada untuk ditemukan kelas InsertIntoTable.sumber
registerDriver()
panggilan itu tidak perlu: Pertama: Class.forName () sederhana melakukan hal yang sama untuk sebagian besar driver JDBC dan (lebih penting) itu sama sekali tidak perlu untuk Java 6 und up, yang mendeteksi driver JDBC otomatis (kompatibel) pada jalan setapak kelas.Saya sudah mencoba menambahkan
Namun, itu tidak membantu. Di situs H2 , saya telah menemukan yang berikut, yang memang bisa membantu dalam beberapa kasus.
Namun , masalah saya adalah bahwa hanya skema yang seharusnya berbeda dari yang standar. Jadi insted menggunakan
Saya harus menggunakan:
Kemudian tabel terlihat
sumber
Saya memiliki masalah yang sama dan mengubah konfigurasi saya di application-test.properties menjadi ini:
Dan ketergantungan saya:
Dan penjelasan yang digunakan pada kelas tes:
sumber
Saya mencoba mengambil data meta tabel, tetapi mengalami kesalahan berikut:
Menggunakan:
mengembalikan ResultSet kosong.
Tetapi menggunakan URL berikut ini malah berfungsi dengan baik:
Ada kebutuhan untuk menentukan: DATABASE_TO_UPPER = false
sumber
Saat membuka konsol h2, URL JDBC harus cocok dengan yang ditentukan di properti:
Yang tampaknya jelas, tapi saya menghabiskan berjam-jam mencari tahu ini ..
sumber
Dipecahkan dengan membuat folder src / test / resources baru + menyisipkan file application.properties, secara eksplisit menentukan untuk membuat test dbase:
sumber
Saya datang ke pos ini karena saya memiliki kesalahan yang sama.
Dalam kasus saya, evolusi basis data tidak dijalankan, jadi tabelnya tidak ada sama sekali.
Masalah saya adalah bahwa struktur folder untuk skrip evolusi salah.
dari: https://www.playframework.com/documentation/2.0/Evolutions
Saya memiliki folder bernama conf / evolutions.default yang dibuat oleh eclipse. Masalahnya hilang setelah saya memperbaiki struktur folder menjadi conf / evolutions / default
sumber
sumber
Punya masalah yang sama persis, mencoba semua di atas, tetapi tidak berhasil. Penyebab kesalahan yang agak lucu adalah bahwa JVM mulai terlalu cepat, sebelum tabel DB dibuat (menggunakan file data.sql di src.main.resources). Jadi saya telah meletakkan timer Thread.sleep (1000) untuk menunggu sebentar sebelum memanggil "select * from person". Bekerja dengan sempurna sekarang.
properti aplikasi:
data.sql:
PersonJdbcDAO.java:
kelas utama:
sumber
Saya menemukan itu berfungsi setelah menambahkan ketergantungan Spring Data JPA pada Spring boot versi 2.2.6.RELEASE -
Tambahkan konfigurasi H2 DB di application.yml -
sumber
Saya menemukan solusinya dengan menambahkan konfigurasi ini:
Konfigurasi lengkap (dengan spring.datasource.url sederhana):
Saya bekerja dengan h2 versi 1.4.200 dan Spring-Boot 2.2.6.RELEASE
sumber
Time.sleep (1000);
Ini bekerja untuk saya. Hanya untuk dicoba, jika PC Anda lambat, Anda dapat menambah durasi waktu utas sehingga DB berfungsi dengan baik dan JVM dapat memperoleh tabel kami.
sumber