显示标签为“hibernate”的博文。显示所有博文
显示标签为“hibernate”的博文。显示所有博文

4/14/2009

Hibernate运行报错:org.hibernate.TransactionException: JDBC rollback failed

现象:
系统刚刚部署好的当天,访问系统没有问题,运行一段时间后访问该系统便会报错:org.hibernate.TransactionException: JDBC rollback failed,这个时候再重启tomcat一切又都好用了。也可以通过下面的方法测试,重新启动tomcat,一切好用,运行一段时间后,继续报错…服务器控制台提示:关闭的连接。
页面提示错误:

org.hibernate.TransactionException: JDBC rollback failed org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:150) com.hostel.guest.Base.BaseDAO.save(BaseDAO.java:646) com.hostel.guest.Base.BaseLogDAO.savesysloginfo(BaseLogDAO.java:199) com.hostel.guest.servlet.AdminLogin.service(AdminLogin.java:99) javax.servlet.http.HttpServlet.service(HttpServlet.java:810) com.hostel.guest.servlet.MainServlet.service(MainServlet.java:586) javax.servlet.http.HttpServlet.service(HttpServlet.java:810) org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)控制台错误:

org.hibernate.TransactionException: JDBC rollback failed
at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:150)
at com.hostel.guest.Base.BaseDAO.save(BaseDAO.java:646)
at com.hostel.guest.Base.BaseLogDAO.savesysloginfo(BaseLogDAO.java:199)
at com.hostel.guest.servlet.AdminLogin.service(AdminLogin.java:99)
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.sql.SQLException: 关闭的连接

网上的解决方法如下:
方法一:上网查了一下,有人说是数据库事务的原因,要把hibernate的autocommit设为false,我找了一下这个好像要在代码里面设置,而不能通过简单的设置Hibernate的配置文件来设置,就没有继续走这条路。后来想到可能是数据库连接池的原因。
方法二:在hibernate配置文件中加入对c3p0连接池的配置,同时将c3p0-0.8.4.5.jar拷贝到应用的lib文件夹下。这里说明一下,如果没有这个配置,hibernate默认使用其自身的数据库连接池。配置后则采用第三方的c3p0连接池。
使用c3p0连接池后确实没有问题了,但是我还是不明白为什么使用默认的连接池会有问题,如果哪位大哥清楚麻烦回复一下啊,谢谢!

把Hibernate的connection.autocommit设置为false

出现这个问题的原因
首先, 你的代码是从数据库读取用户信息, 不是写入数据. 所以不能使用事务和rollback方法.
第二, 当你更新和插入一条记录到数据库, 使用事务的时候, 关闭数据库的自动提交. 检查你的连接池是否正常.
第三, 当你有一个错误, 一定要关闭你的Hibernate连接. 当你捕获一个异常, 使用finally关闭hibernate Session或者数据库连接.
另外, 可能连接池已经用完.

3/29/2009

java中报表打印通过生成CSV格式文件来解决

最近的项目需要对数据进行查询并声称报表打印,也就是把数据库中的字段遍历后输出;

撇开使用其他控件外直接来生成统计报表,一般常用的方法都是直接输出为一个新的htm页面.这个方法的好处是所见即所的。但是缺点是调整格式特别麻烦.需要在dw或frontpage中调后格式后,遍历玩数据后往中写数据。

但是考虑到维护性,而且方便性,可让用户自己调整打印格式,并可下载保存统计报表,最方便的就是生成CSV文件,让用户下载保存,自己排版并打印;代码如下:

