我写了一段代码,静态工具方法(实际应用中有很多类是的问题),代码如下,请大家各抒己见,谢谢:)
……
//取得自定义的编号 + 同步处理
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 ;
}
……
……
//取得自定义的编号 + 同步处理
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 ;
}
……
那给点快捷、高效的示例吧请?(除了ORM外)
——我主要想了解静态方法和同步的等问题(望不吝赐教)。
这样写会很累的.
其次,三个close语句其实是只运行一个,在catch当中再运行下一个。
再次,应该让getSequence()抛出异常,而不是将其隐藏掉。否则该函数的调用者会认为它是“万无一失”的,因为它无论如何都会返回一个String,而且没有任何文档说明当返回的是""时表示出了错误。
这应该是一个事务,就是获取的索引值是用来更新表数据的,
也就是这个索引从获取下一个值, 到更新应该存在一个锁。----------------------------------------------------------------------------
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做标记, 还是靠异常抛出,要好好想想的。
你可以保持这个connection连接,以及对应的statement,而不是每次都建立。所以建议你不要使用static,而是每个sequence都有一个实例,每个sequence实例里面,保持相应的连接和statement==========================================================你说的,我不明白,能否编程示范一下?
---------------------------------------------------------------
静态方法的生命周期应该是和对应的class一样的,就是class被载入的时候就存在.
public synchronized static String getIDByTag()同步的是这个class. 而不是同步class的实例.什么时候使用静态方法,以前在JTest(一个自动化测试工具看到的一个规范是: 当你的类并没采访到类的field等,) 就只是实现一个功能块,则这个方法建议写成static, 不过这个规范有待商榷,不过也是说明了static方法的使用.而现在强调的是, 你需要的同步是为每一个seq 类似的加一个同步锁, 保证操作每个seq时的事务.