可以同时使用Hibernate和Tomcat连接池吗?

时间:2009-07-22 05:07:07

标签: java hibernate jdbc

我正在开发一个java web应用程序,我使用Tomcat连接池,这是我的设置:

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

和我的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;
    }

我想使用hibernate,所以我重构了我的代码的一部分,现在我想知道我可能在我的应用程序中使用它们(我的意思是我的代码的一部分使用hibernate而某些部分使用我的DAO连接?) 如果是的话,那些没有用hibernate映射的表会发生什么,但是一些映射表与它们有关系?

2 个答案:

答案 0 :(得分:3)

我想你可以一起使用它们,但为什么会这样呢?您可以将Hibernate配置为使用您的数据源,而不是像manual中所述。它会是这样的:

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

就映射而言,“映射”表可以与“未映射”表(在数据库中)有关系,但这些关系也将“未映射”(例如,Hibernate不会意识到它们)。因此,如果你这样做,你必须确保在尝试插入/更新“映射”实体时不会引起任何参照完整性问题。

答案 1 :(得分:2)

我个人对hibernate的偏好是不要用连接池配置它。这可以通过在hibernate配置中省略连接池设置并使用openSession(连接)方法来完成:

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

这样做的好处是,您可以控制正在使用的连接以及分配的位置,最重要的是它在关闭的位置,如果您使用hibernate和jdbc代码执行事务,这可能很重要。

编辑:在@ ChssPly76关于排除hibernates内置事务管理的观点,他是非常正确的,hibernate提供合理的事务支持,如果给定的JTA将与任何正在进行的事务同步。在一个无JTA应用程序中,您需要hibernate和jdbc代码在同一个jdbc事务中运行,确保hibernate Session使用与jdbc代码相同的Connection非常重要,最好的方法是给出连接到会话工厂。请注意,这不排除使用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();
}

它会正常工作。