
2011年3月6日
1 getCurrentSession創建的session會和綁定到當前線程,而openSession每次創建新的session。
2 getCurrentSession創建的線程會在事務回滾或事物提交后自動關閉,而openSession必須手動關閉
這里getCurrentSession本地事務(本地事務:jdbc)時 要在配置文件里進行如下設置
* 如果使用的是本地事務(jdbc事務)
<property name="hibernate.current_session_context_class">thread</property>
* 如果使用的是全局事務(jta事務)
<property name="hibernate.current_session_context_class">jta</property>
getCurrentSession () 在事務結束之前使用當前的session
openSession() 每次重新建立一個新的session
在一個應用程序中,如果DAO 層使用Spring 的hibernate 模板,通過Spring 來控制session 的生命周期,則首選getCurrentSession ()。
使用Hibernate的大多數應用程序需要某種形式的“上下文相關的” session,特定的session在整個特定的上下文范圍內始終有效。然而,對不同類型的應用程序而言,要為什么是組成這種“上下文”下一個定義通常 是困難的;不同的上下文對“當前”這個概念定義了不同的范圍。在3.0版本之前,使用Hibernate的程序要么采用自行編寫的基于 ThreadLocal的上下文session,要么采用HibernateUtil這樣的輔助類,要么采用第三方框架(比如Spring或Pico), 它們提供了基于代理(proxy)或者基于攔截器(interception)的上下文相關session。
從3.0.1版本開 始,Hibernate增加了SessionFactory.getCurrentSession()方法。一開始,它假定了采用JTA事務,JTA事務 定義了當前session的范圍和上下文(scope and context)。Hibernate開發團隊堅信,因為有好幾個獨立的JTA TransactionManager實現穩定可用,不論是否被部署到一個J2EE容器中,大多數(假若不是所有的)應用程序都應該采用JTA事務管理。 基于這一點,采用JTA的上下文相關session可以滿足你一切需要。
更好的是,從3.1開 始,SessionFactory.getCurrentSession()的后臺實現是可拔插的。因此,我們引入了新的擴展接口 (org.hibernate.context.CurrentSessionContext)和新的配置參數 (hibernate.current_session_context_class),以便對什么是“當前session”的范圍和上下文(scope and context)的定義進行拔插。
請參閱 org.hibernate.context.CurrentSessionContext接口的Javadoc,那里有關于它的契約的詳細討論。它定義 了單一的方法,currentSession(),特定的實現用它來負責跟蹤當前的上下文session。Hibernate內置了此接口的兩種實現。
org.hibernate.context.JTASessionContext - 當前session根據JTA來跟蹤和界定。這和以前的僅支持JTA的方法是完全一樣的。詳情請參閱Javadoc。
org.hibernate.context.ThreadLocalSessionContext - 當前session通過當前執行的線程來跟蹤和界定。詳情也請參閱Javadoc。
這 兩種實現都提供了“每數據庫事務對應一個session”的編程模型,也稱作每次請求一個session。Hibernate session的起始和終結由數據庫事務的生存來控制。假若你采用自行編寫代碼來管理事務(比如,在純粹的J2SE,或者 JTA/UserTransaction/BMT),建議你使用Hibernate Transaction API來把底層事務實現從你的代碼中隱藏掉。如果你在支持CMT的EJB容器中執行,事務邊界是聲明式定義的,你不需要在代碼中進行任何事務或 session管理操作。請參閱第 11 章 事務和并發一節來閱讀更多的內容和示例代碼。
hibernate.current_session_context_class 配置參數定義了應該采用哪個org.hibernate.context.CurrentSessionContext實現。注意,為了向下兼容,如果未 配置此參數,但是存在org.hibernate.transaction.TransactionManagerLookup的配 置,Hibernate會采用org.hibernate.context.JTASessionContext。一般而言,此參數的值指明了要使用的實 現類的全名,但那兩個內置的實現可以使用簡寫,即"jta"和"thread"。
1、getCurrentSession()與openSession()的區別?
* 采用getCurrentSession()創建的session會綁定到當前線程中,而采用openSession()
創建的session則不會
* 采用getCurrentSession()創建的session在commit或rollback時會自動關閉,而采用openSession()
創建的session必須手動關閉
2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
* 如果使用的是本地事務(jdbc事務)
<property name="hibernate.current_session_context_class">thread</property>
* 如果使用的是全局事務(jta事務)
<property name="hibernate.current_session_context_class">jta</property>
利于ThreadLocal模式管理Session
早在Java1.2推出之時,Java平臺中就引入了一個新的支持:java.lang.ThreadLocal,給我們在編寫多線程程序
時提供了一種新的選擇。ThreadLocal是什么呢?其實ThreadLocal并非是一個線程的本地實現版本,它并不是一個Thread,
而是thread local variable(線程局部變量)。也許把它命名為ThreadLocalVar更加合適。線程局部變量(ThreadLocal)
其實的功用非常簡單,就是為每一個使用某變量的線程都提供一個該變量值的副本,是每一個線程都可以獨立地改變自己的副本,
而不會和其它線程的副本沖突。從線程的角度看,就好像每一個線程都完全擁有一個該變量。
ThreadLocal是如何做到為每一個線程維護變量的副本的呢?其實實現的思路很簡單,在ThreadLocal類中有一個Map,
用于存儲每一個線程的變量的副本。比如下面的示例實現(為了簡單,沒有考慮集合的泛型):
public class HibernateUtil {
public static final ThreadLocal session =new ThreadLocal();
public static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session currentSession() throws HibernateException {
Session s = session.get();
if(s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = session.get();
if(s != null) {
s.close();
}
session.set(null);
}
}
在這里比較了下getCurrentSession()是否是用的是同一個session...............
package com.hibernate;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class HibernateIDTest {
private static SessionFactory sessionFactory;
@BeforeClass
public static void beforeClass() {
try{
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
@AfterClass
public static void afterClass() {
sessionFactory.close();
}
@Test
public void testTeacherSave() {
System.out.println("------------");
Teacher t = new Teacher();
t.setId(1);
t.setName("t1");
t.setTitle("middle");
t.setBirthDate(new Date());
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(t);
session.getTransaction().commit();
Session session2 = sessionFactory.getCurrentSession();
System.out.println("比較"+(session.hashCode()==session2.hashCode()));
}
}
執行之后不的到結果是 session.hashCode()==session2.hashCode()這兩個只是false的,也就是說,在事務結束之后getCuttentSession 也是創建了新的session。。。。。。
openSession() 與 getCurrentSession() 有何不同和關聯呢?
在 SessionFactory 啟動的時候, Hibernate 會根據配置創建相應的 CurrentSessionContext ,在 getCurrentSession() 被調用的時候,實際被執行的方法是 CurrentSessionContext.currentSession() 。在 currentSession() 執行時,如果當前 Session 為空, currentSession 會調用 SessionFactory 的 openSession 。所以 getCurrentSession() 對于 Java EE 來說是更好的獲取 Session 的方法。
posted @
2011-04-14 10:46 龍ぜ殘劍 閱讀(5688) |
評論 (1) |
編輯 收藏
jfreechart主要是用來動態產生各種數據圖形的,可最初使用的時候大都會碰到圖片中的中文亂碼或是一個小方塊的情況。
仔細研究主要有以下2種原因:
1:服務器缺少中文字體,這多發生在Hp等unix操作系統上,解決的方法就是下載可用字體庫到系統中,
有人也提出在Windows上產生圖片在傳回到Unix主機上的方法。
2:軟件版本問題,jfreechart-1.0.10有人說沒有問題,但jfreechart-1.0.11到13都有問題,我用的最新的jfreechart-1.0.13不做設置是有問題的。
究其原因,是它代碼的內部設置的字體有問題.
其下是具體的解決辦法:
public static void configFont(JFreeChart chart){
// 設置字體
Font xfont = new Font("宋體",Font.PLAIN,12) ;// X軸
Font yfont = new Font("宋體",Font.PLAIN,12) ;// Y軸
Font kfont = new Font("宋體",Font.PLAIN,12) ;// 底部
Font titleFont = new Font("隸書", Font.BOLD , 25) ; // 圖片標題
CategoryPlot plot = chart.getCategoryPlot();// 圖形的繪制結構對象
// 圖片標題
chart.setTitle(new TextTitle(chart.getTitle().getText(),titleFont));
// 底部
chart.getLegend().setItemFont(kfont);
// X 軸
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(xfont);// 軸標題
domainAxis.setTickLabelFont(xfont);// 軸數值
domainAxis.setTickLabelPaint(Color.BLUE) ; // 字體顏色
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 橫軸上的label斜顯示
// Y 軸
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(yfont);
rangeAxis.setLabelPaint(Color.BLUE) ; // 字體顏色
rangeAxis.setTickLabelFont(yfont);
}
posted @
2011-03-06 22:47 龍ぜ殘劍 閱讀(553) |
評論 (0) |
編輯 收藏
JFreeChart項目簡介
JFreeChart是開放源代碼站點SourceForge.net上的一個JAVA項目,它主要用來各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普 通柱狀圖以及堆棧柱狀圖)、線圖、區域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等。這些不同式樣的圖表基本上可以滿足目前的要求。為了減少篇幅本文主 要介紹前面三種類型的圖表,讀者可以觸類旁通去開發其他樣式的圖表。
這里有點筆者在開發中遇見的問題需要注意的是:在使用Eclipse開發的時候會報一個莫名其妙的錯誤,錯誤可能指向某個類文件的第一行。遇到這樣的問題一般是因為沒有把Jcommon的jar包設置到項目的類路徑中的緣故。具體的原因不祥。
1 餅圖
對于餅圖而言,數據集的獲取用的不是同一個數據集類,另外餅圖不支持同一個類別的項目中還有子項目這樣的數據。我們只給出創建餅圖的代碼,至于寫圖表到一個文件則與柱狀圖一致,無需重復..
實例代碼如下:
package com.dr.demo;
import java.awt.Color;
import java.awt.Font;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
/**
*
* @author 詹成榜
* @date 2010-2-25
* @ClassName PolyLine.java
* @Email 289153044@qq.com
* @param 餅圖
* @param
*/
public class SalesCountServlet {
protected static void doGet() {
System.out.println("圖表已經建立!");
CategoryDataset dataset = getDataSet();
String fileName = "SalesCount.jpg";//文件名稱
JFreeChart chart = ChartFactory.createBarChart3D("產品銷量圖", // 圖表標題
"產品", // 目錄軸的顯示標簽
"銷量", // 數值軸的顯示標簽
dataset, // 數據集
PlotOrientation.VERTICAL, // 圖表方向:水平、垂直
true, // 是否顯示圖例(對于簡單的柱狀圖必須是false)
false, // 是否生成工具
false // 是否生成URL鏈接
);
configFont(chart);//設置中文格式
FileOutputStream fos_jpg = null;
try {
String statImagePath = "d:";//存放文件的路徑
try {
fos_jpg = new FileOutputStream(statImagePath+ fileName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
ChartUtilities.writeChartAsJPEG(fos_jpg, 0.5f, chart, 400, 300,null);
} catch (IOException e) {
e.printStackTrace();
}
} finally {
try {
fos_jpg.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void configFont(JFreeChart chart){
// 配置字體
Font xfont = new Font("宋體",Font.PLAIN,12) ;// X軸
Font yfont = new Font("宋體",Font.PLAIN,12) ;// Y軸
Font kfont = new Font("宋體",Font.PLAIN,12) ;// 底部
Font titleFont = new Font("隸書", Font.BOLD , 25) ; // 圖片標題
CategoryPlot plot = chart.getCategoryPlot();// 圖形的繪制結構對象
// 圖片標題
chart.setTitle(new TextTitle(chart.getTitle().getText(),titleFont));
// 底部
chart.getLegend().setItemFont(kfont);
// X 軸
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(xfont);// 軸標題
domainAxis.setTickLabelFont(xfont);// 軸數值
domainAxis.setTickLabelPaint(Color.BLUE) ; // 字體顏色
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 橫軸上的label斜顯示
// Y 軸
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(yfont);
rangeAxis.setLabelPaint(Color.BLUE) ; // 字體顏色
rangeAxis.setTickLabelFont(yfont);
}
private static CategoryDataset getDataSet() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(20, "銷售圖表", "蘋果");
dataset.addValue(20, "銷售圖表", "梨");
dataset.addValue(30, "銷售圖表", "香蕉");
dataset.addValue(40, "銷售圖表", "葡萄");
dataset.addValue(50, "銷售圖表", "桔子");
return dataset;
}
public static void main(String args[]){
doGet();
}
}
posted @
2011-03-06 22:36 龍ぜ殘劍 閱讀(421) |
評論 (3) |
編輯 收藏
hibernate工作原理
原理:
1.讀取并解析配置文件
2.讀取并解析映射信息,創建SessionFactory
3.打開Sesssion
4.創建事務Transation
5.持久化操作
6.提交事務
7.關閉Session
8.關閉SesstionFactory
為什么要用:
1. 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。
2. Hibernate是一個基于JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作
3. hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。
4. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。
2. Hibernate是如何延遲加載?
1. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection)
2. Hibernate3 提供了屬性的延遲加載功能
當Hibernate在查詢數據的時候,數據并沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提高了服務器的性能。
3.Hibernate中怎樣實現類之間的關系?(如:一對多、多對多的關系)
類與類之間的關系主要體現在表與表之間的關系進行操作,它們都市對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、
4. 說下Hibernate的緩存機制
1. 內部緩存存在Hibernate中又叫一級緩存,屬于應用事物級緩存
2. 二級緩存:
a) 應用及緩存
b) 分布式緩存
條件:數據不會被第三方修改、數據大小在可接受范圍、數據更新頻率低、同一數據被系統頻繁使用、非 關鍵數據
c) 第三方緩存的實現
5. Hibernate的查詢方式
Sql、Criteria,object comptosition
Hql:
1、 屬性查詢
2、 參數查詢、命名參數查詢
3、 關聯查詢
4、 分頁查詢
5、 統計函數
6. 如何優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.靈活使用單向一對多關聯
3.不用一對一,用多對一取代
4.配置對象緩存,不使用集合緩存
5.一對多集合使用Bag,多對多集合使用Set
6. 繼承類使用顯式多態
7. 表字段要少,表關聯不要怕多,有二級緩存撐
spring工作原理
1.spring mvc請所有的請求都提交給DispatcherServlet,它會委托應用系統的其他模塊負責負責對請求進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
3.DispatcherServlet請請求提交到目標Controller
4.Controller進行業務邏輯處理后,會返回一個ModelAndView
5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
6.視圖對象負責渲染返回給客戶端。
為什么用:
{AOP 讓開發人員可以創建非行為性的關注點,稱為橫切關注點,并將它們插入到應用程序代碼中。使用 AOP 后,公共服務 (比如日志、持久性、事務等)就可以分解成方面并應用到域對象上,同時不會增加域對象的對象模型的復雜性。
IOC 允許創建一個可以構造對象的應用環境,然后向這些對象傳遞它們的協作對象。正如單詞 倒置 所表明的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每一個對象都是用其協作對象構造的。因此是由容器管理協作對象(collaborator)。
Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協作對象)。然后可以很容易地在需要時替換具有類似接口的協作對象。}
Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring 模塊構建在核心容器之上,核心容器定義了創建、配置和管理 bean 的方式,如圖 1 所示。
組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現。每個模塊的功能如下:
☆ 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC)模式將應用程序的配置和依賴性規范與實際的應用程序代碼分開。
☆ Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。
☆ Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊為基于 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中。
☆ Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,并且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
☆ Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。
☆ Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,為基于 Web 的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。
☆ Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。
Spring 框架的功能可以用在任何 J2EE 服務器中,大多數功能也適用于不受管理的環境。Spring 的核心要點是:支持不綁定到特定 J2EE 服務的可重用業務和數據訪問對象。毫無疑問,這樣的對象可以在不同 J2EE 環境 (Web 或 EJB)、獨立應用程序、測試環境之間重用。
IOC 和 AOP
控制反轉模式(也稱作依賴性介入)的基本概念是:不創建對象,但是描述創建它們的方式。在代碼中不直接與對象和服務連接,但在配置文件中描述哪一個組件需要哪一項服務。容器(在 Spring 框架中是 IOC 容器) 負責將這些聯系在一起。
在典型的 IOC 場景中,容器創建了所有對象,并設置必要的屬性將它們連接在一起,決定什么時間調用方法。下表列出了 IOC 的一個實現模式。
struts工作原理
Struts工作機制?為什么要使用Struts?
工作機制:
Struts的工作流程:
在web應用啟動時就會加載初始化ActionServlet,ActionServlet從
struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象
當ActionServlet接收到一個客戶請求時,將執行如下流程.
-(1)檢索和用戶請求匹配的ActionMapping實例,如果不存在,就返回請求路徑無效信息;
-(2)如果ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中;
-(3)根據配置信息決定是否需要表單驗證.如果需要驗證,就調用ActionForm的validate()方法;
-(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象, 就表示表單驗證成功;
-(5)ActionServlet根據ActionMapping所包含的映射信息決定將請求轉發給哪個Action,如果相應的 Action實例不存在,就先創建這個實例,然后調用Action的execute()方法;
-(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉發給 ActionForward對象指向的JSP組件;
-(7)ActionForward對象指向JSP組件生成動態網頁,返回給客戶;
為什么要用:
JSP、Servlet、JavaBean技術的出現給我們構建強大的企業應用系統提供了可能。但用這些技術構建的系統非常的繁亂,所以在此之上,我們需要一個規則、一個把這些技術組織起來的規則,這就是框架,Struts便應運而生。
基于Struts開發的應用由3類組件構成:控制器組件、模型組件、視圖組件
8. Struts的validate框架是如何驗證的?
在struts配置文件中配置具體的錯誤提示,再在FormBean中的validate()方法具體調用。
9. 說下Struts的設計模式
MVC模式: web應用程序啟動時就會加載并初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被創建,并被填入表單相應的數據,ActionServler根據Struts-config.xml文件配置好的設置決定是否需要表單驗證,如果需要就調用ActionForm的 Validate()驗證后選擇將請求發送到哪個Action,如果Action不存在,ActionServlet會先創建這個對象,然后調用 Action的execute()方法。Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動態的網頁,返回給客戶。
posted @
2011-03-06 19:59 龍ぜ殘劍 閱讀(458) |
評論 (0) |
編輯 收藏