我正在开发一个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&useUnicode=true&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映射的表会发生什么,但是一些映射表与它们有关系?
解决方法:
我个人对hibernate的偏好是不要用连接池配置它.这可以通过在hibernate配置中省略连接池设置并使用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();
}
这样做的好处是,您可以控制正在使用的连接以及分配的位置,最重要的是它在何处关闭,如果您使用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();
}
它会工作得很好.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。