62,614
社区成员
发帖
与我相关
我的任务
分享
/**
* 根据用户ID查询用户信息
* @param doi 用户信息对象父接口,包含有用户ID参数
* @return 返回查询结果对象父接口引用
*/
public DataObjectIF findOne(DataObjectIF doi) {
java.sql.Connection conn = null;
java.sql.ResultSet rs = null;
java.sql.PreparedStatement ps = null;
UserInfoData uid = (UserInfoData) doi;
UserInfoData result = new UserInfoData();
String sql = "select * from user_info where id=?";
conn = DBConnectionManager.getInstance().getConnection();
try {
ps = conn.prepareStatement(sql);
ps.setLong(1, uid.getId());
rs = ps.executeQuery();
if (rs.next()) {
result.setId(rs.getLong("id"));
result.setUsername(rs.getString("username"));
result.setPassword(rs.getString("password"));
}
}
catch (SQLException ex) {
ex.printStackTrace();
}
finally {
try {
DBConnectionManager.getInstance().closeAll(conn, null, ps, null, rs);
}
catch (Exception ex1) {
ex1.printStackTrace();
}
}
return result;
}
/**
* Author:BluesLee
* CreateDate:2006-06-12 22:51:00
* Modifier:BluesLee
* ModifyDate:2006-06-12 22:51:00
* Version:1.0
* Copyright\u00A92006 xxxx 沪ICP备06××××××号
* All right reserved.
*/
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.CallableStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.apache.log4j.Logger;
import java.sql.DriverManager;
/**
* 本类是数据库连接的管理类,因此在整个系统中没有必要出现多个,一个就够用了
* 因此,决定在此类上使用单态设计模式,只提供本类的一个实例出去。
* 在此我是用单态的饿汉模式进行使用
*/
public class DBConnectionManager {
private static Logger logger=Logger.getLogger(DBConnectionManager.class.getName());
/**
* 本静态变量用来存放本系统启动时由Struts生成的连接池的数据源
*/
private static DataSource datasource;
/**
* 由于本类使用单态设计模式,因此不允许在使用中通过New进行实例化,那么本类就要提供一个
* 此类的实例供外界使用,这就是供外界使用的实例
*/
private static DBConnectionManager dbConManager=new DBConnectionManager();
private DBConnectionManager(){}
/**
* 此静态方法用来向类的静态变量赋值,用来在系统中使用
* @param mydatasource 传入的struts生成的数据源
*/
public static void setDatasource(DataSource mydatasource) {
logger.info("设置数据源");
if(datasource==null){
datasource = mydatasource;
}
}
/**
* 由于本类使用单态模式,不允许其他的类使用New进行创建实例
* 因此在这里提供一个共有的静态方法来向外界提供自己的一个实例。
* @return 返回本类的唯一实例
*/
public static DBConnectionManager getInstance() {
logger.info("获得数据库连接管理类的实例");
return dbConManager;
}
/**
* 此方法提供一个可用的数据库连接,从连接池中取得可用连接
* @return 可用的数据库连接
*/
public Connection getConnection() {
Connection conn = null;
try {
logger.info("从连接池中获得空闲的数据库连接");
logger.info(datasource);
conn = datasource.getConnection();
logger.info("拿到连接---------");
return conn;
}
catch (SQLException ex) {
ex.printStackTrace();
}
return null;
}
/**
* 这是一个用来关闭所有的数据库连接相关的打开对象的方法,这样作的好处是不用在每一次调用了sql之后
* 要写一大串的关闭操作。
* @param conn 将要关闭的数据库连接
* @param st 将要关闭的数据库操作对象
* @param pst 将要关闭的预处理数据库操作对象
* @param cst 将要关闭的数据库存储过程调用对象
* @param rst 将要关闭的数据库记录集对象
* @throws java.lang.Exception 有可能要抛出的异常
*/
public void closeAll(Connection conn,Statement st,PreparedStatement pst,CallableStatement cst,ResultSet rst)
throws Exception{
if(rst!=null){
rst.close();
}
if(st!=null){
st.close();
}
if(pst!=null){
pst.close();
}
if(cst!=null){
cst.close();
}
if(conn!=null){
conn.close();
}
logger.info("==========>关闭连接成功!");
}
}
public class MyServlet extends HttpServlet {
public MyServlet() {
super();
}
public void init() throws ServletException {
/**得到数据源*/
try {
Context initCtx = new InitialContext();
DataSource datasource = (DataSource) initCtx.lookup(
"java:comp/env/jdbc/MyDBA");
DBConnectionManager.setDatasource(datasource);
logger.info("DataSourcePlugIn已经初始化完成...");
}
catch (NamingException ex) {
ex.printStackTrace();
}
}
public void destroy() {
super.destroy();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<Context docBase="myweb" path="/myweb" reloadable="true">
<ResourceParams name="jdbc/DBPool">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@10.1.1.101:1521:orcl</value>
</parameter>
<parameter>
<name>username</name>
<value>oracle</value>
</parameter>
<parameter>
<name>password</name>
<value>oracle</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>10</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>10</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>-1</value>
</parameter>
</ResourceParams>
</Context>
看到这个问题,我想到一个新的方法,不知道能不能实现:
使用ThreadLocal来实现:
写一个工具类来得到Connection:
public class UtilConnection{
private static ThreadLocal local = new TreadLocal();
static {
try{
class.forName("oracle.jdbc.driver.DriverOracle");
}catch(....){
}
}
public static Connection getCurrentConnection(){
Connection con =(Connection) local.get();
if(con == null){
con = DriverManager.getConnection();
local.set(con);
}
return con;
}
public static void closeConnection(){
Connection con = (Connection) local.get();
if(con != null){
con.close();
}
local.set(null);
}
}
在使用时直接用:
Connection con = UtilConnection.getCurrentConnection();
不知道这样好不好,没测试过,高手说下,这样做可以不.