2013-08-16 30 views
11

Tôi đang cố gắng duy trì cùng một thực thể cho cả cơ sở dữ liệu MySQL và Postgres (chủ yếu để xác định bất kỳ mâu thuẫn nào và tìm hiểu chi tiết về bất kỳ vấn đề nào khi thực hiện ghi kép - Tôi đã chạy vào đây). Các bài viết tôi đã tìm thấy có tất cả các giải pháp được mô tả phụ thuộc vào các khung công tác bổ sung. Tôi đang cố gắng để giải quyết điều này bằng cách sử dụng Glassfish 4.0 ngoài hộp, JPA 2.1 với EclipseLink 2.5 là nhà cung cấp JPA. Tôi đang sử dụng Eclipse, và nhận ra rằng IDE không hỗ trợ cấu hình nhiều đơn vị persistence trong tệp persistence.xml, vì vậy tôi đang viết XML trực tiếp cho nó.persistence.xml cho nhiều đơn vị liên tục

Tôi đã chờ đợi để làm một cái gì đó như thế này trong các mã (trong cùng một phương pháp):

@PersistenceContext(name = "MyAppMySQLPU") 
EntityManager emMySQL; 
@PersistenceContext(name = "MyAppPostgresPU") 
EntityManager emPostgres; 
//...etc... 
MyThing thing = new MyThing(); 
//...etc... 
emMySQL.persist(thing); 
emPostgres.persist(thing); 

và sử dụng một tập tin persistence.xml chứa này:

<persistence-unit name="MyAppPostgresPU"> 
    <jta-data-source>jdbc/PostgresPool_test</jta-data-source> 
    <class>model.MyThing</class> 
    </persistence-unit> 

    <persistence-unit name="MyAppMySQLPU"> 
    <jta-data-source>jdbc/MySQLPool_test</jta-data-source> 
    <class>model.MyThing</class> 
    </persistence-unit> 

Khi tôi làm điều này, tôi nhận được lỗi sau:

SEVERE: Exception while invoking class org.glassfish.persistence.jpa.JPADeployer prepare method 
SEVERE: Exception while preparing the app 
SEVERE: Exception while preparing the app : Could not resolve a persistence unit corresponding to the persistence-context-ref-name [MyAppPostgresPU] in the scope of the module called [MyApp]. Please verify your application. 

Nhưng, nếu tôi chỉ bao gồm một trong số <persistence-unit> cụm từ (không quan trọng cái nào), thực thể được lưu vào cơ sở dữ liệu liên quan - tôi không thể tìm ra cách làm cho nó hoạt động với cả hai cùng một lúc (không tận dụng chức năng kiên trì trong các khung công tác bổ sung).

Trả lời

15

Có hoạt động; một số điều phải được thực hiện. Có vẻ như một phần quan trọng của việc này là để sử dụng nhiều cơ sở dữ liệu với cách tiếp cận mà tôi đã thực hiện, loại kết nối nhóm cần phải được thiết lập để sử dụng các giao dịch phân tán. Vì đây thực chất là một thử nghiệm, cả hai db vẫn tồn tại không cần để có cùng một giao dịch, nhưng nó không phải là một vấn đề cho nó theo cách đó. (This bài viết hữu ích trong việc xác định rằng từ các thông báo lỗi). Nó cũng cần thiết để thay đổi các tham số Postgres như mô tả here, để cho phép các giao dịch đã chuẩn bị.


này có tất cả đi:

(1) Trong Glassfish:
Trong hồ kết nối JDBC, thay đổi loại tài nguyên cho cả của db để javax.sql.XADataSource. Thay đổi Tên lớp dữ liệu cho Postgres thành org.postgresql.xa.PGXADataSource; thay đổi Tên lớp dữ liệu cho MySQL thành com.mysql.jdbc.jdbc2.optional.MysqlXADataSource.

(2) Trong cấu hình Posgres (postgresql.config):
Enable max_prepared_transactions và đặt nó vào được 1 lớn hơn max_connections. (Tôi phải chơi xung quanh với cả hai tham số để tìm ra thứ gì đó không làm hỏng tất cả bộ nhớ dùng chung, nhưng vì đây chỉ là một thử nghiệm, nên giảm số lượng kết nối db so với bộ nhớ được chia sẻ tăng là OK)

(3) trong đoạn mã:
Thay đổi @PersistenceContext(name="...") để @PersistenceContext(unitName="...")


nên biết trước về "câu trả lời" này - Hầu hết trong số này là mới đối với tôi, vì vậy điều này có thể không phải là cách thanh lịch nhất để xử lý này. Nếu bất cứ ai có thể cung cấp một "thực hành tốt nhất" để giải quyết điều này, tôi sẽ rất quan tâm để biết.

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