2012-02-17 40 views
33

Tôi đang cố gắng thực hiện kiểm tra đơn vị DAO của tôi (sử dụng Spring và Hibernate). Tôi đang sử dụng HSQLDB cho mỗi hướng dẫn this. Hướng dẫn nói rằng cơ sở dữ liệu HSQLDB trong bộ nhớ có thể được khởi tạo bằng cách sử dụng một kịch bản lệnh SQL nhưng tôi không thể tìm thấy thông tin về cách làm như vậy trong Spring. Đây là cấu hình ngữ cảnh mùa xuân thích hợp:Cách khởi tạo HSQLDB trong bộ nhớ bằng cách sử dụng tập lệnh qua Spring

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> 
    <property name="url" value="jdbc:hsqldb:mem:mydb" /> 
    <property name="username" value="sa" /> 
    <property name="password" value="" /> 
    <property name="initialSize" value="5" /> 
    <property name="maxActive" value="10" /> 
    <property name="poolPreparedStatements" value="true" /> 
    <property name="maxOpenPreparedStatements" value="10" /> 
</bean> 

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn.

+1

'Sự khác biệt giữa chế độ trong bộ nhớ và tệp là cơ sở dữ liệu trong bộ nhớ trống, nhưng chế độ tệp được khởi tạo với dữ liệu. Một chiến lược mà tôi đã sử dụng trong quá khứ là tạo một cơ sở dữ liệu độc lập, cho phép Hibernate tạo các bảng và thêm dữ liệu cho tôi, lưu dữ liệu vào một tập lệnh, và sau đó sử dụng URL dựa trên tệp để trỏ tới tập lệnh. Điều tốt về kịch bản là nó là SQL thô, do đó bạn được tự do điền trước cơ sở dữ liệu với bất kỳ dữ liệu nào bạn muốn kiểm tra .' này từ bài đăng bạn đã liên kết, nó đề cập rõ ràng quá trình. –

+0

Tôi đọc ở trên nhưng tôi đoán tôi đã không đặt 2 & 2 với nhau mà sau đó bạn sẽ sử dụng phiên bản "tập tin" của HSQLDB và nó sẽ làm trong bộ nhớ với kịch bản như khởi động. –

Trả lời

72

Nếu bạn đang cố gắng để làm việc với cơ sở dữ liệu trong bộ nhớ và mùa xuân, có một jdbc namespace for Spring 3 mới mà làm cho làm việc với cơ sở dữ liệu nhúng rất dễ dàng.

Phần tốt nhất là nó hoạt động như một DataSource, do đó, nó có thể dễ dàng bị bỏ vào để thay thế hạt hiện tại dataSource của bạn.

<jdbc:embedded-database id="dataSource" type="HSQL"> 
    <jdbc:script location="classpath:schema.sql"/> 
    <jdbc:script location="classpath:test-data.sql"/> 
</jdbc:embedded-database> 

Nếu bạn muốn làm điều này hơn với Java Config, hãy xem EmbeddedDatabaseBuilder (mới trong Spring 3.0).

@Configuration 
public class DatabaseTestConfig { 
    @Bean 
    public DataSource dataSource() { 
     return new EmbeddedDatabaseBuilder() 
      .setType(EmbeddedDatabaseType.HSQL) 
      .addScript("classpath:schema.sql") 
      .addScript("classpath:test-data.sql") 
      .build(); 
    } 
} 
+0

Điều này giống như câu trả lời. Tôi đã chơi xung quanh với HSQLDB và cơ sở dữ liệu nhúng cố gắng để có được hoặc làm việc. Cho đến nay, EB dường như hoạt động tốt. –

+2

