我写了一段代码,静态工具方法(实际应用中有很多类是的问题),代码如下,请大家各抒己见,谢谢:)
……
//取得自定义的编号 + 同步处理
public synchronized  static String getIDByTag(String prefix,String seqname){
return prefix+getSequence(seqname) ;
}

public static String getSequence(String seqname){
String result = "" ;
String sql = "select "+seqname+".nextVal from dual" ;
Connection con = null ;
Statement stmt = null ;
ResultSet rs = null ; 

try{
con = DbConn.getConnetion() ;
stmt = con.createStatement() ;
rs = stmt.executeQuery(sql) ;
if (rs.next()){
result = rs.getString(1) ;
}
}catch(SQLException se){
se.printStackTrace() ;
log.debug("从数据库生成唯一编号时错误:"+se.getMessage()) ;
}finally{
  try {
if(rs!=null)rs.close() ;
if(stmt!=null)stmt.close() ;
if(con!=null)con.close() ;
  } catch (SQLException e) {
e.printStackTrace();
  }
}

return result ;
}
……

解决方案 »

  1.   

    to :zhkchi(火焰神)
    那给点快捷、高效的示例吧请?(除了ORM外)
    ——我主要想了解静态方法和同步的等问题(望不吝赐教)。
      

  2.   

    我认为你还不如用一个类A专门处理数据库连接,得到connection,在另一个类B把类A做成单例,一个方法传入参数为sql语句,返回ArrayList或其他collection.
    这样写会很累的.
      

  3.   

    首先,楼主的文档写得很差,几乎是没有。
    其次,三个close语句其实是只运行一个,在catch当中再运行下一个。
    再次,应该让getSequence()抛出异常,而不是将其隐藏掉。否则该函数的调用者会认为它是“万无一失”的,因为它无论如何都会返回一个String,而且没有任何文档说明当返回的是""时表示出了错误。
      

  4.   

    猜测一下 楼主的用意:以上代码是为了获取数据库某个索引的一下个值,之后就利用这个索引更新表。
    这应该是一个事务,就是获取的索引值是用来更新表数据的,
    也就是这个索引从获取下一个值, 到更新应该存在一个锁。----------------------------------------------------------------------------
    String seqName = "seqName"
    Lock lock = HashMap.get(seqName);//根据索引名得到唯一的锁。lock.lock();                     //获取索引唯一的锁。
    String nextSeqValue = getSequence (seqName);
    //例如,插入数据操作.
    lock.release();
    //这个lock可以自己使用wait/notify封装,或者使用jdk1.5下的util.线程池的那个Lock
    finally 关闭三个连接资源的时候确实会有问题,rs.close();抛出异常时后面的conn等就没关闭的。 逐个try catch关闭吧。 或者写个关闭的静态方法。还有就是对于返回值出错时是使用String做标记, 还是靠异常抛出,要好好想想的。
      

  5.   

    StringBuffer,如果1.5StringBuilder你可以保持这个connection连接,以及对应的statement,而不是每次都建立。所以建议你不要使用static,而是每个sequence都有一个实例,每个sequence实例里面,保持相应的连接和statement
      

  6.   

    : shine333(enihs) ( ) 
    你可以保持这个connection连接,以及对应的statement,而不是每次都建立。所以建议你不要使用static,而是每个sequence都有一个实例,每个sequence实例里面,保持相应的连接和statement==========================================================你说的,我不明白,能否编程示范一下?
      

  7.   

    如 shine333(enihs) 所说, new connection等比较重新创建比较消耗资源 建议使用连接池的连接, 可以实现重用.---------------------------------------------------------------回答:静态同步的必要性等?望不吝赐教啊
    ---------------------------------------------------------------
    静态方法的生命周期应该是和对应的class一样的,就是class被载入的时候就存在.
    public synchronized  static String getIDByTag()同步的是这个class. 而不是同步class的实例.什么时候使用静态方法,以前在JTest(一个自动化测试工具看到的一个规范是: 当你的类并没采访到类的field等,) 就只是实现一个功能块,则这个方法建议写成static, 不过这个规范有待商榷,不过也是说明了static方法的使用.而现在强调的是, 你需要的同步是为每一个seq 类似的加一个同步锁, 保证操作每个seq时的事务.