2009-07-22 42 views
5

Tôi đang phát triển một ứng dụng java web và tôi sử dụng Tomcat kết nối tổng hợp, đây là thiết lập của tôi:có thể sử dụng Hibernate và Tomcat Connection pool cùng một lúc không?

<?xml version="1.0" encoding="UTF-8"?> 
<Context path="" docBase="" debug="5" reloadable="true" crossContext="true"> 
<Resource name="jdbc/jdbcPool" 
      auth="Container" 
      type="javax.sql.DataSource" 
      maxActive="100" 
      maxIdle="30" 
      maxWait="10000" 
      username="root" 
      password="*******" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/dbname?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>    
</Context> 

và DAO tôi:

public static Connection dbConnection() throws NamingException { 
     Context initContext; 
     DataSource ds = null; 
     Connection conn = null; 
     try { 
      initContext = new InitialContext(); 
      Context envContext = (Context) initContext.lookup("java:/comp/env"); 
      ds = (DataSource) envContext.lookup("jdbc/jdbcPool"); 
      conn = ds.getConnection();   
     }catch (SQLException ex){ 
      logger.error("SQLException Occurred in DAO.dbConnection() Method, Exception Message is: " + ex.getMessage(), ex); 
     } 
     catch (RuntimeException er){ 
      logger.fatal("SQLException Occurred in DAO.dbConnection() Method, Exception Message is: " + er.getMessage(), er); 
     }catch(Exception rt){ 
      logger.fatal("Exception Occurred in DAO.dbConnection() Method, Exception Message is: " + er.getMessage(), er); 
     } 
     return conn; 
    } 

Tôi muốn sử dụng chế độ ngủ đông nên tôi refactor một số phần của mã của tôi, bây giờ tôi muốn biết là nó có thể cho tôi chúng tôi sử dụng cả hai trong ứng dụng của tôi (tôi có nghĩa là một số phần của mã của tôi sử dụng hibernate và một số phần sử dụng kết nối DAO của tôi?) Nếu có, điều gì sẽ xảy ra với những bảng mà không ánh xạ với hibernate nhưng một số bảng ánh xạ có mối quan hệ với họ?

Trả lời

2

Sở thích cá nhân của tôi với chế độ ngủ đông là không định cấu hình nó với một hồ bơi kết nối. Điều này có thể được thực hiện bằng cách đơn giản bỏ qua các thiết lập hồ kết nối trong cấu hình hibernate của chúng tôi và sử dụng phương pháp openSession (Connection):

Connection conn = ... // get from jndi 
Session session = sessionFactory.openSession(connection); 
try{ 
    //do some work with either hte connection or the session or both 
}finally{ 
    session.close(); 
    conn.close(); 
} 

này có ưu điểm là bạn đang ở trong kiểm soát trong đó kết nối đang được sử dụng và nó ở đâu được phân bổ và quan trọng nhất là nơi nó được đóng, điều này có thể quan trọng nếu bạn đang thực hiện một giao dịch bằng cách sử dụng mã hibernate và jdbc.

EDIT: trên @ ChssPly76 điểm về việc loại trừ quản lý giao dịch sẵn có, và anh ấy khá đúng, hibernate cung cấp hỗ trợ giao dịch hợp lý và nếu một JTA nhất định sẽ đồng bộ hóa với bất kỳ giao dịch nào. Trong một ứng dụng JTA không yêu cầu cả mã hibernate lẫn jdbc hoạt động trong cùng một giao dịch jdbc, điều quan trọng là phải đảm bảo rằng phiên ngủ đông đang sử dụng cùng một kết nối như mã jdbc, cách tốt nhất để làm điều này là cung cấp Kết nối với nhà máy phiên. Lưu ý rằng điều này không loại trừ việc sử dụng đối tượng giao dịch Hibernate:

Connection conn = ... // get from jndi 
Session session = sessionFactory.openSession(connection); 
try{ 
    Transaction tx = new Transaction(); // 
    //do some work with either hte connection or the session or both 
    tx.commit(); 
}finally{ 
    session.close(); 
    conn.close(); 
} 

nó sẽ hoạt động tốt.

+0

bạn có nghĩa là tôi bỏ qua cấu hình JNDI của tôi trong context.xml và khi tôi muốn Quering DB (không muốn sử dụng ngủ đông) có được một kết nối từ hibernate sessionFactory? sau đó hoạt động như một kết nối JDBC phổ biến? – Am1rr3zA

+0

@gid Bạn có thể giải thích tại sao không? Hibernate cung cấp quản lý chuyển đổi riêng của nó (hoặc bạn sẽ sử dụng JTA) vậy tại sao bạn quan tâm khi kết nối được đóng lại - hay đúng hơn là, quay trở lại hồ bơi? Có vẻ như bạn chỉ tự làm rất nhiều những gì Hibernate sẽ làm cho bạn. Tui bỏ lỡ điều gì vậy? – ChssPly76

+0

Tôi có nghĩa là bỏ qua các thiết lập kết nối (tức là tham chiếu JNDI và hoặc bất kỳ tham chiếu nào khác đến các kết nối từ cấu hình ngủ đông) –

3

Tôi cho rằng bạn có thể sử dụng chúng cùng nhau, nhưng tại sao bạn? Bạn có thể cấu hình Hibernate để sử dụng nguồn dữ liệu của bạn thay vì như được mô tả trong các manual. Nó sẽ là một cái gì đó như:

hibernate.connection.datasource = java:/comp/env/jdbc/jdbcPool 
hibernate.dialect = org.hibernate.dialect.MySQLDialect 

Theo như ánh xạ đi, "ánh xạ" bảng có thể có mối quan hệ để "unmapped" bảng (trong cơ sở dữ liệu), nhưng những mối quan hệ cũng sẽ là "unmapped" (ví dụ như Hibernate thắng 't được nhận thức của họ). Vì vậy, nếu bạn đi theo cách đó bạn phải chắc chắn rằng bạn sẽ không gây ra bất kỳ vấn đề toàn vẹn tham chiếu trong khi cố gắng, nói, chèn/cập nhật "ánh xạ" thực thể.

+0

Tanx cho bạn câu trả lời, tôi phải làm một số thử nghiệm trên nó để hiểu chính xác những gì xảy ra. – Am1rr3zA

+0

Cách tiếp cận này được mô tả chi tiết hơn trong [blog này] (http://workblognotes.blogspot.ca/2010/08/hibernate-and-tomcat-database.html). – Pixel

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