2009-12-18 23 views
5

Tôi hiện đang truy xuất cả UserTransaction và DataSource từ máy chủ Weblogic 10.3 bằng JNDI.Làm thế nào để nhận được các kết nối JDBC thu được từ một nguồn dữ liệu JNDI để tham gia vào một UserTransaction sử dụng Weblogic 10.3?

tôi đã thiết lập các Datasource lên đến 'Hỗ trợ giao dịch toàn cầu' và sử dụng 'Logging Resource cuối'

Hy vọng của tôi là bằng cách bắt đầu một UserTranscation và sau đó lấy một kết nối JDBC từ Datasource kết nối sẽ tham gia vào sự giao dịch.

Điều này có vẻ như không đúng và các tuyên bố chèn của tôi đang được cam kết ngay lập tức và việc quay lại giao dịch sẽ không có hiệu lực.

Các giả định ở trên của tôi có đúng không?

Có ai có thể chỉ cho tôi theo hướng của một số tài liệu hoặc mẫu về cách đạt được điều này không?

Nhiều cảm ơn trước

UPDATE:

Theo yêu cầu ở đây là một phác thảo bộ xương của mã Tôi đang sử dụng:

private void doSomething() { 
Connection conn = null; 
try { 
    Hashtable env = new java.util.Hashtable(); 
    env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory"); 
    env.put(javax.naming.Context.PROVIDER_URL,"t3://localhost:8080"); 
    InitialContext ctx = InitialContext(env)); 

    UserTransaction transaction = null; 
    transaction = (UserTransaction) ctx.lookup("java:comp/UserTransaction"); 

    DataSource dataSource = (DataSource) context.lookup("jdbc/xxxxx/DataSource"); 
    conn = dataSource.getConnection(); 
    transaction.begin(); 
    // JDBC code goes here 
    transaction.commit(); 
} catch(Exception e) { 
    // TODO 
    if (transaction != null) { 
    try { 
    transaction.rollback(); 
    } catch (Exception ex) { 
    // TODO 
    } 
} finally { 
    if (con != null) { 
    conn.close 
    } 
} 
} 

UPDATE 2:

Để giải quyết vấn đề này tôi phải làm 2 việc:

  1. Thay đổi thứ tự của mã để trước hết bắt đầu giao dịch người dùng và sau đó nhận kết nối từ Datastore (như được chỉ ra bởi Pascal Thivent).

  2. Thay đổi Nguồn dữ liệu được tham chiếu bằng '' jdbc/xxxxx/DataSource '' thành XADatasource. Điều này là do tôi đã gọi mã bên trong giao dịch người dùng đã sử dụng Datasource khác đã được định cấu hình để hỗ trợ LLR và được Pascal Thivent chỉ ra bên dưới, bạn chỉ có thể có một LLAS Datasource tham gia vào quá trình chuyển mã.

Tôi đã chấp nhận câu trả lời của Pascal Thivent bên dưới vì giải thích cả hai vấn đề này.

Trả lời

2

Có, giả định của bạn là chính xác và, theo Create LLR-enabled JDBC data sources, nguồn dữ liệu của bạn có vẻ được định cấu hình đúng.

Bạn có nhận được kết nối sau khi bắt đầu giao dịch người dùng không? Bạn có thể hiển thị mã hoặc mã giả của bạn không?

UPDATE: Như đã đề cập trong Programming Considerations and Limitations for LLR Data Sources:

  • When programming with an LLR data source, you must start the global transaction before calling getConnection on the LLR data source. If you call getConnection before starting the global transaction, all operations on the connection will be made outside of the global transaction.

Vì vậy, bạn có thể thử này:

transaction.begin(); //start the global tx before calling getConnection() 
conn = dataSource.getConnection(); 
... 
transaction.commit(); 

UPDATE2: Không chắc để hiểu từ nơi kết nối 2 được đến (mã giả của bạn không hiển thị điều này).Tuy nhiên, theo cùng Programming Considerations and Limitations for LLR Data Sources:

  • Only instances of a single LLR data source may participate in a particular transaction. A single LLR data source may have instances on multiple WebLogic servers, and two data sources are considered to be the same if they have the same configured name. If more than one LLR data source instance is detected and they are not instances of the same data source, the transaction manager will roll back the transaction.

Trên thực tế, không có một ví dụ đại diện đầy đủ, tôi cảm thấy một chút giống như đang đi trong bóng tối :)

+0

Nhờ sự giúp đỡ của bạn cho đến nay. Tôi đã thêm đường viền khung của mã của tôi theo yêu cầu. – lucasweb

+0

Tôi đã thử đề xuất của bạn. Nó dẫn đến lỗi sau: Kết nối đã được tạo trong ngữ cảnh tx này cho nhóm có tên ABI_DS. Nỗ lực bất hợp pháp để tạo kết nối từ một hồ bơi khác: AMS_DS Nơi ABI_DS là nguồn dữ liệu tôi đang sử dụng và AMS_DS là một nguồn dữ liệu khác được định cấu hình cho cùng một triển khai – lucasweb

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