日期:2014-05-17  浏览次数:20806 次

线程安全
配置了数据库连接池,自己写了个类封装数据库操作,但是不知道是不是线程安全的,
代码:
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,有点迷惑.

------解决方案--------------------
只要没有多个servlet请求,同时使用一个类的静态方法,或是使用同个实例,就不会产生线程安全问题
你这个类,只是在DataSource的外层,Connection的获取,不是在这里,所以不会有线程安全问题

举个例子,现在有多个地方,都用到了你这个类
同时getConnection
但是,都要通过DataSource的同一个静态方法
只要DataSource这个方法是线程安全的,那就OK了
而DataSource是线程安全的
------解决方案--------------------
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一个连接。
------解决方案--------------------
探讨
看到有些代码在三个方法前面都加了synchronized,不知道为什么,感觉没这个必要啊,数据库连接池已经帮我们管理好了connection,有点迷惑

------解决方案--------------------
肯定啊,每个里面都有Connection ,当然得加锁了。
------解决方案--------------------
简单来说,用单例模式,不知道LZ明白不!