Hibernate中session.getconnection()的方法

本文介绍在Hibernate3.3.2版本中如何使用SessionFactoryUtils获取数据库连接,代替已弃用的getSession().connection()方法,并提供了一个具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         Hibernate3.3.2版本中getSession().connection()已被弃用,替代方法SessionFactoryUtils.getDataSource(getSessionFactory()).getConnection()

来自类org.springframework.orm.hibernate3.SessionFactoryUtils


例子:

publicclass SqlServiceImpl extendsHibernateDaoSupport {

    Connection connection = null;
    PreparedStatement statement = null;

    public int exeSQL(final String sql) {
        return (Integer) super.getHibernateTemplate().execute(
                new HibernateCallback() {
                    public Object doInHibernate(Session session)
                            throws HibernateException, SQLException {                       
                        connection = SessionFactoryUtils.getDataSource(
                                session.getSessionFactory()).getConnection();
//                        connection=session.connection();
                        statement = connection.prepareStatement(sql);
                        return statement.executeUpdate();
                    }
                });
    }

}

注:

1、关闭connection、statement连接

2、在applictioncontext.xml文件中配置数据源DataSource

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
          <!-- 其它配置信息-->
</bean>




### JSPGOU 500 错误与 Hibernate 连接问题分析 当遇到 `GenericJDBCException` 和 “Could not open connection” 的错误提示时,通常表明应用程序在尝试通过 JDBC 建立数据库连接时失败。以下是可能的原因以及解决方案: #### 可能原因及解决方法 1. **数据源配置不正确** 数据库连接池未正确定义可能导致此问题。如果使用的是 Hibernate 默认事务管理器,则需要确认 `hibernate.cfg.xml` 或 Spring 配置文件中的数据源设置是否正确[^1]。 ```xml <property name="connection.datasource">java:jboss/datasources/ExampleDS</property> ``` 2. **驱动程序缺失或版本冲突** 如果缺少相应的 JDBC 驱动程序或者存在多个不同版本的驱动程序,可能会引发此类异常。需确保项目中引入了正确的 JDBC 驱动依赖项。 对于 Maven 项目,可以添加如下依赖: ```xml <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> ``` 3. **网络或权限问题** 数据库服务器不可达、端口被防火墙阻止或是用户名密码验证失败也可能导致该错误。建议检查以下几点: - 数据库服务状态正常运行; - 应用程序使用的 IP 地址和端口号无误; - 提供的有效凭证具有足够的访问权限。 4. **事务工厂类选择不当** 当前环境下的事务处理机制不适合当前部署场景会触发类似的异常消息。例如,在非 Java EE 容器环境下选择了基于 JTA 的事务支持方式 (org.hibernate.transaction.JTATransactionFactory),这通常是不必要的并容易造成兼容性难题。改为本地事务模式可能是更合适的选择之一。 修改后的配置示例: ```properties hibernate.transaction.factory_class=org.hibernate.transaction.TransactionManagerLookup hibernate.current_session_context_class=jta ``` 5. **资源泄漏** 若之前的操作未能妥善关闭 Session 导致过多占用连接数直至耗尽可用数量也会显现上述症状。务必遵循最佳实践来管理和释放这些昂贵的对象实例。 #### 示例代码调整 下面展示如何安全地获取 session 并执行查询操作的一个简单例子: ```java SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = null; try { session = sessionFactory.openSession(); // 打开一个新的session Transaction tx = session.beginTransaction(); // 开始事物 List results = session.createQuery("from SomeEntity").list(); tx.commit(); //提交事物 } catch(Exception e){ if(session !=null && session.getTransaction().getStatus()==TransactionStatus.ACTIVE ){ session.getTransaction().rollback();//回滚事物 } throw new RuntimeException(e); } finally{ if(session!=null){ session.close(); // 关闭session } } ``` #### 性能优化建议 为了减少因频繁创建销毁 sessions 而带来的性能损耗,考虑采用线程局部存储(ThreadLocal)技术实现单一线程内的重复利用策略;另外还可以借助第二级缓存进一步提升读取效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值