
2010年1月9日
通過存儲過程向數據庫一下子插入了一千萬(10000000)條記錄,結果等了很長時間,PL/SQL都沒有響應,我又瞎折騰了下,結果執行了好幾次,導致數據庫假死了,我只有刪除當前的會話,從網上找到相關的腳本代碼。
1> 通過此語句查詢正在鎖定的SESSION_ID:
1
SELECT SESSION_ID FROM V$LOCKED_OBJECT,USER_OBJECTS WHERE V$LOCKED_OBJECT.OBJECT_ID = USER_OBJECTS.OBJECT_ID
2> 通過第一步查詢到的SESSION_ID查詢SERIAL#
1
SELECT SERIAL# FROM V$SESSION WHERE SID='12'(此處'12'為上面查詢到的'SESSION_ID')
3> 根據1,2步查詢到的SESSION_ID和SERIAL#執行
1
ALTER SYSTEM KILL SESSION '12,154'(12為SESSION_ID的值, 154為SERIAL#的值)
4> 如果利用上面的命令殺死一個進程后,進程狀態被置為"killed",但是鎖定的資源很長時間沒有被釋放,那么還可以在os一級再殺死相應的進程(線程),首先執行下面的語句獲得當前進程(線程)的標示PID:
1
select spid, osuser, s.program
2
from v$session s,v$process p
3
where s.paddr=p.addr and s.sid=12 (12是上面的SESSION_ID)
然后在OS通過任務管理器找到對應的進程,在殺死這個進程(線程)
posted @
2010-11-27 14:55 absolute 閱讀(859) |
評論 (0) |
編輯 收藏
最近在學習存儲過程,以前在項目中沒有怎么接觸過!
我通過存儲過程像數據庫中批量添加一千萬(100000000)條記錄,結果PL/SQL很長時間沒有反映,結果不得已通過腳本殺掉當前進程,我重新通過存儲過程插入10000條數據。
建表腳本:
1
--刪除用戶表
2
DROP TABLE T_PORTAL_USER;
3
4
--創建用戶表
5
CREATE TABLE T_PORTAL_USER
6
(
7
id NUMBER PRIMARY KEY, -- 用戶表示
8
username VARCHAR2(24) NOT NULL,-- 用戶名
9
password VARCHAR2(24) NOT NULL,-- 密碼
10
realname VARCHAR2(24) NOT NULL,-- 真實姓名
11
sex VARCHAR2(2) DEFAULT '0',-- 性別 "0":Male "1":Female
12
registerDate TIMESTAMP NOT NULL,-- 注冊日期
13
state VARCHAR2(2) NOT NULL -- 賬號狀態 "0":啟用 "1":注銷
14
)
15
16
--刪除用戶表序列
17
DROP SEQUENCE SEQ_T_PORTAL_USER;
18
19
--創建用戶表序列
20
CREATE SEQUENCE SEQ_T_PORTAL_USER
21
START WITH 1
22
INCREMENT BY 1
23
NOMAXVALUE
24
CACHE 20
-- 批量新增一萬條用戶
1
-- 批量新增一萬條用戶
2
CREATE OR REPLACE PROCEDURE PROC_USER_CREATE_BAT
3
AS
4
startTime VARCHAR2(32);--開始時間
5
endTime VARCHAR2(32);--結束時間
6
BEGIN
7
SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss:ff') INTO startTime FROM DUAL;
8
DBMS_OUTPUT.PUT_LINE('Start Time: '||startTime);
9
FOR i in 1..10000 LOOP
10
INSERT INTO T_PORTAL_USER VALUES(SEQ_T_PORTAL_USER.NEXTVAL,'owen'||i,'123456','gekunjin'||i,'0',sysdate,'0');
11
END LOOP;
12
SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss:ff') INTO endTime FROM DUAL;
13
DBMS_OUTPUT.PUT_LINE('End Time: '||endTime);
14
END PROC_USER_CREATE_BAT;
posted @
2010-11-27 14:41 absolute 閱讀(3698) |
評論 (1) |
編輯 收藏
摘要: 在項目中使用Apache開源的Services Framework CXF來發布WebService,CXF能夠很簡潔與Spring Framework 集成在一起,在發布WebService的過程中,發布的接口的入參有些類型支持不是很好,比如Timestamp和Map。這個時候我們就需要編寫一些適配來實行類型轉換。
Timestamp:
1/** *//**
&n...
閱讀全文
posted @
2010-11-27 14:28 absolute 閱讀(3423) |
評論 (1) |
編輯 收藏
Web應用初始化Spring容器策略
以下軟件測試環境為Spring,Struts1
1、通過struts1提供的插件機制,采用Spring提供的ContextLoaderPlugIn
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<global-exceptions />
<global-forwards />
<message-resources parameter="com.portal.ApplicationResources" />
<!-- 通過S1提供的插件機制來初始化Spring容器,加載Spring配置文件
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<!--
1、ContextLoaderPlugIn默認加載配置文件命名規則是actionServlet-servlet.xml,其中actionServlet
是配置org.apache.struts.action.ActionServlet時指定的servlet名稱
2、通過配置contextConfigLocation屬性來指點Spring配置文件的位置,多個配置文件可以使用 逗號","、分號";"、空格" "
-->
<set-property property="contextConfigLocation"
value="/WEB-INF/conf/spring-application.xml,/WEB-INF/conf/**/spring*.xml" />
</plug-in>
-->
</struts-config>
2、采用Spring提供的ContextLoaderListener來初始化(應用服務器需要支持Listener,Servlet2.3版本及以上)
<context-param>
<description>通過配置contextConfigLocation屬性來指點Spring配置文件的位置,多個配置文件可以使用 逗號","、分號";"、空格" "</description>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/conf/spring-application.xml /WEB-INF/conf/**/spring*.xml</param-value>
</context-param>
<listener>
<description>通過ContextLocaderListener來初始化Spring容器,加載Spring配置文件</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
3、采用load-on-startup Servlet 來初始化Spring容器
<servlet>
<description>
通過load-on-startup Servlet來初始化Spring容器
該如何Servlet 用于提供"后臺"服務,作為容器管理應用中的其他bean,不需要響應客戶請求,因此無須配置servlet-mapping
</description>
<servlet-name>applicationContext</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
posted @
2010-09-13 18:10 absolute 閱讀(2268) |
評論 (0) |
編輯 收藏
集群概念
1. 兩大關鍵特性
集群是一組協同工作的服務實體,用以提供比單一服務實體更具擴展性與可用性的服務平臺。在客戶端看來,一個集群就象是一個服務實體,但事實上集群由一組服務實體組成。與單一服務實體相比較,集群提供了以下兩個關鍵特性:
· 可擴展性--集群的性能不限于單一的服務實體,新的服務實體可以動態地加入到集群,從而增強集群的性能。
· 高可用性--集群通過服務實體冗余使客戶端免于輕易遇到out of service的警告。在集群中,同樣的服務可以由多個服務實體提供。如果一個服務實體失敗了,另一個服務實體會接管失敗的服務實體。集群提供的從一個出錯的服務實體恢復到另一個服務實體的功能增強了應用的可用性。
2. 兩大能力
為了具有可擴展性和高可用性特點,集群的必須具備以下兩大能力:
· 負載均衡--負載均衡能把任務比較均衡地分布到集群環境下的計算和網絡資源。
· 錯誤恢復--由于某種原因,執行某個任務的資源出現故障,另一服務實體中執行同一任務的資源接著完成任務。這種由于一個實體中的資源不能工作,另一個實體中的資源透明的繼續完成任務的過程叫錯誤恢復。
負載均衡和錯誤恢復都要求各服務實體中有執行同一任務的資源存在,而且對于同一任務的各個資源來說,執行任務所需的信息視圖(信息上下文)必須是一樣的。
3. 兩大技術
實現集群務必要有以下兩大技術:
· 集群地址--集群由多個服務實體組成,集群客戶端通過訪問集群的集群地址獲取集群內部各服務實體的功能。具有單一集群地址(也叫單一影像)是集群的一個基本特征。維護集群地址的設置被稱為負載均衡器。負載均衡器內部負責管理各個服務實體的加入和退出,外部負責集群地址向內部服務實體地址的轉換。有的負載均衡器實現真正的負載均衡算法,有的只支持任務的轉換。只實現任務轉換的負載均衡器適用于支持ACTIVE-STANDBY的集群環境,在那里,集群中只有一個服務實體工作,當正在工作的服務實體發生故障時,負載均衡器把后來的任務轉向另外一個服務實體。
· 內部通信--為了能協同工作、實現負載均衡和錯誤恢復,集群各實體間必須時常通信,比如負載均衡器對服務實體心跳測試信息、服務實體間任務執行上下文信息的通信。
具有同一個集群地址使得客戶端能訪問集群提供的計算服務,一個集群地址下隱藏了各個服務實體的內部地址,使得客戶要求的計算服務能在各個服務實體之間分布。內部通信是集群能正常運轉的基礎,它使得集群具有均衡負載和錯誤恢復的能力。
集群分類
Linux集群主要分成三大類( 高可用集群, 負載均衡集群,科學計算集群)
高可用集群( High Availability Cluster)
負載均衡集群(Load Balance Cluster)
科學計算集群(High Performance Computing Cluster)
================================================
具體包括:
Linux High Availability 高可用集群
(普通兩節點雙機熱備,多節點HA集群,RAC, shared, share-nothing集群等)
Linux Load Balance 負載均衡集群
(LVS等....)
Linux High Performance Computing 高性能科學計算集群
(Beowulf 類集群....)
分布式存儲
其他類linux集群
(如Openmosix, rendering farm 等..)
詳細介紹
1. 高可用集群(High Availability Cluster)
常見的就是2個節點做成的HA集群,有很多通俗的不科學的名稱,比如"雙機熱備", "雙機互備", "雙機".
高可用集群解決的是保障用戶的應用程序持續對外提供服務的能力。 (請注意高可用集群既不是用來保護業務數據的,保護的是用戶的業務程序對外不間斷提供服務,把因軟件/硬件/人為造成的故障對業務的影響降低到最小程度)。
2. 負載均衡集群(Load Balance Cluster)
負載均衡系統:集群中所有的節點都處于活動狀態,它們分攤系統的工作負載。一般Web服務器集群、數據庫集群和應用服務器集群都屬于這種類型。
負載均衡集群一般用于相應網絡請求的網頁服務器,數據庫服務器。這種集群可以在接到請求時,檢查接受請求較少,不繁忙的服務器,并把請求轉到這些服務器上。從檢查其他服務器狀態這一點上看,負載均衡和容錯集群很接近,不同之處是數量上更多。
3. 科學計算集群(High Performance Computing Cluster)
高性能計算(High Perfermance Computing)集群,簡稱HPC集群。這類集群致力于提供單個計算機所不能提供的強大的計算能力。
高性能計算分類
高吞吐計算(High-throughput Computing)
有一類高性能計算,可以把它分成若干可以并行的子任務,而且各個子任務彼此間沒有什么關聯。象在家搜尋外星人( SETI@HOME -- Search for Extraterrestrial Intelligence at Home )就是這一類型應用。這一項目是利用Internet上的閑置的計算資源來搜尋外星人。SETI項目的服務器將一組數據和數據模式發給Internet上參加SETI的計算節點,計算節點在給定的數據上用給定的模式進行搜索,然后將搜索的結果發給服務器。服務器負責將從各個計算節點返回的數據匯集成完整的數據。因為這種類型應用的一個共同特征是在海量數據上搜索某些模式,所以把這類計算稱為高吞吐計算。所謂的Internet計算都屬于這一類。按照 Flynn的分類,高吞吐計算屬于SIMD(Single Instruction/Multiple Data)的范疇。
分布計算(Distributed Computing)
另一類計算剛好和高吞吐計算相反,它們雖然可以給分成若干并行的子任務,但是子任務間聯系很緊密,需要大量的數據交換。按照Flynn的分類,分布式的高性能計算屬于MIMD(Multiple Instruction/Multiple Data)的范疇。
4. 分布式(集群)與集群的聯系與區別
分布式是指將不同的業務分布在不同的地方。
而集群指的是將幾臺服務器集中在一起,實現同一業務。
分布式中的每一個節點,都可以做集群。
而集群并不一定就是分布式的。
舉例:就比如新浪網,訪問的人多了,他可以做一個群集,前面放一個響應服務器,后面幾臺服務器完成同一業務,如果有業務訪問的時候,響應服務器看哪臺服務器的負載不是很重,就將給哪一臺去完成。
而分布式,從窄意上理解,也跟集群差不多, 但是它的組織比較松散,不像集群,有一個組織性,一臺服務器垮了,其它的服務器可以頂上來。
分布式的每一個節點,都完成不同的業務,一個節點垮了,哪這個業務就不可訪問了。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/tanghongru1983/archive/2009/04/28/4130356.aspx
posted @
2010-03-02 14:16 absolute 閱讀(642) |
評論 (0) |
編輯 收藏
代碼如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class MyEclipseGen
{
private static final String LL = "Decompiling this copyrighted software is a violation of both your license agreement and the Digital Millenium Copyright Act of 1998 (http://www.loc.gov/copyright/legislation/dmca.pdf). Under section 1204 of the DMCA, penalties range up to a $500,000 fine or up to five years imprisonment for a first offense. Think about it; pay for a license, avoid prosecution, and feel better about yourself.";


public String getSerial(String userId, String licenseNum)
{
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.add(1, 3);
cal.add(6, -1);
java.text.NumberFormat nf = new java.text.DecimalFormat("000");
licenseNum = nf.format(Integer.valueOf(licenseNum));
String verTime = new StringBuilder("-").append(
new java.text.SimpleDateFormat("yyMMdd").format(cal.getTime()))
.append("0").toString();
String type = "YE3MP-";
String need = new StringBuilder(userId.substring(0, 1)).append(type)
.append("300").append(licenseNum).append(verTime).toString();
String dx = new StringBuilder(need).append(LL).append(userId)
.toString();
int suf = this.decode(dx);
String code = new StringBuilder(need).append(String.valueOf(suf))
.toString();
return this.change(code);
}


private int decode(String s)
{
int i;
char[] ac;
int j;
int k;
i = 0;
ac = s.toCharArray();
j = 0;
k = ac.length;

while (j < k)
{
i = (31 * i) + ac[j];
j++;
}
return Math.abs(i);
}


private String change(String s)
{
byte[] abyte0;
char[] ac;
int i;
int k;
int j;
abyte0 = s.getBytes();
ac = new char[s.length()];
i = 0;
k = abyte0.length;

while (i < k)
{
j = abyte0[i];

if ((j >= 48) && (j <= 57))
{
j = (((j - 48) + 5) % 10) + 48;

} else if ((j >= 65) && (j <= 90))
{
j = (((j - 65) + 13) % 26) + 65;

} else if ((j >= 97) && (j <= 122))
{
j = (((j - 97) + 13) % 26) + 97;
}
ac[i] = (char) j;
i++;
}
return String.valueOf(ac);
}


public MyEclipseGen()
{
super();
}


public static void main(String[] args)
{

try
{
System.out.println("please input register name:");
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
String userId = null;
userId = reader.readLine();
MyEclipseGen myeclipsegen = new MyEclipseGen();
String res = myeclipsegen.getSerial(userId, "5");
System.out.println("Serial:" + res);
reader.readLine();

} catch (IOException ex)
{
}
}
}

注冊方法:
window -> preferences -> myeclipse -> subscription
posted @
2010-02-16 09:20 absolute|
編輯 收藏
Hibernate學習筆記
1、Hibernate核心類與接口
1-1.Configuration類
Configuration類是Hibernate的入口,它負責配置和啟動Hibernate,Hibernate框架通過Configuration實例加載配置文件信息(hibernate.cfg.xml),然后讀取指定對象關系映射文件(bean.hbm.xml)的內容并創建SessionFactory.
1-2.SessionFactory接口
SessionFactory接口負責初始化Hibernate,一個SessionFactory實例對應一個數據存儲源(一般就是指一個數據庫)。應用程序從SessionFactory中獲得Session實例。SessionFactory具有以下特點:
1) 線程安全,即同一個 SessionFactory實例可以被應用 的多個線程共享。
2) 它是重量級的 ,因為它需要一個很大的緩存,用來存放預定義的SQL語句以及映射元數據等。
所以說 ,如果一個應用程序中只訪問一個數據庫 ,則只需要創建一個全局的 SessionFactory實例。
1-3.Session 接口
Session是Hibernate中應用最頻繁的接口。Session也被稱為持久化管理器 ,它負責管理所有與持久化相關的操作:如存儲、更新、刪除和加載對象等。Session接口具有以下特點:
1) 單線程,非共享的對象。線程不安全,在設計軟件架構時候,應該避免多個線程共享同一個session實例。
2) Session 實例是輕量級的,它的創建和銷毀不需要消耗太多的資源。可以為每個請分配一個Session實例,在每次請求過程匯總及時創建和銷毀 Session實例。
3) Session有一個緩存,它存放當前工作單元加載的對象。Session的緩存被稱為Hibernate的一級緩存。
1-4.Transaction接口
Transaction接口是 Hibernate框架的事務接口。它對底層的事務接口做了封裝,包括:JDBC API和JTA.這樣使得Hibernate應用可以通過一致的Transaction接口來申明事務邊界,這有助于應用程序再不同的環境和容器中移植。
1-5.Query和Criteria接口
它們是 Hibernate的查詢接口,用于從數據存儲源查詢對象及控制執行查詢的過程。Query包裝了一個 HQL(Hibernate Query Language);而Criteria接口完全封裝了基本字符串形式的查詢語句,比Query更加面向對象,Criteria接口擅長于執行動態查詢。
2、Hibernate中常用的事務隔離級別
常量
|
值
|
說明
|
TRANSACTION_NONE
|
0
|
不支持事務
|
TRANSACTION_READ_UNCOMMITTED
|
1
|
指示可以發生臟讀(dirty read)、不可重復讀和虛讀(phantom read)的常量。此級別允許被某一事務更改的行在已提交該行所有更改之前被另一個事務讀取(“臟讀”)。如果所有更改都被回滾,則第二個事務將獲取無效的行。
|
TRANSACTION_READ_COMMITTED
|
2
|
指示不可以發生臟讀的常量;不可重復讀和虛讀可以發生。此級別只禁止事務讀取其中帶有未提交更改的行。
|
TRANSACTION_REPEATABLE_READ
|
4
|
指示不可以發生臟讀和不可重復讀的常量;虛讀可以發生。此級別禁止事務讀取帶有未提交更改的行,它還禁止這種情況:一個事務讀取某一行,而另一個事務更改該行,第一個事務重新讀取該行,并在第二次讀取時獲得不同的值(“不可重復讀”)。
|
TRANSACTION_SERIALIZABLE
|
8
|
指示不可以發生臟讀、不可重復讀和虛讀的常量。此級別包括TRANSACTION_REPEATABLE_READ 中禁止的事項,同時還禁止出現這種情況:某一事務讀取所有滿足 WHERE 條件的行,另一個事務插入一個滿足 WHERE 條件的行,第一個事務重新讀取滿足相同條件的行,并在第二次讀取時獲得額外的“虛”行。
|
3、Hibernate中實例的狀態

