Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以同时使用Hibernate和Tomcat连接池吗?_Java_Hibernate_Jdbc - Fatal编程技术网

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

Java 可以同时使用Hibernate和Tomcat连接池吗?,java,hibernate,jdbc,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=

我正在开发一个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>
我想使用hibernate,所以我重构了部分代码,现在我想知道我们是否可以在我的应用程序中同时使用它们(我的意思是我的部分代码使用hibernate,另一部分代码使用DAO连接?)
如果是,那些没有使用hibernate映射但某些映射表与之相关的表会发生什么情况?

我想您可以将它们一起使用,但为什么要这样做?您可以将Hibernate配置为使用数据源,如中所述。可能是这样的:

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

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

我个人对hibernate的偏好是根本不使用连接池对其进行配置。只需在hibernate配置中省略连接池设置,并使用openSession(connection)方法即可:

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

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

它会很好地工作。

Tanx对于您的答案,我必须对它进行一些测试,以了解到底发生了什么。这种方法在中有更详细的描述。您的意思是我在context.xml中省略了我的JNDI配置,并且当我想要查询数据库(不想使用hibernate)时,从hibernate sessionFactory获取连接?然后像普通的JDBC连接一样工作?@gid您能解释一下为什么吗?Hibernate提供自己的事务管理(或者您将使用JTA),所以为什么您会关心连接何时关闭,或者,更确切地说,何时返回池?看起来你只是手工做了很多Hibernate会为你做的事情。我遗漏了什么吗?我的意思是省略连接设置(即JNDI引用或hibernate配置中对连接的任何其他引用)
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();
}
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();
}