//生成日志CSV文件
if (cmd.equals(”CreatelogCsv”)){
String type=request.getParameter(”type”);
response.setContentType(”text/csv”);
response.setHeader(”Cache-Control”, “no-cache”);
response.setCharacterEncoding(”GB2312″);
response.addHeader(”Content-Disposition”, “attachment; filename=\”"+URLDecoder.decode(”report.csv”,”GB2312″)+ “\”");
response.getWriter().write(”操作人员,操作类型,操作内容,访问IP,操作时间\r\n”);
List list =null;

if (type.equals(”syslog2″)){
//系统管理员全部日志
list =logdao.querysyslogbydate(”1000000000″,”",0,0);
}

if (list!=null && list.size()>0){
Iterator it =list.iterator();
while (it.hasNext()){
LogId logidinfo = (LogId) it.next();
response.getWriter().write(URLDecoder.decode(logidinfo.getLogUser(),”GB2312″)+”,”
+URLDecoder.decode(logidinfo.getLogType(),”GB2312″)+”,”
+URLDecoder.decode(logidinfo.getLogContent(),”GB2312″)+”,”
+URLDecoder.decode(logidinfo.getLogIp(),”GB2312″)+”,”
+URLDecoder.decode(logidinfo.getLogData(),”GB2312″)+”\r\n”);
}
}

}

讨论Hibernate通过criteria对时间的处理

环境 :oracle9i,Tomcat5.0,winxp测试通过 ;

Hibernate中对时间的处理直接使用hql肯定是最方便的,但是criteria示例查询又是不非常不错的选择,在criteria中如何对时间进行查询。

Criteria criteria = getSession().createCriteria(GasthausInfo.class);

//按照时间来查询
if (hostel.getRegisterdate()!=null){
//按照注册时间来查询
residedatestr = PubMethod.parse(hostel.getRegisterdate(),”yyyy-MM-dd”);
criteria.add(Expression.between(”registerdate”,
PubMethod.parse((residedatestr+” 00:00:01″),”yyyy-MM-dd HH:mm:ss”),
PubMethod.parse((residedatestr+” 23:59:59″),”yyyy-MM-dd HH:mm:ss”)));
}

criteria.add(Example.create(hostel).excludeProperty(”registerdate”));//屏蔽掉示例查询中对registerdate字段。然后通过Expression.between()来进行查询,

数据库中registerdate字段为date 或varchar都支持。。。

[转]仿照hibernate 生成无重复主键

用过hibernate的人一定都知道uuid.hex主键生成方式,非常爽。

由于其生成的ID的特殊方式,很受大家喜爱。

我把hibernate这段代码搬了出来。整理了一下。方便大家用在其它地方,如附件名生成等。

代码如下:

/*
* Last Modify: 2005年1月13日 1:57:4
*/
package com.schoolwx.core.id;

import java.net.InetAddress;
import java.util.Properties;

/**
* Filename: UUIDHex.java

* Ttitle: HEX类型主键生成器生成类

* Description:

* Copyright: Copyright (c) 2001-2004 schoolwxr,Inc.All Rights Reserved.

* Company: bluestar

* Author: dkmilk

* Telephone: 86-28-85239210

* Date: 2004-9-14

* Time: 12:50:43

* Version: 2.0.0

*/
public class UUIDHex {

private static final int IP;

private String sep = “”;

static {
int ipadd;
try {
ipadd = toInt(InetAddress.getLocalHost().getAddress());
} catch (Exception e) {
ipadd = 0;
}
IP = ipadd;
}

private static short counter = (short) 0;
private static final int JVM = (int) (System.currentTimeMillis() >>> 8);
/**
* Unique across JVMs on this machine (unless they load this class
* in the same quater second - very unlikely)
*/
private int getJVM() {
return JVM;
}

/**
* Unique in a millisecond for this JVM instance (unless there
* are > Short.MAX_VALUE instances created in a millisecond)
*/
private short getCount() {
synchronized (UUIDHex.class) {
if (counter < 0) counter = 0;
return counter++;
}
}

/**
* Unique in a local network
*/
private int getIP() {
return IP;
}

/**
* Unique down to millisecond
*/
private short getHiTime() {
return (short) (System.currentTimeMillis() >>> 32);
}

private int getLoTime() {
return (int) System.currentTimeMillis();
}

private static int toInt(byte[] bytes) {
int result = 0;
for (int i = 0; i < 4; i++) {
result = (result << - Byte.MIN_VALUE + (int) bytes[i];
}
return result;
}

public void configure(Properties params) {
sep = params.getProperty(”seperator”);
}
protected String format(int intval) {
String formatted = Integer.toHexString(intval);
StringBuffer buf = new StringBuffer(”00000000″);
buf.replace(8 - formatted.length(), 8, formatted);
return buf.toString();
}

protected String format(short shortval) {
String formatted = Integer.toHexString(shortval);
StringBuffer buf = new StringBuffer(”0000″);
buf.replace(4 - formatted.length(), 4, formatted);
return buf.toString();
}

public String generate() {
return new StringBuffer(36)
.append(format(getIP())).append(sep)
.append(format(getJVM())).append(sep)
.append(format(getHiTime())).append(sep)
.append(format(getLoTime())).append(sep)
.append(format(getCount()))
.toString();
}

public static String getUUIDHex() {
Properties props = new Properties();
props.setProperty(”seperator”, “”);
UUIDHex uh = new UUIDHex();
uh.configure(props);
return uh.generate();
}

/**
* 实例
*
* @param arg
*/
public static void main(String[] arg) {
System.out.println(UUIDHex.getUUIDHex());
}

}