原創文章如轉載,請注明:轉載自月光博客 [ http://www.williamlong.info/ ]
試共同條件: 數據總數為110011條,每條數據條數為19個字段。 電腦配置為:P4 2.67GHz,1G內存。 一、POI、JXL、FastExcel比較 POI、JXL、FastExcel均為java第三方開源導出Excel的開源項目。 導出方案一:一次性全部導出到一個Excel文件中。 實際情況均報OutOfMemery錯誤,以下數據為報OutOfMemery數據時,數據到的最大數據數目,如表1所示: 表1:報OutOfMemery錯誤時所能處理的數據量
多分sheet能一定程度上減少內存的使用,但是均因為程序中創建的Cell(即為Excel中的一個單元格)無法釋放,消耗大量內存,導致OutOfMemery錯誤;JXL表現最好,創建Cell內存使用較少。 導出方案二:先分多個Excel文件將數據全部導出,然后對多個Excel文件進行合并。 首先,測試將全部數據導出所用的時間,如表2所示,數據均測試三次取平均。 表2:導出全部數據所用時間
均成功導出Excel文件,原因是導出一個Excel文件,釋放所占用的創建Cell的內存。 FastExecl表現最差,POI表現穩定,JXL隨著數據的增大,速度一定程度上增快。 然后,進行整合,由于將多Excel合并成一個Excel文件的功能只有POI所有,故使用POI測試,結果如表3所示。 注:數據量大合并還會報OutOfMemery錯誤,故合并總數據量以5萬為準。 表3:合并5萬數據所用時間
使用POI對文件進行合并速度較快,但有數據量的限制。 總結:方案二比較可行,但是數據量有限制,為5萬條。 二、導出XML 的電子表格 導出的格式類似為純文本,能實現大數據量的存儲,并能實現分Sheet查看,且能添加簡單的樣式,符合項目要求。經實際測試Excel2003和Excel2007均能識別并正常打開查看。使用時間測試如表4所示,數據均測試3次取平均。 表4:生成全部數據所用時間
但是導出的數據為XML不是純正的Excel文件,如使用Excel文件的xls后綴保存,打開文件會彈出警告,但不影響閱讀。 且經實際測試,在Access2007和Access2003中可通過導入外部數據的方式,將導出的XML導入進Access數據庫。 三、總結 項目要求是大數據量導出Excel文件,POI、JXL、FastExcel不能完全滿足要求;使用XML 的電子表格導出實現了大數據量導出,但是格式為XML不是純正的Excel文件,為曲線救國。兩種導出形式的比較,如表5所示。 表5:合并5萬數據所用時間
|
研究了很久新出的 Spring 2.5, 總算大致明白了如何用標注定義 Bean, 但是如何定義和注入類型為 java.lang.String 的 bean 仍然未解決, 希望得到高人幫助.
總的來看 Java EE 5 的標注開發方式開來是得到了大家的認可了.
@Service 相當于定義 bean, 自動根據 bean 的類名生成一個首字母小寫的 bean
@Autowired 則是自動注入依賴的類, 它會在類路徑中找成員對應的類/接口的實現類, 如果找到多個, 需要用 @Qualifier("chineseMan") 來指定對應的 bean 的 ID.
一定程度上大大簡化了代碼的編寫, 例如一對一的 bean 映射現在完全不需要寫任何額外的 bean 定義了.
下面是代碼的運行結果:
man.sayHello()=抽你丫的
SimpleMan said: Hi
org.example.EnglishMan@12bcd4b said: Fuck you!
代碼:
beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config/> <context:component-scan base-package="org.example"/> </beans>
測試類:
import org.example.IMan;
import org.example.SimpleMan;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
SimpleMan dao = (SimpleMan) ctx.getBean("simpleMan");
System.out.println(dao.hello());
IMan man = (IMan) ctx.getBean("usMan");
System.out.println(man.sayHello());
}
}
自動探測和注入bean的類:
package org.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service
public class SimpleMan {
// 自動注入名稱為 Man 的 Bean
@Autowired(required = false)
@Qualifier("chineseMan")
//@Qualifier("usMan")
private IMan man;
/**
* @return the man
*/
public IMan getMan() {
return man;
}
/**
* @param man the man to set
*/
public void setMan(IMan man) {
this.man = man;
}
public String hello() {
System.out.println("man.sayHello()=" + man.sayHello());
return "SimpleMan said: Hi";
}
}
一個接口和兩個實現類:
package org.example;
/**
* 抽象的人接口.
* @author BeanSoft
* @version 1.0
*/
public interface IMan {
/**
* 打招呼的抽象定義.
* @return 招呼的內容字符串
*/
public String sayHello();
}
package org.example;
import org.springframework.stereotype.Service;
/**
* 中國人的實現.
* @author BeanSoft
*/
@Service
public class ChineseMan implements IMan {
public String sayHello() {
return "抽你丫的";
}
}
package org.example;
import org.springframework.stereotype.Service;
/**
* @author BeanSoft
* 美國大兵
*/
@Service("usMan")
// 這里定義了一個 id 為 usMan 的 Bean, 標注里面的屬性是 bean 的 id
public class EnglishMan implements IMan {
public String sayHello() {
return this + " said: Fuck you!";
}
}
Spring中autowire屬性 |
|||||
![]() |
|||||
|
有關表分區的一些維護性操作:
一、添加分區
以下代碼給SALES表添加了一個P3分區
ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));
注意:以上添加的分區界限應該高于最后一個分區界限。
以下代碼給SALES表的P3分區添加了一個P3SUB1子分區
ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');
二、刪除分區
以下代碼刪除了P3表分區:
ALTER TABLE SALES DROP PARTITION P3;
在以下代碼刪除了P4SUB1子分區:
ALTER TABLE SALES DROP SUBPARTITION P4SUB1;
注意:如果刪除的分區是表中唯一的分區,那么此分區將不能被刪除,要想刪除此分區,必須刪除表。
三、截斷分區
截斷某個分區是指刪除某個分區中的數據,并不會刪除分區,也不會刪除其它分區中的數據。當表中即使只有一個分區時,也可以截斷該分區。通過以下代碼截斷分區:
ALTER TABLE SALES TRUNCATE PARTITION P2;
通過以下代碼截斷子分區:
ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;
四、合并分區
合并分區是將相鄰的分區合并成一個分區,結果分區將采用較高分區的界限,值得注意的是,不能將分區合并到界限較低的分區。以下代碼實現了P1 P2分區的合并:
ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;
五、拆分分區
拆分分區將一個分區拆分兩個新分區,拆分后原來分區不再存在。注意不能對HASH類型的分區進行拆分。
ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD'))
INTO (PARTITION P21,PARTITION P22);
六、接合分區(coalesca)
結合分區是將散列分區中的數據接合到其它分區中,當散列分區中的數據比較大時,可以增加散列分區,然后進行接合,值得注意的是,接合分區只能用于散列分區中。通過以下代碼進行接合分區:
ALTER TABLE SALES COALESCA PARTITION;
七、重命名表分區
以下代碼將P21更改為P2
ALTER TABLE SALES RENAME PARTITION P21 TO P2;
九、跨分區查詢
select sum( *) from (
(select count(*) cn from t_table_SS PARTITION (P200709_1)
union all
select count(*) cn from t_table_SS PARTITION (P200709_2));
十、查詢表上有多少分區
SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName'
十一、查詢索引信息
select object_name,object_type,tablespace_name,sum(value)
from v$segment_statistics
where statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX'
group by object_name,object_type,tablespace_name
order by 4 desc
--顯示數據庫所有分區表的信息:
select * from DBA_PART_TABLES
--顯示當前用戶可訪問的所有分區表信息:
select * from ALL_PART_TABLES
--顯示當前用戶所有分區表的信息:
select * from USER_PART_TABLES
--顯示表分區信息 顯示數據庫所有分區表的詳細分區信息:
select * from DBA_TAB_PARTITIONS
--顯示當前用戶可訪問的所有分區表的詳細分區信息:
select * from ALL_TAB_PARTITIONS
--顯示當前用戶所有分區表的詳細分區信息:
select * from USER_TAB_PARTITIONS
--顯示子分區信息 顯示數據庫所有組合分區表的子分區信息:
select * from DBA_TAB_SUBPARTITIONS
--顯示當前用戶可訪問的所有組合分區表的子分區信息:
select * from ALL_TAB_SUBPARTITIONS
--顯示當前用戶所有組合分區表的子分區信息:
select * from USER_TAB_SUBPARTITIONS
--顯示分區列 顯示數據庫所有分區表的分區列信息:
select * from DBA_PART_KEY_COLUMNS
--顯示當前用戶可訪問的所有分區表的分區列信息:
select * from ALL_PART_KEY_COLUMNS
--顯示當前用戶所有分區表的分區列信息:
select * from USER_PART_KEY_COLUMNS
--顯示子分區列 顯示數據庫所有分區表的子分區列信息:
select * from DBA_SUBPART_KEY_COLUMNS
--顯示當前用戶可訪問的所有分區表的子分區列信息:
select * from ALL_SUBPART_KEY_COLUMNS
--顯示當前用戶所有分區表的子分區列信息:
select * from USER_SUBPART_KEY_COLUMNS
--怎樣查詢出oracle數據庫中所有的的分區表
select * from user_tables a where a.partitioned='YES'
--刪除一個表的數據是
truncate table table_name;
--刪除分區表一個分區的數據是
alter table table_name truncate partition p5;
注:分區根據具體情況選擇。
表分區有以下優點:
1、數據查詢:數據被存儲到多個文件上,減少了I/O負載,查詢速度提高。
2、數據修剪:保存歷史數據非常的理想。
3、備份:將大表的數據分成多個文件,方便備份和恢復。
4、并行性:可以同時向表中進行DML操作,并行性性能提高。
================================================
索引:
1、一般索引:
create index index_name on table(col_name);
2、Oracle 分區索引詳解
語法:Table Index
CREATE [UNIQUE|BITMAP] INDEX [schema.]index_name
ON [schema.]table_name [tbl_alias]
(col [ASC | DESC]) index_clause index_attribs
index_clauses:
分以下兩種情況
1. Local Index
就是索引信息的存放位置依賴于父表的Partition信息,換句話說創建這樣的索引必須保證父表是Partition
1.1 索引信息存放在父表的分區所在的表空間。但是僅可以創建在父表為HashTable或者composite分區表的。
LOCAL STORE IN (tablespace)
1.2 僅可以創建在父表為HashTable或者composite分區表的。并且指定的分區數目要與父表的分區數目要一致
LOCAL STORE IN (tablespace) (PARTITION [partition [LOGGING|NOLOGGING] [TABLESPACE {tablespace|DEFAULT}] [PCTFREE int] [PCTUSED int] [INITRANS int] [MAXTRANS int] [STORAGE storage_clause] [STORE IN {tablespace_name|DEFAULT] [SUBPARTITION [subpartition [TABLESPACE tablespace]]]])
1.3 索引信息存放在父表的分區所在的表空間,這種語法最簡單,也是最常用的分區索引創建方式。
Local
1.4 并且指定的Partition 數目要與父表的Partition要一致
LOCAL (PARTITION [partition
[LOGGING|NOLOGGING]
[TABLESPACE {tablespace|DEFAULT}]
[PCTFREE int]
[PCTUSED int]
[INITRANS int]
[MAXTRANS int]
[STORAGE storage_clause]
[STORE IN {tablespace_name|DEFAULT]
[SUBPARTITION [subpartition [TABLESPACE tablespace]]]])
Global Index
索引信息的存放位置與父表的Partition信息完全不相干。甚至父表是不是分區表都無所謂的。語法如下:
GLOBAL PARTITION BY RANGE (col_list)
( PARTITION partition VALUES LESS THAN (value_list)
[LOGGING|NOLOGGING]
[TABLESPACE {tablespace|DEFAULT}]
[PCTFREE int]
[PCTUSED int]
[INITRANS int]
[MAXTRANS int]
[STORAGE storage_clause] )
但是在這種情況下,如果父表是分區表,要刪除父表的一個分區都必須要更新Global Index ,否則索引信息不正確
ALTER TABLE TableName DROP PARTITION PartitionName Update Global Indexes
--查詢索引
select object_name,object_type,tablespace_name,sum(value)
from v$segment_statistics
where statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX'
group by object_name,object_type,tablespace_name
order by 4 desc
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/thinker28754/archive/2009/03/06/3962309.aspx
一、Java中文問題的由來
Java的內核和class文件是基于unicode的,這使Java程序具有良好的跨平臺性,但也帶來了一些中文亂碼問題的麻煩。原因主要有兩方面,Java和JSP文件本身編譯時產生的亂碼問題和Java程序于其他媒介交互產生的亂碼問題。
首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字節流的,如果Java和JSP編譯成class文件過程中,使用的編碼方式與源文件的編碼不一致,就會出現亂碼。基于這種亂碼,建議在Java文件中盡量不要寫中文(注釋部分不參與編譯,寫中文沒關系),如果必須寫的話,盡量手動帶參數-ecoding GBK或-ecoding gb2312編譯;對于JSP,在文件頭加上<%@ page contentType="text/html;charset=GBK"%>或<%@ page contentType="text/html;charset=gb2312"%>基本上就能解決這類亂碼問題。
本文要重點討論的是第二類亂碼,即Java程序與其他存儲媒介交互時產生的亂碼。很多存儲媒介,如數據庫,文件,流等的存儲方式都是基于字節流的,Java程序與這些媒介交互時就會發生字符(char)與字節(byte)之間的轉換,例如從頁面提交表單中提交的數據在Java程序里顯示亂碼等情況。
如果在以上轉換過程中使用的編碼方式與字節原有的編碼不一致,很可能就會出現亂碼。
二、解決方法
對于流行的Tomcat來說,有以下兩種解決方法:
1) 更改 D:\Tomcat\conf\server.xml,指定瀏覽器的編碼格式為“簡體中文”:
方法是找到 server.xml 中的
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='GBK' />
標記,粗體字是我添加的。
可以這樣驗證你的更改是否成功:在更改前,在你出現亂碼的頁面的IE瀏覽器,點擊菜單“查看|編碼”,會發現“西歐(ISO)”處于選中狀態。而更改后,點擊菜單“查看|編碼”,會發現“簡體中文(GB2312)”處于選中狀態。
b)更該 Java 程序,我的程序是這樣的:
public class ThreeParams extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=GBK");
...
}
}
粗體字是必需要有的,它的作用是讓瀏覽器把Unicode字符轉換為GBK字符。這樣頁面的內容和瀏覽器的顯示模式都設成了GBK,就不會亂碼了。
ApplicationContext
接口擴展了MessageSource
接口,因而提供了消息處理的功能(i18n或者國際化)。與HierarchicalMessageSource
一起使用,它還能夠處理嵌套的消息,這些是Spring提供的處理消息的基本接口。讓我們快速瀏覽一下它所定義的方法:
String getMessage(String code, Object[] args, String default, Locale loc):用來從
MessageSource
獲取消息的基本方法。如果在指定的locale中沒有找到消息,則使用默認的消息。args中的參數將使用標準類庫中的MessageFormat
來作消息中替換值。
String getMessage(String code, Object[] args, Locale loc):本質上和上一個方法相同,其區別在:沒有指定默認值,如果沒找到消息,會拋出一個
NoSuchMessageException
異常。
String getMessage(MessageSourceResolvable resolvable, Locale locale)
:上面方法中所使用的屬性都封裝到一個MessageSourceResolvable
實現中,而本方法可以指定MessageSourceResolvable
實現。
當一個ApplicationContext
被加載時,它會自動在context中查找已定義為MessageSource
類型的bean。此bean的名稱須為messageSource
。如果找到,那么所有對上述方法的調用將被委托給該bean。否則ApplicationContext
會在其父類中查找是否含有同名的bean。如果有,就把它作為MessageSource
。如果它最終沒有找到任何的消息源,一個空的StaticMessageSource
將會被實例化,使它能夠接受上述方法的調用。
Spring目前提供了兩個MessageSource
的實現:ResourceBundleMessageSource
和StaticMessageSource
。它們都繼承NestingMessageSource
以便能夠處理嵌套的消息。StaticMessageSource
很少被使用,但能以編程的方式向消息源添加消息。ResourceBundleMessageSource
會用得更多一些,為此提供了一下示例:
<beans> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>format</value> <value>exceptions</value> <value>windows</value> </list> </property> </bean> </beans>
這段配置假定在你的classpath中有三個資源文件(resource bundle),它們是format
, exceptions
和windows
。通過ResourceBundle,使用JDK中解析消息的標準方式,來處理任何解析消息的請求。出于示例的目的,假定上面的兩個資源文件的內容為…
# in 'format.properties'
message=Alligators rock!
# in 'exceptions.properties'
argument.required=The '{0}' argument is required.
下面是測試代碼。因為ApplicationContext
實現也都實現了MessageSource
接口,所以能被轉型為MessageSource
接口
public static void main(String[] args) { MessageSource resources = new ClassPathXmlApplicationContext("beans.xml"); String message = resources.getMessage("message", null, "Default", null); System.out.println(message); }
上述程序的輸出結果將會是...
Alligators rock!
總而言之,我們在'beans.xml'
的文件中(在classpath根目錄下)定義了一個messageSource
bean,通過它的basenames
屬性引用多個資源文件;而basenames
屬性值由list元素所指定的三個值傳入,它們以文件的形式存在并被放置在classpath的根目錄下(分別為format.properties
,exceptions.properties
和windows.properties
)。
再分析個例子,這次我們將著眼于傳遞參數給查找的消息,這些參數將被轉換為字符串并插入到已查找到的消息中的占位符(譯注:資源文件中花括號里的數字即為占位符)。
<beans> <!-- thisMessageSource
is being used in a web application --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="baseName" value="WEB-INF/test-messages"/> </bean> <!-- let's inject the aboveMessageSource
into this POJO --> <bean id="example" class="com.foo.Example"> <property name="messages" ref="messageSource"/> </bean> </beans>
public class Example { private MessageSource messages; public void setMessages(MessageSource messages) { this.messages = messages; } public void execute() { String message = this.messages.getMessage("argument.required", new Object [] {"userDao"}, "Required", null); System.out.println(message); } }
調用execute()
方法的輸出結果是...
The 'userDao' argument is required.
對于國際化(i18n),Spring中不同的MessageResource
實現與JDK標準ResourceBundle中的locale解析規則一樣。比如在上面例子中定義的messageSource
bean,如果你想解析British (en-GB) locale的消息,那么需要創建format_en_GB.properties
,exceptions_en_GB.properties
和windows_en_GB.properties
三個資源文件。
Locale解析通常由應用程序根據運行環境來指定。出于示例的目的,我們對將要處理的(British)消息手工指定locale參數值。
# in 'exceptions_en_GB.properties'
argument.required=Ebagum lad, the '{0}' argument is required, I say, required.
public static void main(final String[] args) { MessageSource resources = new ClassPathXmlApplicationContext("beans.xml"); String message = resources.getMessage("argument.required", new Object [] {"userDao"}, "Required", Locale.UK); System.out.println(message); }
上述程序運行時的輸出結果是...
Ebagum lad, the 'userDao' argument is required, I say, required.
MessageSourceAware
接口還能用于獲取任何已定義的MessageSource
引用。任何實現了MessageSourceAware
接口的bean將在創建和配置的時候與MessageSource
一同被注入。