ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
if (conHolder != null) {
conHolder.requested();
return conHolder.getConnection();
}
logger.debug("Fetching JDBC Connection from DataSource");
Connection con = dataSource.getConnection();
if (TransactionSynchronizationManager.isSynchronizationActive()) {
logger.debug("Registering transaction synchronization for JDBC Connection");
// Use same Connection for further JDBC actions within the transaction.
// Thread-bound object will get removed by synchronization at transaction completion.
conHolder = new ConnectionHolder(con);
conHolder.setSynchronizedWithTransaction(true);
conHolder.requested();
TransactionSynchronizationManager.registerSynchronization(
new ConnectionSynchronization(conHolder, dataSource));
TransactionSynchronizationManager.bindResource(dataSource, conHolder);
}
return con;
}
conHolder?TransactionSynchronizationManager?很象呀,繼續(xù)看看TransactionSynchronizationManager類果真如此,里面使用TreadLocal來(lái)保存數(shù)據(jù)連接和事務(wù)狀態(tài)。原來(lái)如此,代碼里的各個(gè)層沒(méi)有特殊需要都不用再出現(xiàn)事務(wù)了,程序開(kāi)發(fā)人員只要關(guān)注業(yè)務(wù)就可以了,不用再勞心編寫(xiě)事務(wù)代碼了。
?? 客戶的權(quán)限要求采集回來(lái)了,天哪,根本不是什么權(quán)限的設(shè)置和判斷了,原有內(nèi)容管理中的權(quán)限管理(RBAC Role based Access Control 基于角色的訪問(wèn)控制)根本不能解決問(wèn)題.?經(jīng)過(guò)仔細(xì)分析,所有要求具為領(lǐng)導(dǎo)拍腦袋定下來(lái)的不符合邏輯的一些邏輯。如何解決?隨即想到了采用專家系統(tǒng)來(lái)解決這個(gè)問(wèn)題。找到開(kāi)源的rete算法java實(shí)現(xiàn)包Drools(http://www.theserverside.com/articles/content/Drools/article.html), 并察看了專家系統(tǒng)的部分書(shū)籍。但是項(xiàng)目時(shí)間緊迫所以放棄了,主要是其規(guī)則存放于xml中,沒(méi)想出好的辦法與本工程良好的配合起來(lái)。所以還是決定先采用簡(jiǎn)單 的決策樹(shù)(本系統(tǒng)中正好有樹(shù)狀結(jié)構(gòu)的內(nèi)容管理系統(tǒng),很容易擴(kuò)展)解決問(wèn)題。在每個(gè)樹(shù)狀決策節(jié)點(diǎn)可以加入條件和行為,如何解析?成了一個(gè)問(wèn)題。再 google一下,找找開(kāi)源的腳本解析,哦不錯(cuò)有java腳本的解析器( BeanShell---Java應(yīng)用程序腳本引摯 )可以直接解析java語(yǔ)句,功能比較強(qiáng)大,包也不大。不得不佩服現(xiàn)在的開(kāi)源真是如火如荼,還是早早的加入進(jìn)去吧。
主要測(cè)試代碼:
//創(chuàng)建一個(gè)bsh解釋器實(shí)例
??Interpreter bsh = new
Interpreter();
//測(cè)試執(zhí)行一個(gè)接口實(shí)現(xiàn)的類
String program = "public Object excute(int
aa,String bb){return \"Cool\";}";
program ="Command command= new
Command(){"+program+"};";
program += "Object
obj=command.excute(aa,bb);";
bsh.eval(program);
//測(cè)試執(zhí)行一個(gè)函數(shù)
String
program = "Object excute(int aa,String bb){return \"bb+aa\";}";
program +=
"Object obj=excute(aa,bb);";String program = "Object excute(int aa,String
bb){return \"bb+aa\";}";
program += "Object
obj=excute(aa,bb);";
bsh.eval(program);
??
??bsh.eval(program);
一直好用的程序竟然不好用了,出現(xiàn)下列異常: org.apache.xml.utils.WrappedRuntimeException: The output format must have a '{http://xml.apache.org/xalan}content-handler' property! 終于找到原因,tomcat5 中自帶了xalan包,并且包的版本提升了,所以程序不好用了。詳細(xì)原因沒(méi)有查清。 |
到處找樹(shù)狀結(jié)構(gòu)的容器都沒(méi)找到,TreeMap和TreeSet是什么紅-黑樹(shù)沒(méi)看明白,沒(méi)時(shí)間仔細(xì)研究了,干脆簡(jiǎn)單寫(xiě)一個(gè)吧,反正并發(fā)要求不是很高,也不怎么排序,就是內(nèi)存緩存用。代碼如下: /** private DataTreeNode rootDataTreeNode = null; //定義樹(shù)根 /** DataTreeNode treeNode = new
DataTreeNode(); /** int count =0; private String upNodeID; //父節(jié)點(diǎn)ID private String nodeID; //屬性節(jié)點(diǎn)標(biāo)志ID private int level; //層號(hào) private Object node; //存儲(chǔ)用數(shù)據(jù)對(duì)象 private ArrayList subNodes; //所有子節(jié)點(diǎn) /** /** /** /** /** /** /** /** /** /** /** /** /** /** /** /** /** private boolean removeSubNode(int orderid) { private boolean removeSubNode(DataTreeNode treeNode) { /* /* } |
|