2009-07-22 18 views
5

Estoy desarrollando una aplicación Java Web y que utiliza Tomcat agrupación de conexiones, aquí está mi configuración:puede usar Hibernate y Tomcat Connection pool al mismo tiempo?

<?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> 

y mi DAO:

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; 
    } 

quiero usar hibernación así que refactorizar alguna parte de mi código, ahora quiero saber si es posible para nosotros usar ambos en mi aplicación (me refiero a que parte de mi código use hibernate y alguna parte use mi conexión DAO) En caso afirmativo, ¿qué pasará con esas tablas? que no se ha mapeado con hibernación, pero algunas tablas mapeadas tienen relación con ellas?

Respuesta

2

Mi preferencia personal con hibernate es no configurarlo con un grupo de conexiones. Esto puede hacerse simplemente omitiendo la configuración del grupo de conexión en nuestra configuración de hibernación y utilizando el método openSession (Conexión):

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(); 
} 

Esto tiene la ventaja de que usted está en control de lo que se está utilizando la conexión y dónde se encuentra asignado, y lo más importante donde está cerrado, esto puede ser importante si está realizando una transacción usando el código hibernate y jdbc.

EDITAR: en @ ChssPly76 el punto de excluir hiberna en la gestión de transacciones incorporada, y él tiene razón, hibernate proporciona soporte de transacción razonable y si se da una JTA se sincronizará con cualquier transacción en curso. En una aplicación que no sea JTA donde requiera hibernación y código jdbc para operar en la misma transacción jdbc, es importante asegurarse de que la sesión hibernate esté usando la misma conexión que el código jdbc, la mejor manera de hacerlo es dar el Conexión a la fábrica de sesiones. Tenga en cuenta que esto no excluye el uso de un objeto de transacción de 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(); 
} 

funcionará bien.

+0

¿Quiere decir que omito mi configuración JNDI en context.xml y cuando quiero Quering DB (no quiero usar hibernate) obtener una conexión de hibernate sessionFactory? luego actuar como una conexión JDBC común? – Am1rr3zA

+0

@gid ¿Puede explicar por qué? Hibernate proporciona su propia administración de transacciones (o usará JTA), entonces, ¿por qué le importaría que la conexión se cierre o, mejor dicho, que se devuelva al grupo? Parece que estás haciendo manualmente muchas cosas que Hibernate haría por ti. ¿Me estoy perdiendo de algo? – ChssPly76

+0

Me refiero a omitir la configuración de conexión (es decir, la referencia JNDI y/o cualquier otra referencia a las conexiones de la configuración de hibernación) –

3

Supongo que puede usarlos juntos, pero ¿por qué lo haría? Puede configurar Hibernate para usar su fuente de datos en lugar de como se describe en el manual. Sería algo así como:

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

En cuanto a las asignaciones de ir, "mapeados" tablas pueden tener relaciones con tablas "sin asignar" (en la base de datos), pero esas relaciones también será "sin asignar" (por ejemplo, Hibernate ganó estar al tanto de ellos). Entonces, si vas por ese camino, debes asegurarte de que no causarás ningún problema de integridad referencial al intentar, digamos, insertar/actualizar la entidad "mapeada".

+0

Tanx por su respuesta, debo probarlo para entender qué pasa exactamente. – Am1rr3zA

+0

Este enfoque se describe con más detalle en [este blog] (http://workblognotes.blogspot.ca/2010/08/hibernate-and-tomcat-database.html). – Pixel

Cuestiones relacionadas