关于hibernate执行sql语句后,进程不关闭的问题

写了一个简单的测试程序,就是java查询数据库的,后面发现了数据库查询结束后,进程一直不会结束,在调试的时候,发现生成了一个线程,是这个线程不关闭。

/**
 *
 */
package com.test.mysql;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

/**
 * @filename BaseDAO.java
 * @author code by jianghuiwen
 * @mail [email protected]
 *
 * 上午11:51:40
 */
public class BaseDAO {
	private static SessionFactory sf=null;
	public void save(Object o)
	{
		sf = new Configuration().configure().buildSessionFactory();
        Session s = null;
        Transaction t = null;  

        try{
            s = sf.openSession();
            t = s.beginTransaction();
            Student temp=(Student) s.get(Student.class, 1);
            temp.setName("wangjun");
            s.save(temp);
            t.commit();
       }catch(Exception err){
            t.rollback();
            err.printStackTrace();
      }finally{  

            s.close();
      }
	}

	public void update(String sql)
	{
		sf = new Configuration().configure().buildSessionFactory();
        Session s = null;
        Transaction t = null;  

        try{
            s = sf.openSession();
            t = s.beginTransaction();
            Query query = s.createQuery(sql);
            query.executeUpdate();

            t.commit();
       }catch(Exception err){
            t.rollback();
            err.printStackTrace();
      }finally{  

            s.close();  

      }  

	}

	public static void main(String[] args) {		

			new BaseDAO().update("update Student set password='11111' where id=1");
			System.out.println("over");

	}

}

后面请教了公司BOSS,才发现是这样一个简单的问题:

--------------------------------------

hibernate建立SessionFactory的时候,会建立一个线程

关闭的时候,关闭session是不会关闭这个线程的

所以会导致和数据库连接的线程一直存在

,因此要关闭和数据库的连接,一定要关闭SessionFactory

因此只要在:

finally{

s.close();

sf.close();

}

加上把sf关闭的语句就可以了。

时间: 2024-11-13 02:39:34

关于hibernate执行sql语句后,进程不关闭的问题的相关文章

执行sql语句后的数据处理api

链接上mysql之后可以使用一些api对数据库进行一些操作 1 int mysql_query(MYSQL * connection, const char * query) 这是执行sql语句的函数,成功的话返回0 1.不返回数据的sql语句 对于update,delete,insert等操作 1 my_ulonglong mysql_affected_rows(MYSQL *connection); 这个函数返回受到影响的行数 2.发现插入的内容 1 select LAST_INSERT_I

Hibernate 执行sql语句返回yntax error: syntax error, expect LPAREN, actual NOT not

hibernate自动创建表时提示 :  ERROR: sql injection violation, syntax error: syntax error, expect LPAREN, actual NOT not : 可是我把sql语句在sql客户端执行是Ok的 后来在一个博客的评论区找到了原因 原来改sql语句执行被druid配置的防火墙拦截了 将druid.filters属性中的wall去掉就好

PDO中执行SQL语句的三种方法

在PDO中,我们可以使用三种方式来执行SQL语句,分别是 exec()方法,query方法,以及预处理语句prepare()和execute()方法~大理石构件来图加工 在上一篇文章<使用PDO构造函数连接数据库及DSN详解>中,我们介绍了如何使用构造函数连接数据库和DSN的详解,那么我们这篇文章跟大家介绍在PDO中执行SQL语句的三种方式,下面我们将一一介绍! 第一种方法:exec()方法 exec()方法返回执行SQL 语句后受影响的行数,其语法格式如下: 1 int PDO::exec(

ORA-01843: 无效的月份,执行sql语句更改为美国语言后仍然失败的解决办法

ORA-01843: 无效的月份失败的 sql 为:XXXXXXXXXXXXXXXX 执行sql语句更改为美国语言后仍然失败, ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; 结果是注册表的问题,优化后多余的语言被清理掉了,所以,要修复注册表 将下面的文件复制保存为注册表文件.reg双击导入注册表. windows server 2005 系统时区文件 Time Zones.reg的文件内容,适用于windows server 2008 r2 我是

DB操作-用批处理执行Sql语句

用批处理在命令行状态下调用查询分析器来执行这个sql文件里的语句.下面就是sqlserver帮助里对于查询分析器(isqlw)命令行参数的解释:isqlw 实用工具(SQL 查询分析器)使您得以输入 Transact-SQL 语句.系统存储过程和脚本文件.通过设置快捷方式或创建批处理文件,可以启动预配置的 SQL 查询分析器. 1.语法 isqlw     [-?] |      [          [-S server_name[instance_name]]          [-d da

在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作

在myeclipse中配置DB Driver(数据库用MySql),并在myeclipse执行sql语句操作 MyEclipse6.5    ,  mysq驱动jar包为mysql-connector-java-5.1.8-bin.jar 在MyEclipse中添加hibernate支持时需要用到DB Driver所以需要配置 首先选择window-->Open Perspective-->Other 出现下图:选择MyEclipse Database Explore. 点击OK后出现如下画面

EF中执行sql语句

EF原理 EF 会自动把 Where().OrderBy().Select()等这些编译成"表达式树(Expression Tree)",然后会把表达式树翻译成 SQL 语句去执行.(编译原理,AST)因此不是"把数据都取到内存中,然后使用集合的方法进行数据过滤",因此性能不会低.但是如果这个操作不能被翻译成 SQL 语句,则或者报错,或者被放到内存中操作,性能就会非常低 跟踪EF的查询Sql语句: DbContext 有一个 Database 属性,其中的 Log

让你提前认识软件开发(20):如何在C语言里面执行SQL语句?

[文章摘要] 在通信类软件中,程序经常需要与数据库打交道.为了实现诸如从数据库中获取数据.更新数据库表某字段.插入或删除某条数据等功能,就需要在C语言程序中构造一些SQL语句,并用函数来执行这些SQL语句. 本文介绍如何在C语言程序中构造并执行SQL语句,为相关软件开发工作的开展提供了参考. [关键词] SQL语句  C语言  程序  流程  开发 一.为什么要在C语言程序中执行SQL语句? 在C语言程序中执行SQL语句的原因有以下几个: (1) 程序需要获取数据库中某数据表的字段值,并对这些字

JDBC系列:(2)使用Statement执行sql语句

执行sql语句的接口 接口 作用 Statement接口 用于执行静态的sql语句 PreparedStatement接口 用于执行预编译sql语句 CallableStatement接口 用于执行存储过程的sql语句(call xxx) 1.执行DDL语句 package com.rk.db.b_statement; import java.sql.DriverManager; import java.sql.Connection; import java.sql.SQLException;