??xml version="1.0" encoding="utf-8" standalone="yes"?>
原因?hibernate 使用c3p0q接orcale数据后不?x)释?Q?c3p0的最大连接数?00Q但昄c3p0有BugQ导致数据库q接池不够用Q导致进E锁歅R?br />后换Proxool后,观察正常?br />
下面转引其它|友文章说明c3p0 ?Proxool?dbcp 的区?
<!-- JDBC驱动E序 -->
2<property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/struts?useUnicode=true&characterEncoding=GBK</property> <!-- 数据库用户名 -->
3<property name="connection.username">root</property> <!-- 数据库密?nbsp;-->
上面的一D配|,?span class="hilite2" style="background-color: #ffffff">c3p0?span class="hilite1" style="background-color: #ffffff">dbcp中,都是必需的,因ؓ(f)hibernate?x)根据上q的配置来生成connectionsQ再交给c3p0?span class="hilite1" style="background-color: #ffffff">dbcp理.
1 C3P0
只需在hibernate.cfg.xml中加?
<property name="c3p0.min_size">5</property>
2<property name="c3p0.max_size">30</property>
3<property name="c3p0.time_out">1800</property>
4<property name="c3p0.max_statement">50</property>
5
q有在classespath中加?span class="hilite2" style="background-color: #ffffff">c3p0-0.8.4.5.jar
2 dbcp
在hibernate.cfg.xml中加?
<property name="dbcp.maxActive">100</property>
2<property name="dbcp.whenExhaustedAction">1</property>
3<property name="dbcp.maxWait">60000</property>
4<property name="dbcp.maxIdle">10</property>
5
6<property name="dbcp.ps.maxActive">100</property>
7<property name="dbcp.ps.whenExhaustedAction">1</property>
8<property name="dbcp.ps.maxWait">60000</property>
9<property name="dbcp.ps.maxIdle">10</property>
10
q有在classespath中加入commons-pool-1.2.jar 和commons-dbcp-1.2.1.jar.
3 proxool
׃数据库connection在较长时间没有访问下?x)自动断开q接Q导致浏览出错,增加proxool作ؓ(f)数据库pool。它有自动连接功能?br />1)、从http://proxool.sourceforge...下蝲proxoolQ释放proxool.jar到WEB-INF/lib
2)、在hibernate.cfg.xml中增加:(x)
<property name="hibernate.proxool.pool_alias">dbpool</property>
2<property name="hibernate.proxool.xml">proxool.xml</property>
3<property name="connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>
4
3)、在与hibernate.cfg.xml同目录Qsrc根目录下Q增加proxool.xml文gQ?br />
<?xml version="1.0" encoding="utf-8"?>
2<!-- the proxool configuration can be embedded within your own application's.
3 Anything outside the "proxool" tag is ignored. -->
4<something-else-entirely>
5 <proxool>
6 <alias>dbpool</alias>
7 <!--proxool只能理p׃生的q接-->
8 <driver-url>
9 jdbc:mysql://127.0.0.1:3306/wlsh?characterEncoding=GBK&useUnicode=true&autoReconnect=true </driver-url>
10 <driver-class>com.mysql.jdbc.Driver</driver-class>
11 <driver-properties>
12 <property name="user" value="root" />
13 <property name="password" value="123456" />
14 </driver-properties>
15 <!-- proxool自动侦察各个q接状态的旉间隔(毫秒),侦察到空闲的q接马上回?时的销?/span>-->
16 <house-keeping-sleep-time>90000</house-keeping-sleep-time>
17 <!-- 最保持的I闲q接?/span>-->
18 <prototype-count>5</prototype-count>
19 <!-- 允许最大连接数,过了这个连接,再有hӞ排在队列中{候,最大的{待h数由maximum-new-connections军_-->
20 <maximum-connection-count>100</maximum-connection-count>
21 <!-- 最连接数-->
22 <minimum-connection-count>10</minimum-connection-count>
23 </proxool>
24</something-else-entirely>
25
于在hibernate3.0中,已经不再支持dbcp了,hibernate的作者在hibernate.org中,明确指出在实践中发现dbcp?BUG,在某些种情会(x)产生很多I接不能释放,所以抛弃了对dbcp的支持。至于c3p0Q有评论说它的算法不是最优的Q因为网上查资料得知Q有|友做了一个实验,在同一目中分别用了几个常用的q接池,然后试其性能Q发现c3p0占用资源比较大,效率也不高。所以,Z上述原因Qproxool不少行家推荐使用Q而且暂时来说Q是负面评h(hun)是最的一个。在三星中也有项目是用proxool的。从性能和出错率来说QproxoolE微比前两种好些。C3P0Q稳定性似乎不错,在这斚wg有很好的口碑。至于性能Q应该不是最好的Q算是中规中矩的cd?
Proxool的口似乎很好,不大见到负面的评P从官方资料上来看Q有许多有用的特性和特点Q也是许多h推荐的?br />
]]>
在java,jsp,数据库,表格都统一为、utf8或GBK{后Q?br />
最后要在,my.ini或my.cnf中加入编?br />
如:(x)
[mysqld]
default-character-set=utf8
default-storage-engine=INNODB
[client]
port=3306
[mysql]
default-character-set=utf8
如果你从事与数据库相关的工作Q有可能?x)涉及(qing)到数据从外部数据文g插入?strong>SQL Server的操作。本文将为大家演C如何利?strong>BULK INSERT命o(h)来导入数据,q讲解怎样通过改变该命令的一些选项以便更方便且更有效地插入数据?/p>
BULK INSERT
在SQL Server中,BULK INSERT是用来将外部文g以一U特定的格式加蝲到数据库表的T-SQL命o(h)。该命o(h)使开发h员能够直接将数据加蝲到数据库表中Q而不需要用类gIntegration Servicesq样的外部程序。虽然BULK INSERT不允许包含Q何复杂的逻辑或{换,但能够提供与格式化相关的选项Qƈ告诉我们导入是如何实现的。BULK INSERT有一个用限Ӟ是只能数据导入SQL Server?/p>
插入数据
下面的例子能让我们更好的理解如何使用BULK INSERT命o(h)。首先,我们来创Z个名为Sales的表Q我们将要把来自文本文g的数据插入到q个表中?/p>
CREATE TABLE [dbo].[Sales] ( [SaleID] [int], [Product] [varchar](10) NULL, [SaleDate] [datetime] NULL, [SalePrice] [money] NULL ) |
当我们用BULK INSERT命o(h)来插入数据时Q不要启动目标表中的触发器,因ؓ(f)触发器会(x)减缓数据导入的进E?/p>
在下一个例子中Q我们将在Sales表上创徏触发器,用来打印插入到表中的记录的数量?/p>
CREATE TRIGGER tr_Sales ON Sales FOR INSERT AS BEGIN PRINT CAST(@@ROWCOUNT AS VARCHAR(5)) + ' rows Inserted.' END |
q里我们选择文本文g作ؓ(f)源数据文Ӟ文本文g中的值通过逗号分割开。该文g包含1000条记录,而且其字D和Sales表的字段直接兌。由于该文本文g中的值是由逗号分割开的,我们只需要指定FIELDTERMINATOR卛_。注意,当下面这条语句运行时Q我们刚刚创建的触发器ƈ没有启动Q?/p>
BULK INSERT Sales FROM 'c:SalesText.txt' WITH (FIELDTERMINATOR = ',')
当我们要的数据量非常大时Q有时候就需要启动触发器。下面的脚本使用了FIRE_TRIGGERS选项来指明在目标表上的Q何触发器都应当启动:(x)
BULK INSERT Sales FROM 'c:SalesText.txt' WITH (FIELDTERMINATOR = ',', FIRE_TRIGGERS)
我们可以使用BATCHSIZE指o(h)来设|在单个事务中可以插入到表中的记录的数量。在前一个例子中Q所有的1000条记录都在同一个事务中被插入到目标表里。下面的例子Q我们将BATCHSIZE参数讄?Q也是说要对该表执?00ơ独立的插入事务。这也意味着启动500ơ触发器Q所以将?00咯打印指令输出到屏幕上?/p>
BULK INSERT Sales FROM 'c:SalesText.txt' WITH (FIELDTERMINATOR = ',', FIRE_TRIGGERS, BATCHSIZE = 2)
BULK INSERT不仅仅可以应用于SQL Server 2005的本地映驱动器。下面的语句告诉我们如何从名ؓ(f)FileServer的服务器的D盘中SalesText文g的数据导入?/p>
BULK INSERT Sales FROM 'FileServerD$SalesText.txt' WITH (FIELDTERMINATOR = ',')
有时候,我们在执行导入操作以前,最好能先查看一下将要输入的数据。下面的语句在用BULK命o(h)Ӟ使用了OPENROWSET函数Q以便从SalesText文本文g中读取源数据。该语句同时q需要用一个格式文?此处没有列出文g的具体内?来表明该文本文g中的数据格式?/p>
SELECT * FROM OPENROWSET(BULK 'c:SalesText.txt' , FORMATFILE='C:SalesFormat.Xml' ) AS mytable; GO |
select * from employee
//动态SQL语句
<dynamic prepend="WHERE">
<isParameterPresent>
emp_id = #value#
</isParameterPresent>
</dynamic>
</select>
</statements>
</sqlMap>
/*动态SQL的写法:(x)
开?<dynamic
条g成立时前面要加的字符?prepend ="字符?>
<属性关键字 (见下?
prepend="字符?
判断条g的对象属性名 property="字符?
如果是属性关键字是比较条件时,字符串存放要比较的值compareValue="字符?>
要显C的条g?/span>
</属性关键字>
l束</dynamic>
*/
/*动态SQL的参数有
属性关键字 |
含义 |
<isEqual> |
如果参数相等于?/span>则查询条件有效?/span> |
<isNotEqual> |
如果参数不等于值则查询条g有效?/span> |
<isGreaterThan> |
如果参数大于值则查询条g有效?/span> |
<isGreaterEqual> |
如果参数{于值则查询条g有效?/span> |
<isLessEqual> |
如果参数于值则查询条g有效。如下所C:(x) <isLessEqual prepend = ”AND” property = ”age” compareValue = ”18” > ADOLESCENT = ‘TRUE’ </isLessEqual> |
<isPropertyAvailable> |
如果参数有用则查询条g有效?/span> |
<isNotPropertyAvailable> |
如果参数没有使用则查询条件有效?/span> |
<isNull> |
如果参数为NULL则查询条件有效?/span> |
<isNotNull> |
如果参数不ؓ(f)NULL则查询条件有效?/span> |
<isEmpty> |
如果参数为空则查询条件有效?/span> |
<isNotEmpty> |
如果参数不ؓ(f)I则查询条g有效。参数的数据cd?/span>Collection?/span>String 时参C?/span>NULL?#8220;”。如下所C:(x) <isNotEmpty prepend=”AND” property=”firstName” > FIRST_NAME=#firstName# </isNotEmpty> |
<isParameterPresent> |
如果参数cM为NULL则查询条件有效?/span> |
<isNotParameterPresent> |
Checks to see if the parameter object is not present (null). Example Usage: <isNotParameterPresent prepend=”AND”> EMPLOYEE_TYPE = ‘DEFAULT’ </isNotParameterPresent> |
LOAD DATA INFILE语句从一个文本文件中以很高的速度d一个表中。如果指定LOCAL关键词,从客户主文g。如果LOCAL没指定,文g必须位于服务?/a>上?LOCAL在MySQL3.22.6或以后版本中可用。)
Z安全原因Q当d位于服务器上的文本文件时Q文件必d于数据库目录或可被所有hd。另外,ZҎ(gu)务器上文件用LOAD DATA INFILEQ在服务器主Z你必Lfile的权限。见6.5 由MySQL提供的权限?
如果你指定关键词LOW_PRIORITYQLOAD DATA语句的执行被推迟到没有其他客戯取表后?
使用LOCAL比让服务器直接存取文g慢些Q因为文件的内容必须从客户主Z送到服务器主机。在另一斚wQ你不需要file权限装蝲本地文g?
你也可以使用mysqlimport实用E序装蝲数据文gQ它由发送一个LOAD DATA INFILE命o(h)到服务器来运作?--local选项使得mysqlimport从客户主Zd数据。如果客户和服务器支持压~协议,你能指定--compress在较慢的|络上获得更好的性能?
当在服务器主ZL文gӞ服务器用下列规则:(x)
如果l出一个绝对\径名Q服务器使用该\径名?
如果l出一个有一个或多个前置部g的相对\径名Q服务器相对服务器的数据目录搜烦文g?
如果l出一个没有前|部件的一个文件名Q服务器在当前数据库的数据库目录L文g?
注意q些规则意味着一个像“./myfile.txt”l出的文件是从服务器的数据目录读取,而作?#8220;myfile.txt”l出的一个文件是从当前数据库的数据库目录下读取。也要注意,对于下列哪些语句Q对db1文g从数据库目录dQ而不是db2Q?
mysql> USE db1;
mysql> LOAD DATA INFILE "./data.txt" INTO TABLE db2.my_table;
REPLACE和IGNORE关键词控制对现有的唯一键记录的重复的处理。如果你指定REPLACEQ新行将代替有相同的唯一键值的现有行。如果你指定IGNOREQ蟩q有唯一键的现有行的重复行的输入。如果你不指定Q何一个选项Q当扑ֈ重复键键Ӟ出现一个错误,q且文本文g的余下部分被忽略时?
如果你用LOCAL关键词从一个本地文件装载数据,服务器没有办法在操作的当中停止文件的传输Q因此缺省的行ؓ(f)好像IGNORE被指定一栗?
LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,
SELECT句法。ؓ(f)了将一个数据库的数据写入一个文Ӟ使用SELECT ... INTO OUTFILEQؓ(f)了将文gd数据库,使用LOAD DATA INFILE。两个命令的FIELDS和LINES子句的语法是相同的。两个子句是可选的Q但是如果指定两个,FIELDS必须在LINES之前?
如果你指定一个FIELDS子句Q它的每一个子?TERMINATED BY, [OPTIONALLY] ENCLOSED BY和ESCAPED BY)也是可选的Q除了你必须臛_指定他们之一?
如果你不指定一个FIELDS子句Q缺省g如果你这样写的相同:(x)
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
如果你不指定一个LINES子句Q缺省g如果你这样写的相同:(x)
LINES TERMINATED BY '\n'
换句话说Q缺省值导致读取输入时QLOAD DATA INFILE表现如下Q?
在换行符处寻找行边界
在定位符处将行分q字D?
不要期望字段׃Q何引号字W封?
由“\”开头的定位W、换行符?#8220;\”解释是字D值的部分字面字符
相反Q缺省值导致在写入输出ӞSELECT ... INTO OUTFILE表现如下Q?
在字D之间写定位W?
不用M引号字符装字段
使用“\”转义出现在字D中的定位符、换行符?#8220;\”字符
在行֤写换行符
注意Qؓ(f)了写入FIELDS ESCAPED BY '\\'Q对作ؓ(f)一条单个的反斜U被d的|你必L?条反斜线倹{?
IGNORE number LINES选项可被用来忽略在文件开始的一个列名字的头Q?
mysql> LOAD DATA INFILE "/tmp/file_name" into table test IGNORE 1 LINES;
当你与LOAD DATA INFILE一起用SELECT ... INTO OUTFILE一个数据库的数据写q一个文件ƈ且随后马上将文gd数据库时Q两个命令的字段和处理选项必须匚wQ否则,LOAD DATA INFILE不能正解释文件的内容。假定你使用SELECT ... INTO OUTFILE由逗号分隔的字D写入一个文Ӟ(x)
mysql> SELECT * FROM table1 INTO OUTFILE 'data.txt'
FIELDS TERMINATED BY ','
FROM ...
Z由逗号分隔的文件读回来Q正的语句是Q?
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
FIELDS TERMINATED BY ',';
相反Q如果你试图用下面显C的语句d文gQ它不会(x)工作Q因为它命o(h)LOAD DATA INFILE在字D之间寻扑֮位符Q?
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE table2
FIELDS TERMINATED BY '\t';
可能的结果是每个输入行将被解释ؓ(f)单个的字Dc?/p>
LOAD DATA INFILE能被用来d从外部来源获得的文g。例如,以dBASE格式的文件将有由逗号分隔q用双引号包围的字段。如果文件中的行由换行符l止Q下面显C的命o(h)说明你将用来装蝲文g的字D和行处理选项Q?
mysql> LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';
M字段或行处理选项可以指定一个空字符?'')。如果不是空QFIELDS [OPTIONALLY] ENCLOSED BY和FIELDS ESCAPED BY值必L一个单个字W。FIELDS TERMINATED BY和LINES TERMINATED BY值可以是过一个字W。例如,写入由回车换行符对(CR+LFQ终止的行,或读取包含这栯的一个文Ӟ指定一个LINES TERMINATED BY '\r\n'子句?
FIELDS [OPTIONALLY] ENCLOSED BY控制字段的包围字W。对于输?SELECT ... INTO OUTFILE)Q如果你省略OPTIONALLYQ所有的字段由ENCLOSED BY字符包围。对于这L(fng)输出的一个例?使用一个逗号作ؓ(f)字段分隔W?昄在下面:(x)
"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"
如果你指定OPTIONALLYQENCLOSED BY字符仅被用于包围CHAR和VARCHAR字段Q?
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a string containing a \", quote and comma",102.20
注意Q一个字Dg的ENCLOSED BY字符的出现通过用ESCAPED BY字符作ؓ(f)其前~来{义。也要注意,如果你指定一个空ESCAPED BY|可能产生不能被LOAD DATA INFILE正确d的输出。例如,如果转义字符为空Q上面显C的输出昄如下。注意到在第四行的第二个字段包含跟随引号的一个逗号Q它(错误?好象要终止字D:(x)
1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a " quote",102.20
4,"a string containing a ", quote and comma",102.20
对于输入QENCLOSED BY字符如果存在Q它从字D值的N被剥厅R(不管是否指定OPTIONALLY都是q样QOPTIONALLY对于输入解释不v作用)由ENCLOSED BY字符领先的ESCAPED BY字符出现被解释ؓ(f)当前字段值的一部分。另外,出现在字D中重复的ENCLOSED BY被解释ؓ(f)单个ENCLOSED BY字符Q如果字D|w以该字W开始。例如,如果ENCLOSED BY '"'被指定,引号如下处理Q?
"The ""BIG"" boss" -> The "BIG" boss
The "BIG" boss -> The "BIG" boss
The ""BIG"" boss -> The ""BIG"" boss
FIELDS ESCAPED BY控制如何写入或读出特D字W。如果FIELDS ESCAPED BY字符不是I的Q它被用于前~在输Z的下列字W:(x)
FIELDS ESCAPED BY字符
FIELDS [OPTIONALLY] ENCLOSED BY字符
FIELDS TERMINATED BY和LINES TERMINATED BY值的W一个字W?
ASCII 0Q实际上后l{义字W写?ASCII'0'Q而不是一个零值字节)
如果FIELDS ESCAPED BY字符是空的,没有字符被{义。指定一个空转义字符可能不是一个好LQ特别是如果在你数据中的字段值包含刚才给出的表中的Q何字W?
对于输入Q如果FIELDS ESCAPED BY字符不是I的Q该字符的出现被剥去q且后箋字符在字面上作ؓ(f)字段值的一个部分。例外是一个{义的“0”?#8220;N”Q即Q\0或\NQ如果{义字W是“\”)。这些序列被解释为ASCII 0Q一个零值字节)和NULL。见下面关于NULL处理的规则?
对于更多关于“\”- 转义句法的信息,在某些情况下Q字D和行处理选项怺作用Q?
如果LINES TERMINATED BY是一个空字符串ƈ且FIELDS TERMINATED BY是非I的Q行也用FIELDS TERMINATED BYl止?
如果FIELDS TERMINATED BY和FIELDS ENCLOSED BY值都是空?'')Q一个固定行(非限定的)格式被用。用固定行格式,在字D之间不使用分隔W。相反,列值只用列?#8220;昄”宽度被写入和d。例如,如果列被声明为INT(7)Q列的g?个字W的字段被写入。对于输入,列值通过d7个字W获得。固定行格式也媄响NULL值的处理Q见下面。注意如果你正在使用一个多字节字符集,固定长度格式不工作?
NULL值的处理有多U,取决于你使用的FIELDS和LINES选项Q?
对于~省FIELDS和LINES|对输出,NULL被写成\NQ对输入Q\N被作为NULLd(假定ESCAPED BY字符?#8220;\”)?
如果FIELDS ENCLOSED BY不是I的Q包含以文字词的NULL作ؓ(f)它的值的字段作ؓ(f)一个NULLDd(q不同于包围在FIELDS ENCLOSED BY字符中的字NULLQ它作ؓ(f)字符?NULL'd)?
如果FIELDS ESCAPED BY是空的,NULL作ؓ(f)字NULL被写入?
用固定行格式(它发生在FIELDS TERMINATED BY和FIELDS ENCLOSED BY都是I的时?QNULL作ؓ(f)一个空字符串被写入。注意,在写入文件时Q这DNULL和空字符串在表中不能区分Q因Z们都作ؓ(f)I字W串被写入。如果在d文g旉要能区分q两者,你应该不使用固定行格式?
一些不被LOAD DATA INFILE支持的情况:(x)
固定长度的行(FIELDS TERMINATED BY和FIELDS ENCLOSED BY都ؓ(f)I?和BLOB或TEXT列?
如果你指定一个分隔符与另一个相同,或是另一个的前缀QLOAD DATA INFILE不能正确地解释输入。例如,下列FIELDS子句导致问题:(x)
FIELDS TERMINATED BY '"' ENCLOSED BY '"'
如果FIELDS ESCAPED BY是空的,一个包含跟随FIELDS TERMINATED BYg后的FIELDS ENCLOSED BY或LINES TERMINATED BY的字D值将使得LOAD DATA INFILEq早地终止读取一个字D|行。这是因为LOAD DATA INFILE不能正确地决定字D|行值在哪儿l束?
下列例子装蝲所有persondata表的行:(x)
mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
没有指定字段表,所以LOAD DATA INFILE期望输入行对每个表列包含一个字Dc用缺省FIELDS和LINES倹{?
如果你希望仅仅装载一张表的某些列Q指定一个字D表Q?
mysql> LOAD DATA INFILE 'persondata.txt'
INTO TABLE persondata (col1,col2,...);
如果在输入文件中的字D顺序不同于表中列的序Q你也必L定一个字D表。否则,MySQL不能知道如何匚w输入字段和表中的列?
如果一个行有很的字段Q对于不存在输入字段的列被设|ؓ(f)~省倹{?/p>
如果字段值缺省,I字D值有不同的解释:(x)
对于字符串类型,列被讄为空字符丌Ӏ?
对于数字cdQ列被设|ؓ(f)0?
对于日期和时间类型,列被讄cd的适当“?#8221;倹{?
如果列有一个NULLQ或(只对W一个TIMESTAMP?在指定一个字D表Ӟ如果TIMESTAMP列从字段表省掉,TIMESTAMP列只被设|ؓ(f)当前的日期和旉?
如果输入行有太多的字D,多余的字D被忽略q且警告数字??
LOAD DATA INFILE认ؓ(f)所有的输入是字W串Q因此你不能像你能用INSERT语句的ENUM或SET列的方式使用数字倹{所有的ENUM和SET值必M为字W串被指定!
如果你正在用C APIQ当LOAD DATA INFILE查询完成Ӟ你可通过调用API函数mysql_info()得到有关查询的信息。信息字W串的格式显C在下面Q?
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
当值通过INSERT语句插入Ӟ在某些情况下出现警告Q除了在输入行中有太或太多的字D|QLOAD DATA INFILE也生警告。警告没?a title="存储" style="color: #000000" target="_blank">存储在Q何地方;警告数字仅能用于表明一切是否顺利。如果你得到警告q且惌切知道你ؓ(f)什么得C们,一个方法是使用SELECT ... INTO OUTFILE到另外一个文件ƈ且把它与你的原版输入文g比较?/p>
解决Ҏ(gu)Q?br>'www.knowsky.com
启动SQLSERVER企业理器,选择要进行认证模式设|的服务器。右击该服务器,在弹单中选择属性,SQL SERVER弹出属性对话框
在属性对话框中选择安全性选项Q在w䆾验证处选择“SQL Server和W(xu)indows”Q然后确定?
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
10 = 每页记录?/p>
20 = (当前?+ 1) * 每页记录?/p>
以上语句卛_以实现分,但是最后取出的l果排序是升序,如果需要结果集为降序(例如旉Q,则有两种Ҏ(gu)可以处理
1.使用以下语句Q但效率可能要降低一?/p>
select * from 表名 b, (select top 10 主键字段,排序字段 from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a order by 排序字段 ) c where b.主键字段 = c.主键字段 order by c.排序字段 desc
2.在ado里处?记录集游标Ud最后,然后前移
''以下为asp范例
set rsTemp = Server.CreateObject("adodb.recordset")
rsTemp.Open 语句,conn,1,1
rsTemp.MoveLast
for i = 1 to rsTemp.RecordCount
'取?...
rsTemp.MovePrevious
next
l测试,以上分页Ҏ(gu)比用(f)时表分页速度q要快,q且单易?
Ҏ(gu)二:(x)
大数据量下的分页
对于非常大的数据模型而言Q分|索时Q每ơ都加蝲整个数据源非常浪贏V通常的选择是检索页面大的块区的数据,而非索所有的数据Q然后单步执行当前行?/font>
本文演示ASP.net的DataGrid和Sql Server 实现大数据量下的分页Qؓ(f)了便于实现演C,数据表采用了Northwind数据库的Orders表(830条记录)?/font>
如果数据表中有唯一的自增烦引,q且q个字段没有出现断号现象。检索页面大的块区数据非常简单了。通过单的Sql语句可以实现这个功能:(x)
select * from orders where orderid between 10248 and 10253 |
其中Q开始编号ؓ(f)Q?font face="宋体">(CurrentPageIndex - 1) * PageSize l束~号为:(x)CurrentPageIndex * PageSize
当然Q如果这个字D|号不是很严重Q而且允许不是很严格的按照每页条数分页Q这L(fng)Ҏ(gu)也是可以用的?/font>
如果q个字段断号Q或者需要按照其他条件排序分,p复杂些了。首先要获得q个面需要显C的~号Q然后再按照q个~号获得需要的块区数据。根据编可得块区数据很单。不q用下面方式获得数据排序q不是按照指定的id列表序Q这时候还要附加order by 命o(h)?
select * from orders where orderid in (10248,10249,10250,10251,10252,10253) order by orderid desc |
获得q个面需要显C的~号列表复杂多了,而且有多U方案:(x)
Ҏ(gu)一Q维护一个表Q这个表记录需要显C的q些~号排序序。(q个表可以是临时表,也可以是物理表)。下面演CZ利用一个全局临时表。这个全局临时表记录需要显C的~号。注意排序,q里的order by 是需要显C的排序序?/font>
create table ##temptable(iid int IDENTITY (1, 1) NOT NULL,mainid int NOT NULL)insert ##temptable(mainid) select OrderID from orders order by OrderID descselect * from ##temptabledrop table ##temptable -- 实际执行时候,删除全部临时表当然不再这里执行?/pre> |
q个临时表存在,获得指定分页的分块数据就很简单了。看下面代码Q?/font>
create table ##temptable(iid int IDENTITY (1, 1) NOT NULL,mainid int NOT NULL)insert ##temptable(mainid) select OrderID from orders order by OrderID descdeclare @PageSize int,@CurrPage int,@strSQL varchar(2000),@IDStr varchar(1000)select @PageSize = 30select @CurrPage = 2select @IDStr = ''select @IDStr = @IDStr + ltrim(rtrim(str(MainID))) + ',' from ##temptable where iid between ((@CurrPage-1)*@PageSize+1) and @CurrPage*@PageSizeif @IDStr <> '' begin select @IDStr = left(@IDStr,len(@IDStr)-1)endselect @strSQL = 'select * from orders where OrderID in ('+@IDStr+') order by OrderID desc 'exec(@strSQL)drop table ##temptable |
注意Q实际用这个方案的时候,q要考虑何时更新q个全局临时表,一般是攑ֈ计划d中,定时更新q个汇总表?/font>
Ҏ(gu)二:(x)每次都去查询Q每ơ获得最新的~号序。由于这时候不存在q个临时表,书写获得需要显C页面的~号的字W串需要点技巧,看下面的代码Q?/font> ASP.net ?DataGrid 提供了用这U分区的数据的方法?/font> DataGrid 通过 AllowCustomPaging ?VirtualItemCount 属性支持块区操作。如?AllowCustomPaging ?trueQ则 DataGrid 不会(x)Ҏ(gu) CurrentPageIndex 计算数据模型中的起始昄位置。DataGrid 显C数据模型中的所有数据,而页D栏将当前位置报告?(VirtualItemCount+PageSize-1)/PageSize ?CurrentPageIndex c下面的CZ说明此功能?/font>
declare @PageSize int,@CurrPage int,@topnum int,@previous intselect @PageSize = 30select @CurrPage = 2select @topnum = @CurrPage * @PageSizeselect @previous = (@CurrPage - 1) * @PageSizedeclare @i int,@IDStr nvarchar(500),@strSQL nvarchar(1000)select @i = 0select @strSQL = N''select @strSQL = @strSQL + N' select top '+str(@topnum)+ ' @i = @i + 1 'select @strSQL = @strSQL + N', @IdStr = 'select @strSQL = @strSQL + N'case when @i > '+str(@previous)+' then @IdStr + ltrim(rtrim(str(OrderID))) + '','' 'select @strSQL = @strSQL + N'else N''''end 'select @strSQL = @strSQL + N'from Orders 'select @strSQL = ltrim(rtrim(@strSQL)) + N' order by OrderID desc 'Select @IdStr = N''exec sp_executesql @strSQL,N'@i int,@IdStr varchar(500) output',@i,@IdStr outputif len(rtrim(ltrim(@IdStr))) > 0begin select @IdStr = left(@IdStr,len(@IdStr)-1)endselect @strSQL = 'select * from orders where OrderID in ('+@IDStr+')'exec(@strSQL) |
protected void BindDataGrid(int currpage) { string strConn = "Data Source=(local);Integrated Security=SSPI;database=Northwind"; // L(fng)?机器?ASPNET 用户可以讉KNorthwind数据? SqlCommand cmd = new SqlCommand(); SqlConnection conn = new SqlConnection(strConn); SqlParameter[] parms = new SqlParameter[] { new SqlParameter("@PageSize",SqlDbType.Int), new SqlParameter("@CurrPage",SqlDbType.Int), new SqlParameter("@SearchSql",SqlDbType.NVarChar,128), new SqlParameter("@Count",SqlDbType.Int), }; parms[0].Value = DataGrid1.PageSize; parms[1].Value = (currpage+1); // 数据库的分页法W一|1 DataGrid的第一|0 parms[2].Value = DBNull.Value; parms[3].Direction = ParameterDirection.Output; parms[3].Value = DBNull.Value; DataSet DS = new DataSet(); try { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = "Selected_Page_List"; cmd.CommandType = CommandType.StoredProcedure; if (parms != null) { foreach (SqlParameter parm in parms) cmd.Parameters.Add(parm); } SqlDataAdapter DA = new SqlDataAdapter(cmd); DA.Fill(DS); int aa = Convert.ToInt32(parms[3].Value.ToString()); cmd.Parameters.Clear(); if (currpage == 0) { DataGrid1.VirtualItemCount = aa; } DataGrid1.CurrentPageIndex = currpage; DataGrid1.DataSource = DS; DataGrid1.DataBind(); } catch(Exception ewx) { conn.Close(); Response.Write (ewx.Message.ToString()); Response.End(); } } void Page_Load(Object sender, EventArgs E ) { if (!IsPostBack) { BindDataGrid(0); // W一ơ打开q个面Q访问分늚W一? } } void MyDataGrid_Page(Object sender, DataGridPageChangedEventArgs e) { BindDataGrid(e.NewPageIndex); } |
如果你有更多数据量的表稍加修改,也可以用本演示E序。其下是演示代码下蝲Q演CZ码用的是方案二。用方法看readme.txt文g?/font>
整个演示代码 下蝲
http://chs.gotdotnet.com/quickstart/aspplus/samples/webforms/ctrlref/webctrl/datagrid/doc_datagrid.aspx#paging
q里演示了利?font face="宋体">DataGrid 的这个功?没有本文中讨论的利用存储q程获得分区数据)。如对DataGrid的这个功能不太熟(zhn),请先看这里?/font>
Ҏ(gu)?
虽然 DataGrid 控g自己带了一个分处理机Ӟ但它是将W合查询条g的所有记录读入内存,然后q行分页昄的。随着W合条g的记录数目增多,׃(x)出现q行效率问题Q或者至是资源的利用率下降?/p>
下面的代码示例都以下面的表结构ؓ(f)准:(x)
Articles ?/td> | SQL Server cd | Oracle cd | |
PK | Id | int (自增) | number(9) (插入时在当前最大g?) |
Author | nvarchar(10) | nvarchar2(10) | |
Title | nvarchar(50) | nvarchar2(50) | |
PubTime | datetime | date |
SQL Server / Access {微软品中Q我们通常的自定义分页有两U思\Q?/p>
一U是?ASP.NET Forum Z表的、“(f)时表”方法:(x)卛_存储q程中徏立一个(f)时表Q该临时表包含一个序号字D(1Q?Q?Q?...Q以?qing)表的主键(其他能够唯一定一行记录的字段也是可以的)字段。存储过E可能如下:(x)Q编?SS1Q?/font>
另一U可能更适合E序中“拼凑?SQL 语句Q用两次 TOP 命o(h)取得我们所要的分页数据Q例如:(x)Q编?SS2Q?/font>
q个的想法就是“掐头去䏀,q有不少分页的方法,q里׃一一列出了?/p>
对于 Oracle 数据库,有几处不同严重妨了上面几个Ҏ(gu)的实施,比如QOracle 不支?TOP 关键字:(x)不过q个好像q不十分严重Q因为它提供?rownum q个隐式游标Q可以实C TOP cM的功能,如:(x)
要写?/p>
rownum 是记录序P1Q?Q?...Q,但有一个比较麻烦的事情是:(x)如果 SQL 语句中有 ORDER BY ... 排序的时候,rownum 居然是先“标号”后排序Q这Pq个序号如果不加处理是不合乎使用需求的?/p>
至于临时表,Oracle 的(f)时表?SQL Server 的有很大不同Q我q没搞懂q个东西Q就不妄加揣了?/p>
国内|站中介l?Oracle 分页的资料很,我找C一个国外站点(www.faqts.comQ的一?FAQQ根据这文章的介绍Q可以如下分:(x)Q编?Ora1Q?/font>
其中蓝色部分可以改ؓ(f)L的、需要的 SQL SELECT 语句Q这点倒是挺方便的?/p>
Ҏ(gu)?
今天H然发现QOracle原来可以q样实现分页功能Q?br />
select * from (select rownum rdd,field1,field2 from t_table where rownum<=400) where rdd>200
上述语句实现了从W?01条记录开始处?00条记?/p>
1、sql.Date
sql包中的日期类Date是util包中Datecȝ子类Q实际上也是util.Datecȝ子集。它只处理年月日Q而忽略小时和分秒Q用以代表SQL的DATE信息?/span>
Datecȝ构造方法ؓ(f)Q?/span>
public Date(int year, int mouth, int day)
其中参数格式?span lang="EN-US">util.Datecȝ构造方法一Pq参Cؓ(f)所需讑֮的年份减?900所得的整数|月参Cؓ(f)0?1Q日参数??1。如1998q??3日所对应创徏日期cȝҎ(gu)调用为:(x)
Date d=new Date(98,0,23);
Datec还提供两个与StringcM相{换的Ҏ(gu)Q分别是Q?/span>
public static Date valueOf(String s)
字W串cd数{换ؓ(f)日期cd象。其?span lang="EN-US">Stringcd数S的格式ؓ(f)“年-?日”,加?997-04-12”?/span>
public String toString()
日期类对象转换?span lang="EN-US">Stringcd象表C,同样采用“年-?日”的格式?/span>
2、sql.Time
该类?span lang="EN-US">util.Datecȝ子类Q也是它的一个子集。在Timec里Q只处理时和分U,代表SQL的TIMEcd。它与sql.Date合v来才表示完整的util.DatecM息?/span>
Timecȝ构造方法ؓ(f)Q?/span>
public Time(int hour,int minute,int second)
其中时参数gؓ(f)0?3Q分U参数取值均??9?/span>
?span lang="EN-US">sql.Date一PTimecM定义了两个与StringcM相{换的函数ValueOf和String。不同的是Stringcd象的格式为“小Ӟ(x)分:(x)U”,如?2Q?6Q?6”?/span>
3、sql.Timestamp
q个cM?span lang="EN-US">util.Datecȝ子类Q其中除了包含年月日、小时和分秒和信息之外,q加入了U秒信息(nanosecond)Q?U秒?毫微U。Timestampcȝ来代表SQL旉?Timestamp)cd信息?/span>
Timestampcȝ构造方法ؓ(f)Q?/span>
public Timestamp(int year, int mouth, int date, int hour, int minute, int second, int nano)其中U秒参数的取g0?99,999,999Q其余各参数同前?/span>
Timestampcȝ别定义了讄和获得纳U信息的Ҏ(gu)Q分别是
public getnanos()
获取旉戳的U秒部分
public void setNanos(int n)
以给定数D|时间戳的纳U部?/font>
4、sql.Types
TypescLObjectcȝ直接子类。在q个cM以静态常量的形式定义了可使用的SQL的数值类型。所有这些类型常量都以前~
public final static int
的Ş式标明是公有静态整敎ͼ且不可改动。具体的cd名和含义如表11.1所C。其中OTHER用来代表数据库定义的Ҏ(gu)数据Q可以用getObject或setObjectҎ(gu)其映射Z个Java的Object对象?/span>
?span lang="EN-US">11.1 Types中定义的SQLcd
cd?/span> |
含义 |
BIGINT |
长整型数 |
BINARY |
二进制数 |
BIT |
比特?/span> |
CHAR |
字符?/span> |
DATE |
日期?/span> |
DECIMAL |
十进制数 |
DOUBLE |
双精度数 |
FLOAT |
点?/span> |
INTEGER |
整数 |
LONGVARBINARY |
可变长型二进制数 |
LONGVARCHAR |
可变长型字符 |
NULL |
I类?/span> |
NUMERIC |
数值型 |
OTHER |
其他cd |
REAL |
实数 |
SMALLINT |
短整?/span> |
TIME |
旉cd |
TIMESTAMP |
旉戳类?/span> |
TINYINT |
微整?/span> |
VARBINARY |
可变二进制数 |
VARCHAR |
可变字符?/span> |
二?span lang="EN-US">SQL与Java
׃SQL数据cd与Java的数据类型不一_(d)因而在使用Javacd的应用程序与使用SQLcd的数据库之间Q需要某U读写类型{换机制。实际上我们前面介绍的ResultSetcȝ“get”系列方法,Statement?qing)其子类的“set“系列方法和registerOutParameterҎ(gu)Q都是这一转换机制的组成部分?/span>
需要进行的d转换包括三种情况Q?/font>
W一U情冉|从数据库中读取数值后Q存攑֜ResultSet对象中的是SQLcd的数据。而调用“get”系列方法时QJDBC才将SQLcd转换为指定的Javacd 。在一般情形下Q?span lang="EN-US">SQLcd相对应的Javacd如表11-2所C?/span>
?span lang="EN-US">11.2 SQLcd一般所对应的Javacd
SQL type |
Java type |
CHAR |
java.lang.String |
VARCHAR |
java.lang.String |
LONGVARCHAR |
java.lang.String |
NUMERIC |
java.lang.Bignum |
DECIMAL |
java.lang.Bignum |
BIT |
boolean |
TINYINT |
byte |
SMALLINT |
short |
INTEGER |
int |
BIGINT |
long |
REAL |
float |
FLOAT |
double |
DOUBLE |
double |
BINARY |
byte[] |
VARBINARY |
byte[] |
LONGVARBINARY |
byte[] |
DATE |
java.sql.Date |
TIME |
java.sql.Time |
TIMESTAMP |
java.sql.Timestamp |
当然Q在使用时用户可以指定将SQLcd转换为某个需要的特定cd而不遵@?1.2。例如在l果集中的某个FLOAT型数|依标准{换应用用getDoubleҎ(gu)获取Q但实际上按用户的不同需求也可以使用getFloatQgetIntQ甚至gefByteҎ(gu)获取Q但只是有可能媄响数值精度?/span>