日期:2014-05-17 浏览次数:20683 次
package util;
//mysqltest.java
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import com.chinaMobile.model.Customer;
public final class Mysqltest {
protected static Mysqltest inst = null;
private static final String _url = "proxool.xml-pdjc"; // proxool SourceName
// nickName
// 第0处修改去掉一些的成员变量
// Connection conn = null;
// Statement stmt = null;
// PreparedStatement pstmt = null;
// ResultSet rs = null;
private ThreadLocal<Connection> connLocal = new ThreadLocal<Connection>();
// mysqltest
/**
* 第①处修改 public变成private 不允许外部new mysqltest();单例模式必须的
*/
private Mysqltest() {
// inst.getConnection();
}
/**
* 第②处修改,外部调用必须要通过这个得到对象,要不然不能new 怎么出来对象呢
*
*/
public Mysqltest getMysqltest() {
if (null == inst) {
inst = new Mysqltest();
}
return inst;
}
/**
* 第③处修改加上ThreadLocal管理conn,
* 并且conn不能自动提交,因为这里是最原子的地方,所以我们要在上层方法中来做事务,所以conn.setAutoCommit(false);
* 如果可以加上异常捕获在抛出一个自定义的runtime异常,这样可以在上层对异常进行处理了 参考
* public class DatabaseException extends RuntimeException {
*
* private Exception nestedException;
*
* public Exception getNestedException() { return nestedException; }
*
* public DatabaseException(Exception e, String msg) { super(msg);
* nestedException = e; }
*
* }
*
* @return
* @throws SQLException
*/
// getConn
public Connection getConnection() throws DatabaseException {
Connection conn = connLocal.get();
if (conn == null) {
try {
if (conn == null
------解决方案--------------------
conn.isClosed()) {
conn = DriverManager.getConnection(_url);
conn.setAutoCommit(false);//这里的事务不能自动提交
// 放到ThreadLocal里面的对象,可见性仅限于当前线程
connLocal.set(conn);
System.out.println("获得数据库 #" + conn.hashCode());
}
} catch (SQLException e) {
e.printStackTrace();
throw new DatabaseException(e, "不能获得数据库连接");
}
}
return conn;
}
// pstmt conn
/**
* 第④处 如果sql有参数怎么办,所以修改一下,加上 Object[] params
* 这里可以不错异常处理,因为我们还不关心这里是否出现了异常,不过管了也不错但是管了就必须抛出自定义的异常,要不然上层程序怎么知道出现异常了呢
*&