2010-08-17 52 views
13

Tôi đang lên kế hoạch triển khai phiên bản nguồn mở GlassFish v3 sang môi trường sản xuất. Nó đi kèm với JavaDB (Apache Derby) mà chỉ là những gì tôi cần. Vấn đề duy nhất là JavaDB không được khởi động theo mặc định khi GlassFish khởi động. Tôi sẽ phải đi đến dòng lệnh và nhập:Tự động khởi động JavaDB (Derby) trên GlassFish

asadmin start-database 

Có cách nào để tự động khởi động cơ sở dữ liệu bất cứ khi nào máy chủ (GlassFish) bắt đầu? Tôi ghét làm điều đó bằng tay mọi lúc trong khi tôi đang phát triển ứng dụng của tôi và tôi chắc chắn không muốn làm điều đó trong sản xuất.

Cảm ơn trước

Trả lời

6

Khi bạn đi vào sản xuất, bạn có thể bắt đầu db một lần và chỉ để lại cho nó chạy, không phụ thuộc vào trạng thái của máy chủ ứng dụng.

Bạn có thể tạo tập lệnh shell để 'bó' tên miền bắt đầu và cơ sở dữ liệu bắt đầu thành một lệnh khởi động đơn lẻ.

+0

Đây là những gì tôi đã có kế hoạch làm vì không có gì khác là có thể. Cảm ơn vì sự trả lời. –

+0

Bạn có thể cung cấp tập lệnh mẫu không? – NonlinearFruit

9

Đây là một ít ngày nhưng có một hộp kiểm trong phần GlassFish trong sở thích của Eclipse có tiêu đề "Bắt đầu quá trình cơ sở dữ liệu JavaDB khi khởi động máy chủ GlassFish". Tôi đang chạy Eclipse Indigo SR1.

+0

Vâng, tôi biết hộp kiểm nhỏ, nhưng chắc chắn rằng trong cùng một hộp thoại trỏ đến đúng vị trí JavaDB, tôi đã sai và Eclipse không thể bắt đầu Derby, mất một lúc để phát hiện! –

+0

Cảm ơn, Carl. Netbeans có cùng tùy chọn, và nó được kích hoạt theo mặc định. – DavidS

3

Đây là những gì tôi làm, tôi triển khai máy chủ này được đóng gói dưới dạng EJB JAR. Điều này sẽ cho phép máy chủ Derby được bắt đầu như là ứng dụng doanh nghiệp của riêng nó.

import java.io.PrintWriter; 

import javax.annotation.PostConstruct; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 

import org.apache.derby.impl.drda.NetworkServerControlImpl; 

@Singleton 
@Startup 
public class LocalDatabase { 

private NetworkServerControlImpl networkServerControlImpl = null; 

@PostConstruct 
private void init() throws Exception { 
    networkServerControlImpl = new NetworkServerControlImpl(); 
    networkServerControlImpl.start(new PrintWriter(System.out)); 
} 

} 
2

tôi sẽ tư vấn để tận dụng lợi thế từ thực tế là Derby có thể thực hiện cả hai như nhúng máy chủ (tức là chạy trong JVM máy chủ ứng dụng) và máy chủ mạng (tức là phục vụ yêu cầu khách hàng giải quyết để mặc định cổng 1527 từ máy chủ cục bộ). Do đó, bạn được hưởng lợi từ việc tăng hiệu suất của chế độ được nhúng, nhưng vẫn cho phép truy cập từ ví dụ: "ij" để quản lý dữ liệu trong khi máy chủ đang chạy và từ các phiên bản máy chủ khác qua TCP/IP với các cài đặt bảo mật phù hợp. Trong cấu hình đó, Derby khởi động và dừng cùng với máy chủ ứng dụng. Không cần lệnh bổ sung hoặc mã khởi động máy chủ rõ ràng để khởi chạy trận derby.

Cấu hình được mô tả dưới đây cho Glassfish 4 và derby/javaDB 10.10, nhưng sẽ hoạt động tương tự trong các máy chủ và phiên bản khác. Bạn thực sự phải điều chỉnh tất cả các đường dẫn bên dưới để phù hợp với cài đặt của riêng bạn.

.1. Tạo các lớp derby có sẵn cho trình nạp lớp phổ biến của máy chủ bằng cách thêm derby.jar, derbyclient.jar, derbynet.jar, derbytools.jar. Sao chép ví dụ của jar vào lib/ext JVM của cá thể máy chủ của bạn, ví dụ: vào C:\java\J2EESDK7U1\glassfish\domains\domain1\lib\ext

.2. Sử dụng GUI quản trị glassfish, thêm hai thuộc tính sau vào tab Configurations> server-config> JVM settings> tab tùy chọn JVM: -Dderby.drda.startNetworkServer=true-Dderby.system.home=C:/java/J2EESDK7U1/glassfish/databases. Việc đầu tiên yêu cầu Derby bắt đầu nghe trong chế độ mạng khi công cụ nhúng được tải, thứ hai cung cấp đường dẫn thiết yếu cho cơ sở dữ liệu derby của bạn và tệp derby.properties tùy chọn (ví dụ: cài đặt bảo mật của bạn trong PROD)

.3. sắp xếp cho máy chủ tải lớp org.apache.derby.jdbc.EmbeddedDriver khi khởi động.Một cách để đạt được điều này là ví dụ để chú thích một EJB với @Startup, và sau đó xác định một @PostConstruct phương pháp chú thích trong EJB, giống nhau:

@PostConstruct 
private void startup() { 
    try { Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 
     logger.info("Started DERBY in embedded+network mode"); 
    } catch (ClassNotFoundException e) { 
     ... your error handling 
    } 
} 

cho 6 lời khuyên khởi động khác, xem http://blog.eisele.net/2010/12/seven-ways-to-get-things-started-java.html

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