配置了数据库连接池,自己写了个类封装数据库操作,但是不知道是不是线程安全的,
代码:
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,有点迷惑.
代码:
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,有点迷惑.
你这个类,只是在DataSource的外层,Connection的获取,不是在这里,所以不会有线程安全问题举个例子,现在有多个地方,都用到了你这个类
同时getConnection
但是,都要通过DataSource的同一个静态方法
只要DataSource这个方法是线程安全的,那就OK了
而DataSource是线程安全的
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一个连接。
你的一个DBConn里面有一个数据库的Connection,
1,每个线程应该自己new一个DBConn吧?这样不用同步.
2,如果很多个线程同时使用一个DBConn,那要小心成员变量了,成员变量覆盖会引起不同步.
但是,这样效率太差劲了吧,呵呵