3-1:臨時狀態
該實例從未與任何持久化上下文關聯過。它沒有持久化標識(相當于主鍵值),臨時狀態下的對象有如下特征。
1) 不處于Session緩存中,也可以說不被任何一個Session關聯
2) 在數據庫中沒有對應的記錄
在以下情況下,Java對象進入臨時狀態
1) 當通過new語句剛創建一個Java對象,它處于臨時狀態,此時不和數據庫中的任何記錄對應。
2) Session的delete()方法能使一個持久化或臨時脫管對象轉換為臨時對象。對于脫管對象,delete()方法從數據庫中刪除與它對應的記錄,并且把它從Session緩存中刪除。
3-2:持久化狀態
該實例目前與某個持久化上下文有關聯,它擁有持久化標識(相當于主鍵值),并且可能在數據庫匯總有一個對應的行。對于某一個特定的持久化上下文,Hibernate保證標識與Java標識(其值代表對應在內存中的位置)等價。持久化對象有以下特征。
1) 位于一個Session實例的緩存中,也可以說,持久化對象總是被一個Session實例關聯。
2) 持久化對象和數據庫中的相關記錄對應。
3) Session在清理緩存時,會根據持久化對象的屬性變化,來同步更新數據庫。
Session的許多方法都能夠觸發Java對象進入持久化狀態。
4) Session的save()的方法能夠把臨時對象轉變成持久化對象。
5) Session的load()或get()方法返回的對象總是處于持久化狀態。
6) Query類的list()方法返回的list集合中存放的都是持久化對象。
7) Session的update()、saveOrUpdate()和lock()方法使脫管對象轉變為持久化對象。
當一個持久化對象關聯一個臨時對象時,在允許級聯保存的情況下,Session在清理緩存時會把這個臨時對象也轉變成持久化對象。Hibernate保證在同一個Session實例的緩存中,數據庫表中的每條記錄只對應唯一的持久化對象,也就是說在一個Session里load/get同一個OID得到 的是相同的對象。
3-3:脫管狀態
實例曾經與某個持久化上下文發生過關聯,不過那個上下文被關閉了,或者這個實例是被序列化(serialize)到另外的進程。它擁有持久化標識,并且在數據庫中可能存在一個對應的行。對于脫管狀態的實例,Hibernate不保證任何持久化標識和Java標識的關系。
脫管對象具有以下特征。
1) 不再位于Session的緩存中,也可以說,脫管對象不被Session關聯。
2) 脫管對象是有持久化對象轉變過來的,因此在數據庫中可能還存在與它對應的記錄(前提條件是沒有其他程序刪除了這條記錄)。
3) 脫管對象與臨時對象的相同指出在于兩者都不被Session關聯,因此Hibernate不會保證他們屬性變化與數據庫保持同步。脫管對象與臨時對象的區別在于前者是由持久化對象轉變過來的,因此可能在書庫中還存在對應的記錄,而后者在數據庫中是沒有對應的記錄的。
Session的以下方法使持久化對象轉變成脫管對象.
1) 當調用Session的close()方法時,Session 的緩存被清空,緩存中的所有持久化對象都變為脫管對象,如果在應用程序中沒有引用變量引用這些脫管對象,他們就會結束生命周期。
2) Session的evict()方法能夠從緩存中刪除一個持久化對象,使它變為脫管狀態,當Session的緩存中保存了大量的持久化對象時,會消耗許多內存空間,為了提高性能,可以考慮調用evict()方法,從緩存中刪除一些持久化對象。但是多數情況下不推薦使用該方法,而應該通過查詢語言,或者顯示的導航來控制對象圖的深度。
posted @
2010-01-09 19:08 absolute 閱讀(674) |
評論 (0) |
編輯 收藏