昨天面试了的时候,做了一个笔试题,只有5个题目这个样子。
其中有一道是这样子的,为什么要有事物,当时我的回答大概是防止脏数据的产生。
还有一道题是写一段导致内存泄漏的程序,好吧,我是空白的。我当时想内存泄漏不是C中指针导致的吗?java中没有概念
今天在家待业中,就百度了一下。
事务对数据库来说就是进行统一的提交或回滚。在sql developer中就有提交和回滚的按钮。就是对于一些操作要么成功,要么失败,没有中间领域,不能成功了一半。
在jdbc中是通过Connection对象进行事物管理的,默认是自动提交事务,默认是制动提交的。可以手动关闭。通过commit方法进行提交,rollback方法进行回滚。
如果不提交的话,数据不会真正的插入到数据库中。
Hibernate中是通过Transaction进行事物管理,处理方法与jdbc中类似
spring中也有自己的事务管理机制,使用transactionManager进行管理,可以通过spring注入来实现。
事务实在的作用是在异常时保持数据一致,执行或取消执行(上面是参考百度知道的)
一般来说内存泄漏有两种情况。一种情况如在C/C++,在堆中分配的内存,在没有将其释放掉的时候就将所有能访问这块的内存的方式都删掉(如指针重新赋值);令一种
情况则是在内存对象已经不需要的时候,还仍然保留这块内存和它的访问方式(引用)。
在java中也存在内存泄漏。虽然有垃圾收集器自动管理内存的回收,程序员不需要通过调用函数来释放内存。C++中的内存泄漏表现为
无用对象,不可达。而在java中的内存对象表现为无用对象,可达。
下面给出了一个简单的内存泄露的例子。在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个Vector中,如果我们仅仅释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将Vector对象设置为null。
Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
Object o=new Object();
v.add(o);
o=null;
}
//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。