2012-04-19 6 views
7

Tôi đã có một chương trình Clojure nhỏ sử dụng các công cụ Clojure JDBC để tạo một bảng trong cơ sở dữ liệu HSQL. Tuy nhiên, nó dường như chỉ thực sự tạo ra bảng nếu tôi chạy nó từ REPL của Leiningen. Nó không tạo bảng nếu tôi chạy mã sử dụng lein run hoặc từ IDE của tôi (IntelliJ). Không có trường hợp ngoại lệ nào được báo cáo. Trong cả hai trường hợp, đầu ra chỉ là "(0)".Clojure jdbc tạo bảng tuyên bố không chạy trừ khi sử dụng Leiningen REPL

Dưới đây là đoạn mã:

(ns tramway.core 
    (:require [clojure.java.io :as io] 
      [clojure.java.jdbc :as sql])) 

(def hsql-db {:subprotocol "hsqldb" 
       :subname "file:/tmp/tramwaydb" 
       :user "SA" 
       :password ""}) 

(defn -main [] 
    (println (sql/with-connection hsql-db (sql/create-table 
           :footfall 
           [:id "INTEGER" "GENERATED ALWAYS AS IDENTITY(START WITH 1)"] 
           [:sample_date "DATE"] 
           [:exhibition "varchar(255)"])))) 

Và kể từ khi tôi đang sử dụng Leiningen, đây là tôi project.clj:

(defproject tramway "1.0.0-SNAPSHOT" 
    :description "Description here" 
    :dependencies [[org.clojure/clojure "1.3.0"] 
       [org.clojure/java.jdbc "0.1.4"] 
       [org.hsqldb/hsqldb "2.2.8"]] 
    :main tramway.core) 

Nếu tôi làm:

$ lein repl 

tramway.core=> (-main) 
(0) 
nil 

và sau đó kiểm tra /tmp/tramway.log Tôi có thể xem thành công CREATE TABLE.

Tuy nhiên, nếu tôi làm:

$ rm -rf /tmp/tramway.* 
$ lein run 
(0) 

và sau đó kiểm tra cùng một tập tin, nó là sản phẩm nào. Nó không tạo các tệp .log, .properties.script. Tất cả trừ tệp .log có nội dung; chỉ có không có hồ sơ của CREATE TABLE đã được chạy.

Tôi đang làm gì sai? Tôi sẽ mong đợi để có kết quả tương tự cho dù tôi chạy chức năng (-main) của tôi từ REPL hoặc có Leiningen chạy nó tự động.

Tôi cũng đã thử thực hiện việc tạo bảng từ chức năng -main và chạy nó như một tập lệnh thông qua IDE của tôi, và tôi vẫn nhận được kết quả xấu như vậy.

Trả lời

7

Đây là câu hỏi cấu hình HSQLDB phổ biến.

Cấu hình mặc định của HSQLDB không nhằm mục đích sử dụng thử nghiệm. Kết quả là, nó trì hoãn việc viết và đồng bộ các mục .log bằng 500 mili giây và nó không tắt cơ sở dữ liệu khi kết nối được đóng lại. Hãy thử một trong các thiết lập trong URL của bạn:

:subname "file:/tmp/tramwaydb;hsqldb.write_delay=false" 

hoặc

:subname "file:/tmp/tramwaydb;shutdown=true" 

Xem các tùy chọn khác nhau ở đây: http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

+0

Điều đó đã làm nó. Cảm ơn bạn! Đó là bước đột phá đầu tiên của tôi vào HSQLDB và cũng là Clojure, vì vậy tôi không biết bắt đầu từ đâu. Chúc tôi có thể upvote bạn nhiều hơn nữa! – Jonathan