可以同时使用Hibernate和Tomcat连接池?(can Use Hibernate and T

2019-09-20 03:25发布

我开发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,现在我想知道的是它可能对我来说我们在我的应用程序使用这两者(我的意思是我的代码中使用的某些部分休眠和某些部分用我的DAO连接? )如果是,什么会发生,不是与Hibernate映射,但是某些映射表与他们有关系的表?

Answer 1:

我个人的偏好与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点有关排除休眠内置事务管理,他是完全正确的,Hibernate提供合理的事务支持,而且如果给定一个JTA将与任何对正在进行的事务同步。 在您需要Hibernate和JDBC代码在同一个JDBC事务,以确保Hibernate的Session是使用相同的连接作为JDBC代码是很重要的操作没有JTA应用,要做到这一点的最好办法是给连接到会话工厂。 请注意,这使用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();
}

它会工作得很好。



Answer 2:

我想你可以使用它们在一起,但为什么你会吗? 你可以配置Hibernate改用像在描述你的数据源手册 。 这将是这样的:

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

至于映射去,“映射”表可以有关系,“未映射”表(在数据库中),但这些关系也将是(如Hibernate不会意识到他们的)“未映射”。 所以,如果你走那条路,你必须确保在尝试,比如说,插入/更新“映射”实体,你会不会引起任何参照完整性问题。



文章来源: can Use Hibernate and Tomcat Connection pool at same time?