配置了数据库连接池,自己写了个类封装数据库操作,但是不知道是不是线程安全的,
代码:
class DBConn{
private Connection conn;
private Statement stmt;
private PreparedStatement pstmt;
 
private  void getConn(){//获取连接
 
 try{
     Context initCtx=new InitalContext();
    Context ctx=(Context)initCtx.lookup("java:comp/env");
    DataSource ds=(DataSource)ctx.lookup(dsName);
   conn=ds.getConnection();
 
}catch(Exception e)
{
 System.out.println(e);
}
}
 
public Statement getstmt(){
  return conn.createStatement();
}
 
public  PreparedStatement getPstmt(String sql){
  pstmt=conn.prepareStatement(sql);
return pstmt;
}
}
看到有些代码在三个方法前面都加了synchronized,不知道为什么,感觉没这个必要啊,数据库连接池已经帮我们管理好了connection,有点迷惑.

解决方案 »

  1.   

    只要没有多个servlet请求,同时使用一个类的静态方法,或是使用同个实例,就不会产生线程安全问题
    你这个类,只是在DataSource的外层,Connection的获取,不是在这里,所以不会有线程安全问题举个例子,现在有多个地方,都用到了你这个类
    同时getConnection
    但是,都要通过DataSource的同一个静态方法
    只要DataSource这个方法是线程安全的,那就OK了
    而DataSource是线程安全的
      

  2.   

    Context initCtx=new InitalContext();
      Context ctx=(Context)initCtx.lookup("java:comp/env");
      DataSource ds=(DataSource)ctx.lookup(dsName);
      conn=ds.getConnection();
    虽然没用过这个,感觉这个代码有问题。因为每次你获取连接的时候都new了的。连接池没用武之地了。
    Context initCtx=new InitalContext();
      Context ctx=(Context)initCtx.lookup("java:comp/env");
      DataSource ds=(DataSource)ctx.lookup(dsName);应该用单例模式。DataSource做成成员变量。每次需要就去get一个连接。
      

  3.   


    你的一个DBConn里面有一个数据库的Connection,
    1,每个线程应该自己new一个DBConn吧?这样不用同步.
    2,如果很多个线程同时使用一个DBConn,那要小心成员变量了,成员变量覆盖会引起不同步.
    但是,这样效率太差劲了吧,呵呵
      

  4.   

    肯定啊,每个里面都有Connection ,当然得加锁了。