+1. My [answer] (http://stackoverflow.com/a/9329628/649852) hoạt động cho Spring 2.X; bây giờ chúng ta đang ở trên Spring 3.X, tôi nghĩ chúng ta sẽ chuyển sang phương pháp này. –

+0

Tôi thấy điều này chỉ là tài liệu hướng dẫn mùa xuân 3 khoảng 6 tháng trước. Nó là cực kỳ dễ sử dụng (không phải là phương pháp của câu trả lời của bạn không phải là) và tôi đã có thể đưa nó vào thử nghiệm một số lần đã. –

3

Trong hướng dẫn bạn liên kết tới, một trong những cách để thiết lập mọi thứ là thế này (sau khi chỉnh rõ ràng):

  • Trong bộ nhớ từ một kịch bản: jdbc:hsqldb:file:path-to-file

Tôi nghĩ rằng điều đó dường như có liên quan. Tôi đề nghị thay thế path-to-file với cái gì đó trông giống như một tên tập tin đầy đủ trình độ ...

+0

Nhưng điều đó có duy trì DB trong tệp thay vì trong bộ nhớ không? Tôi có thể giả định điều này là an toàn không nếu tôi quay trở lại tất cả các quá trình chuyển đổi? –

+0

@John: Nó thường duy trì nó trong bộ nhớ theo mặc định (cấu hình trên cơ sở mỗi bảng) mặc dù nó sẽ di chuyển nó vào đĩa để nó sẽ tồn tại. Than ôi, tài liệu không rõ ràng về các chi tiết tốt về chính xác những gì cần phải có; Tôi đoán rằng bạn sẽ phải thử nghiệm một chút và mọi thứ sẽ trở nên rõ ràng. (Đó là một chút của một điều xấu để nói về phần của tôi ...) –

+1

Để tham khảo trong tương lai của người khác: khi bạn làm điều này, nó chạy nó chủ yếu trong bộ nhớ, nó cực kỳ nhanh chóng, nhưng nếu bạn thực hiện thay đổi nó cuối cùng sẽ tuôn ra chúng quay lại đĩa, có lẽ không phải là thứ bạn muốn. Để khắc phục điều này, bạn cần đặt tùy chọn 'files_readonly' hsqldb. Làm điều này trong chuỗi kết nối không hợp lệ, nhưng bạn có thể làm điều đó trong tệp thuộc tính DB: Lần đầu tiên bạn chạy trên, nó sẽ tạo [path-to-file] .properties nếu nó chưa tồn tại . Thêm một dòng mới nói 'hsqldb.files_readonly = true' ở cuối phần đó, và bạn đã hoàn tất. –

2

Bạn có thể làm được việc này bằng cách tạo ra một lớp con của BasicDataSource với getters/setters cho hai thuộc tính mới, initExecuteSqlFiledestroyExecuteSqlFile, có thể có một bằng dấu phẩy tách danh sách các tệp SQL để thực thi. Lớp con sẽ có các phương thức init()destroy() xử lý tệp init/destroy SQL.

Sau đó sử dụng định nghĩa bean sau:

<bean 
    id="datasource" 
    class="com.example.MyBasicDataSource" 
    destroy-method="destroy" 
    init-method="init" 
> 
    <property name="destroyExecuteSqlFile"> 
     <value>h2-destroy-01.sql</value> 
    </property> 
    <property name="initExecuteSqlFile"> 
     <value>h2-init-01.sql,h2-init-02.sql,h2-init-03.sql</value> 
    </property> 
    <!-- Other properties --> 
</bean> 
+0

Vì vậy, chúng tôi vẫn cần phải thực hiện một số logic populating bên trong init()? – udalmik

5

Nicholas Câu trả lời là hoàn toàn tốt đẹp, nhưng bạn có thể sử dụng jdbc namespace để khởi tạo cơ sở dữ liệu bên ngoài cũng như:

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/DS"/> 

<jdbc:initialize-database data-source="dataSource"> 
    <jdbc:script location="classpath:/META-INF/database/init.sql"/> 
</jdbc:initialize-database> 
0

Với nhúng-cơ sở dữ liệu, chúng tôi sẽ chỉ có thể kết nối với cơ sở dữ liệu so với cùng JVM. Nếu chúng ta có hai JVM, cho hiệu suất hoặc các ràng buộc khác, chúng ta có thể:

  1. Thay vì sử dụng một nhúng-cơ sở dữ liệu, bạn có thể sử dụng nguồn dữ liệu đề xuất trong this answer.

  2. Sau đó khởi tạo như Poitrek De được đề xuất (và cũng được đề xuất trong số previous answer). Bạn có thể muốn tạo bảng chỉ khi chúng không tồn tại (như đề xuất here).

Các vấn đề liên quan