﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;b&gt;BeanSoft's Java Blog&lt;/b&gt;-随笔分类-Database</title><link>http://www.blogjava.net/beansoft/category/21451.html</link><description>免费电子书/视频&lt;a href="http://www.blogjava.net/beansoft/archive/2008/08/17/222589.html"&gt;《MyEclipse 6 Java 开发中文教程》&lt;/a&gt;作者刘长炯官方博客  专注于 Java 企业级应用</description><language>zh-cn</language><lastBuildDate>Fri, 06 Nov 2009 15:58:57 GMT</lastBuildDate><pubDate>Fri, 06 Nov 2009 15:58:57 GMT</pubDate><ttl>60</ttl><item><title>MySQL实现的判断文本是否为数字的函数IsNum</title><link>http://www.blogjava.net/beansoft/archive/2009/10/22/299354.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Thu, 22 Oct 2009 06:15:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2009/10/22/299354.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/299354.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2009/10/22/299354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/299354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/299354.html</trackback:ping><description><![CDATA[
		<p>参考资料: 关于对MYSQL存储过程传递参数是纯数字还是字符串的判断 来源：CSDN   作者：逆风   发布时间：2007-12-26   </p>
		<p>
		</p>
		<p> </p>
		<p>作者加了部分改进:</p>
		<p> </p>
		<p>DELIMITER $$ 
</p>
		<p>DROP FUNCTION IF EXISTS `IsNum` $$<br />CREATE FUNCTION `IsNum` (str VARCHAR(25)) RETURNS INT<br />BEGIN<br />DECLARE iResult INT DEFAULT 0; 
</p>
		<p>IF ISNULL(str) THEN return 0; END IF;-- NULL 字符串 
</p>
		<p>IF str = '' THEN return 0; END IF;-- 空字符串 
</p>
		<p>SELECT str REGEXP '^[0-9]*$' INTO iResult;<br />IF iResult = 1 THEN<br />RETURN 1;<br />ELSE<br />RETURN 0;<br />END IF;<br />END $$ 
</p>
		<p>DELIMITER ; 
</p>
		<p>/* 关于 delimiter 的说明请查看文档 MySQL 中函数定义中 delimiter的说明<br />这个函数用来判断给定的字符串是否为函数, 用法示例: 
</p>
		<p>select IsNum('12'); -- 结果为 1<br />select IsNum('12-'); -- 结果为 0 
</p>
		<p>select IsNum(说明) from TABLE_XX<br />*/</p>
<img src ="http://www.blogjava.net/beansoft/aggbug/299354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2009-10-22 14:15 <a href="http://www.blogjava.net/beansoft/archive/2009/10/22/299354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL用触发器实现日志记录</title><link>http://www.blogjava.net/beansoft/archive/2009/05/26/278027.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Tue, 26 May 2009 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2009/05/26/278027.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/278027.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2009/05/26/278027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/278027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/278027.html</trackback:ping><description><![CDATA[<p>CREATE TRIGGER news_log AFTER INSERT ON news;</p> <p><br>FOR EACH ROW INSERT INTO `news_logs` select *, now() from news where newsid =&nbsp; (select max(newsid ) from news);</p> <p>&nbsp;</p> <p>DROP TRIGGER news_log ;</p> <p>&nbsp;</p> <p>一共两个表，一个是原始表 news，一个是日志表news_logs(多了一列日期)，可以实现新插入时自动记录日志，不用写代码了。 类似还可以实现更新时插入更新日志，详情可查看 MySQL 的文档。</p><img src ="http://www.blogjava.net/beansoft/aggbug/278027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2009-05-26 16:06 <a href="http://www.blogjava.net/beansoft/archive/2009/05/26/278027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新闻: TopLink 完成开源项目转换 TopLink Completes Transition to Open Source</title><link>http://www.blogjava.net/beansoft/archive/2008/07/11/214348.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Fri, 11 Jul 2008 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2008/07/11/214348.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/214348.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2008/07/11/214348.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/214348.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/214348.html</trackback:ping><description><![CDATA[<p></p> <p>大家学习过JPA的可能都耳闻了TopLink Essentials, 这个是个简化版的TopLink产品,也许迫于Hibernate的压力,据称是业界性能第一的TopLink终于改名为 EclipseLink 并完成了开源项目转换步骤. 其对JPA是完全支持, 尤其是对自家产品Oracle支持的更佳.</p> <p>&nbsp;</p> <p>来自 JavaLobby 的新闻:</p> <p>&nbsp;</p> <p><strong>TopLink Makes the Transition to Open Source</strong><br>By Doug Clarke <p><a href="http://www.eclipse.org/eclipselink">The Eclipse Persistence Services project (EclipseLink)</a> has completed its incubation phase and the 1.0 release is available for <a href="http://www.eclipse.org/eclipselink/downloads/index.php">download</a>. This release completes the transition of the persistence functionality developed in Oracle TopLink to being fully developed and maintained as an open source project at Eclipse. This also signifies the first release of a project under the recently created top-level Runtime (RT) project at Eclipse. <p>EclipseLink delivers persistence services for efficiently working with Java and relational, XML, and non-relational data sources. The highlights include: <ul> <li>Compact: Standard Java distribution is composed of a single implementation jar and utility jars that can be used in any Java SE, IDE, or Java EE hosted environment.  <li>OSGi: EclipseLink is also available as a set of OSGi bundles. This distribution offers out of the box support for compliant OSGi implementations, as well as Equinox-specific extensions.  <li>JPA: Superior Java Persistence API 1.0 implementation with many advanced features offering greater flexibility and performance for mapping, caching, querying and transaction processing.  <li>MOXy: Object-XML binding support with JAXB, offering highly flexible mappings as well as a meet in the middle configuration approach.  <li>SDO: Service Data Objects 2.1 implementation enabling flexible service integration with dynamic and static models.  <li>Utils: Migration utilities to assist developers currently using Oracle TopLink or TopLink Essentials in their upgrade to EclipseLink as well as the workbench for compatibility with classic object-relational and object-XML mapping. </li></ul> <p>A complete index of features and the full user documentation for EclipseLink is available on the <a href="http://wiki.eclipse.org/EclipseLink">Eclipse wiki</a>. <p><strong>Standards Focused</strong><br>The mandate of the EclipseLink project is to deliver a set of persistence services that leverage the leading Java standards. In addition, advanced features were added based on user requests but implemented in a way that allows developers to leverage them when needed but not be obstructed by them when they are not needed. <p>This is particularly true in JPA, where many advanced features are available through JPA persistence unit properties and query hints, in addition to custom annotations and XML. With EclipseLink replacing TopLink Essentials as the reference implementation for JPA 2.0, some of these advanced features will evolve into the specification defined metadata and interfaces. This approach of leading through delivery of advanced functionality, and then contributing back to the standards, is an important aspect of the EclipseLink project. <p><strong>Growing The Community</strong><br>The EclipseLink committers understand very well that developing in open source is much more than just providing access to the source code. Building a successful open source project is really about building an active community based on open communication and a transparent development process. We encourage the Java community to try out the 1.0 EclipseLink release and provide feedback. Your contributions and suggestions are valuable to us and will help ensure the project meets your current and future needs. <p>EclipseLink is currently available directly from the EclipseLink project web site and is also included within the GlassFish and Spring Framework distributions. Going forward, the Oracle TopLink product releases within the Oracle WebLogic Server will also include EclipseLink as its strategic persistence provider. <p>At present the project has committers from Oracle and Sun but we also have a growing community of users and developers contributing back enhancements. We are eager to expand this community on all fronts to establish the EclipseLink project as the leading persistence solution across Java EE, Java SE, and OSGi.  <p>Until Next Time,<br>Doug Clarke<br><a href="http://www.eclipse.org/eclipselink">http://www.eclipse.org/eclipselink</a><img src ="http://www.blogjava.net/beansoft/aggbug/214348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2008-07-11 22:47 <a href="http://www.blogjava.net/beansoft/archive/2008/07/11/214348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL 6 绿色精简BAT版 2.24 MB 下载(地址更新)</title><link>http://www.blogjava.net/beansoft/archive/2008/07/03/212239.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Thu, 03 Jul 2008 00:54:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2008/07/03/212239.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/212239.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2008/07/03/212239.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/212239.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/212239.html</trackback:ping><description><![CDATA[
		<p>作为一名开发人员,我对绿色小软件情有独钟,因为用起来方便快捷嘛,便于携带,易于在演示系统中使用,开发时可立即进入状态.  下载地址: <a href="http://beansoft.java-cn.org/download/mysql6green.7z">http://beansoft.java-cn.org/download/mysql6green.7z</a> 2.24 MB 下载后用 7Zip, WinRAR 最新版等软件解压缩即可.</p>
		<p>以下是详细说明:</p>
		<h3 align="center">MySQL 6 绿色精简版(BAT版本)</h3>
		<p align="center">By <a href="mailto:BeanSoft(beansoft@126.com">BeanSoft(beansoft@126.com</a>) 2008-07-02<br /><a href="http://beansoft.blogjava.net/">http://beansoft.blogjava.net/</a></p>
		<p>    MySQL 6 支持外键,视图存储过程,事务等功能(绿色精简版测试通过,支持这些功能),非常方便进行开发(尤其是MyEclipse生成一对多,多对多的Hibernate/JPA映射代码,就更方便快捷了,事务功能则可以检验Hibernate或者Spring整合Hibernate时是否正确处理了事务,如果失败的话会无法真正插入数据). 版本是: 6.0.5alpha. 为了方便开发,把启动后的默认编码方式设置成为了GBK.可以配合MySQL-Front或者开源软件HeidiSQL来管理数据库. 而配合免费的MySQL管理工具 导航猫免费版(Navicat Lite),可获得不低于SQL Server的易用度, 例如可视化建表, 修改表结构, 创建外键, 修改数据, 执行查询等功能,此软件的中文版可以在<a href="http://www.navicat.com.cn/download.html">http://www.navicat.com.cn/download.html</a> 下载:</p>
		<table cellspacing="0" cellpadding="0">
				<tbody>
						<tr>
								<td bgcolor="#ffffff" colspan="8">
										<div align="left">
												<img src="http://www.navicat.com/images/partners/mysql_logo.gif" />*非商业<strong> - </strong>免费精简版 </div>
								</td>
						</tr>
						<tr>
								<td align="middle">
										<div align="left">
												<strong>产品名字</strong>
										</div>
								</td>
								<td align="middle" width="72">
										<div align="left">
												<strong>版本</strong>
										</div>
								</td>
								<td align="middle" width="79">
										<div align="left">
												<strong>大小</strong>
										</div>
								</td>
								<td align="middle" colspan="5">
										<div align="left">
												<strong>下载</strong>
										</div>
								</td>
						</tr>
						<tr valign="top" align="left">
								<td bgcolor="#ffffff" height="55">
										<p>Navicat for MySQL<strong> 简体中文</strong><br />(Windows版)<br /><strong>*非商业</strong>使用</p>
								</td>
								<td width="72" bgcolor="#ffffff">8.0.27</td>
								<td width="79" bgcolor="#ffffff">7.7 MB </td>
								<td width="78" bgcolor="#ffffff">
										<a href="http://www.navicat.com/download/navicat8lite_mysql_cs.exe" target="_blank">
												<img height="30" src="http://www.navicat.com/images/download.gif" width="30" border="0" />
										</a>
										<a href="http://www.navicat.com/download/navicat8lite_mysql_cs.exe" target="_blank">
												<br />地址1</a>
										<br />
								</td>
								<td width="94" bgcolor="#ffffff">
										<a href="http://www.mysqlstudio.com/download/navicat8lite_mysql_cs.exe" target="_blank">
												<img height="30" src="http://www.navicat.com/images/download.gif" width="30" border="0" />
										</a>
										<br />
										<a href="http://www.mysqlstudio.com/download/navicat8lite_mysql_cs.exe" target="_blank">地址2</a>
								</td>
						</tr>
						<tr valign="top" align="left" bgcolor="#ffffff">
								<td>Navicat for MySQL <strong>英文</strong><br />(Mac OS X <strong>通用二进制</strong>)<br /><strong>*非商业</strong>使用 </td>
								<td>7.1.3</td>
								<td>6.6 MB</td>
								<td>
										<a href="http://www.navicat.com/download.php?id=2" target="_blank">
												<img height="30" src="http://www.navicat.com/images/download.gif" width="30" border="0" />
										</a>
										<a href="http://www.navicat.com/download.php?id=2" target="_blank">
												<br />地址1</a>
										<br />
								</td>
								<td>
										<a href="http://www.navicat.com/download.php?id=5" target="_blank">
												<img height="30" src="http://www.navicat.com/images/download.gif" width="30" border="0" />
										</a>
										<a href="http://www.navicat.com/download.php?id=5" target="_blank">
												<br />地址2</a>
								</td>
						</tr>
						<tr valign="top" align="left" bgcolor="#ffffff">
								<td height="63">Navicat for MySQL <strong>英文</strong><br />(Linux版)<br /><strong>* 非商业</strong>使用</td>
								<td>8.0.27</td>
								<td>20 MB</td>
								<td>
										<a href="http://www.navicat.com/download.php?id=3" target="_blank">
												<img height="30" src="http://www.navicat.com/images/download.gif" width="30" border="0" />
										</a>
										<a href="http://www.navicat.com/download.php?id=3" target="_blank">
												<br />地址1</a>
										<br />
										<br />
								</td>
								<td>
										<a href="http://www.navicat.com/download.php?id=6" target="_blank">
												<img height="30" src="http://www.navicat.com/images/download.gif" width="30" border="0" />
										</a>
										<a href="http://www.navicat.com/download.php?id=6" target="_blank">
												<br />地址2</a>
								</td>
						</tr>
				</tbody>
		</table>
		<p> </p>
		<p>MySQL 6 绿色版使用批处理(BAT)文件执行,可以随意启动停止,使用非常方便,也很容易作为开发演示或者作为最终产品的一部分发布.<br />    使用: 下载后解压缩到磁盘上的任意目录, 可以看到多出了一个 mysql6green 的目录. 打开这个目录, 有以下的几个文件:<br /></p>
		<table width="100%" border="1">
				<tbody>
						<tr>
								<td width="50%">
										<strong>文件</strong>
								</td>
								<td width="50%">
										<strong>说明</strong>
								</td>
						</tr>
						<tr>
								<td width="50%">[bin] </td>
								<td width="50%">MySQL 的二进制文件</td>
						</tr>
						<tr>
								<td width="50%">[data]</td>
								<td width="50%">MySQL 数据库文件</td>
						</tr>
						<tr>
								<td width="50%">[share]</td>
								<td width="50%">MySQL 英文资源文件</td>
						</tr>
						<tr>
								<td width="50%">mysql_start.bat</td>
								<td width="50%">启动 MySQL, 双击后如果没有错误的话可以在系统进程中看到 mysqld-nt.exe, 并且可以通过 mysql 管理工具连接上, 端口 3306, 用户名 root, 密码为空</td>
						</tr>
						<tr>
								<td width="50%">mysql_stop.bat</td>
								<td width="50%">停止 MySQL</td>
						</tr>
						<tr>
								<td width="50%">mysql绿色版.htm</td>
								<td width="50%">介绍文件</td>
						</tr>
				</tbody>
		</table>
		<p>     原理: 首先只保留了 MySQL 的最少运行文件来减少所占用的空间. 当然如果你愿意的话留下所有的 Mysql 6 程序文件也没有问题. 然后根据 mysqladmin.exe 和 mysqld-nt.exe 的命令行参数进行工作. mysqld-nt.exe --verbose --help 可以看到所有能够使用的参数.</p>
		<p>mysql_start.bat</p>
		<table width="100%" bgcolor="#c0c0c0" border="1">
				<tbody>
						<tr>
								<td width="100%">@echo off<br />@echo Mysql startup ...<br />start bin\mysqld.exe --default-character-set=gbk<br />exit</td>
						</tr>
				</tbody>
		</table>
		<p>以不需要配置文件, 默认字符集为GBK的方式来启动 Mysql.</p>
		<p>mysql_stop.bat</p>
		<table width="100%" bgcolor="#c0c0c0" border="1">
				<tbody>
						<tr>
								<td width="100%">@echo off<br />REM Mysql shutdown ...<br />bin\mysqladmin --user=root --password= shutdown</td>
						</tr>
				</tbody>
		</table>
		<p>以 root 用户连接到 MySQL 执行 shutdown 命令来关闭服务器.</p>
		<p>一些参考命令:</p>
		<p>创建存储过程:</p>
		<p>CREATE PROCEDURE `sp_family`()<br />select * from family</p>
		<p>
				<br />执行存储过程:</p>
		<p>call sp_family()</p>
<img src ="http://www.blogjava.net/beansoft/aggbug/212239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2008-07-03 08:54 <a href="http://www.blogjava.net/beansoft/archive/2008/07/03/212239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HeidiSQL便携版＋中文问题修正（重编译）</title><link>http://www.blogjava.net/beansoft/archive/2008/04/29/196994.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Mon, 28 Apr 2008 16:45:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2008/04/29/196994.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/196994.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2008/04/29/196994.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/196994.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/196994.html</trackback:ping><description><![CDATA[
		<p>下载地址 <a href="ftp://beansoftdown:1234@219.141.70.147/HeidiSQL/HeidiSQLPortable.rar " temp_href="ftp://beansoftdown:1234@219.141.70.147/HeidiSQL/HeidiSQLPortable.rar ">ftp://beansoftdown:1234@219.141.70.147/HeidiSQL/HeidiSQLPortable.rar </a>  3.21 MB 是一个免安装绿色便携版</p>
		<p>感谢 Acheng 帮忙编译了修正了中文问题后的新版本，我的MySQL字符编码都是GBK的，不知道UTF-8的会怎样。此项目是一国外开源软件。</p>
		<p>关于此Bug的修正信息，请查看这里：<a title="http://sourceforge.net/tracker/index.php?func=detail&amp;amp;amp;aid=1913280&amp;amp;amp;group_id=164593&amp;amp;amp;atid=832350" href="http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1913280&amp;group_id=164593&amp;atid=832350">http://sourceforge.net/tracker/index.php?func=detail&amp;aid=1913280&amp;group_id=164593&amp;atid=832350</a></p>
		<p>如果需要完整代码并希望自己亲手编译（需要<a href="http://www.codegear.com/downloads/free/delphi">CodeGear Delphi 2007</a> or Borland Developer Studio 2006），请与我联系。官方的编译说明：</p>
		<p>
				<a title="http://heidisql.svn.sourceforge.net/viewvc/*checkout*/heidisql/trunk/readme.html" href="http://heidisql.svn.sourceforge.net/viewvc/*checkout*/heidisql/trunk/readme.html">http://heidisql.svn.sourceforge.net/viewvc/*checkout*/heidisql/trunk/readme.html</a>
		</p>
		<p>截屏（注意红色部分，默认是不支持gbk的，已经修正了问题了）：</p>
		<p>   <a href="/images/blogjava_net/beansoft/WindowsLiveWriter/HeidiSQL_A7B/HeidiSQL_2.png"><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" border="0" alt="HeidiSQL" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/HeidiSQL_A7B/HeidiSQL_thumb.png" width="531" height="446" /></a></p>
		<p>
				<a href="http://www.heidisql.com/">http://www.heidisql.com/</a>
				<br />Heidesql -&gt; MySQL-Front 2.5 的开源替代版本<br />Heidesql 中文乱码问题的另一种解决办法：<br />用 Heidesql 连接到 Mysql 服务器后, 执行下面代码(复制到 Query 面板中然后点击运行): </p>
		<p>SET character_set_client = gbk;<br />SET character_set_connection = gbk;<br />SET character_set_results = gbk; </p>
		<p>即可解决乱码的问题.</p>
<img src ="http://www.blogjava.net/beansoft/aggbug/196994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2008-04-29 00:45 <a href="http://www.blogjava.net/beansoft/archive/2008/04/29/196994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC 访问SQL Server 2000的问题解决</title><link>http://www.blogjava.net/beansoft/archive/2008/03/11/185389.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Tue, 11 Mar 2008 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2008/03/11/185389.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/185389.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2008/03/11/185389.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/185389.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/185389.html</trackback:ping><description><![CDATA[<p>错误：[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket. </p> <p>&nbsp;</p> <p>jdbc配置语句为: jdbc:microsoft:sqlserver://server_name:1433 <br>如运行程序时出现 "Error establishing socket" 错误,则应进行如下调试:<br>1 检查SQL SERVER 是否允许远程访问.具体步骤:<br>1)打开"企业管理器",打开控制台根目录&gt;SQL Server 组&gt;数据库<br>2)在相应"数据库"上单击右键,选择"属性"<br>3)选择"连接"选项卡,检查"远程服务器连接"下,RPC服务是否选择.<br>2 使用telnet IP地址 1433,系统是否提示连接出错,如系统提示出错<br>检查是否防火墙屏蔽了SQL SERVER 或 java IDE 的网络访问端口<br>如果是,关闭防火墙,重新启动SQL SERVER和java IDE,进行测试,<br>如果系统仍提示上述错误,尝试下列步骤<br>3 检查SQL SERVER 端口号及是否启用了TCP/IP协议,具体步骤:<br>1)打开"企业管理器",打开控制台根目录&gt;SQL Server 组&gt;数据库<br>2)在相应"数据库"上单击右键,选择"属性"<br>3)选择"常规"选项卡,点击"网络配置",如启用的协议中无"TCP/IP协议"将其加入<br>4)选择"TCP/IP协议",点击"属性",检查其端口号是否为1433<br>5)如端口号为1433将其修改为其它端口号,修改jdbc连接语句,将端口号同样改为新启用的端口号,如jdbc:microsoft:sqlserver://server_name:1400(假设新端口号为 1400)<br>以下的方法你每种的去试试:<br>#检查一下sql server的connection有没有full.<br>#如果是认证的问题.<br>可到sql enterprice manager-&gt;指定server-&gt;内容-&gt;安全性.<br>把验证改为 SQL server 及 windows.<br>#点选属性检查一下port是否正确.<br>#执行%MSSQL_HOME%\80\Tools\Binn\SVRNETCN.exe<br>把TCP/IP启用.<br>#关掉防火墙.<br>#把SQL server update到sp3:<br><a href="http://www.microsoft.com/sql/downloads/2000/sp3.asp">http://www.microsoft.com/sql/downloads/2000/sp3.asp</a> <p>&nbsp; <p><img src="http://dev2dev.bea.com.cn/images/school/server030606_05/image006.jpg">  <p>参考：WebLogic中SQL Server2000的JDBC Pool配置 <a title="http://dev2dev.bea.com.cn/techdoc/200501532.html" href="http://dev2dev.bea.com.cn/techdoc/200501532.html">http://dev2dev.bea.com.cn/techdoc/200501532.html</a></p><img src ="http://www.blogjava.net/beansoft/aggbug/185389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2008-03-11 15:12 <a href="http://www.blogjava.net/beansoft/archive/2008/03/11/185389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于_JDBC_2.0_驱动的分页代码实现</title><link>http://www.blogjava.net/beansoft/archive/2007/10/23/155318.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Tue, 23 Oct 2007 08:00:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/10/23/155318.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/155318.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/10/23/155318.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/155318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/155318.html</trackback:ping><description><![CDATA[<p>这个分页代码基于 JDBC 2.0 的滚动游标的机制, 核心观念就是利用 ResultSet 类里面的 boolean absolute( int row ) throws SQLException 方法进行数据的跳转. <p>经过测试(数据小于1万条, SQL Server 2000), 这个方法比用复合 SQL 语句查询分页的方案要快很多. <p>详细 JavaDoc 如下:  <p>Moves the cursor to the given row number in this ResultSet object.  <p>If the row number is positive, the cursor moves to the given row number with respect to the beginning of the result set. The first row is row 1, the second is row 2, and so on.  <p>If the given row number is negative, the cursor moves to an absolute row position with respect to the end of the result set. For example, calling the method absolute(-1) positions the cursor on the last row; calling the method absolute(-2) moves the cursor to the next-to-last row, and so on.  <p>An attempt to position the cursor beyond the first/last row in the result set leaves the cursor before the first row or after the last row.  <p>Note: Calling absolute(1) is the same as calling first(). Calling absolute(-1) is the same as calling last().  <p>Parameters:  <p>row the number of the row to which the cursor should move. A positive number indicates the row number counting from the beginning of the result set; a negative number indicates the row number counting from the end of the result set  <p>Returns:  <p>true if the cursor is on the result set; false otherwise  <p>Throws:  <p>SQLException if a database access error occurs, or the result set type is TYPE_FORWARD_ONLY  <p>@since  <p>1.2 <div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #008000">/*</span>
<span style="color: #008000"></span>
<span style="color: #008000">* @(#)Pager.java 1.00 2004-8-12</span>
<span style="color: #008000"></span>
<span style="color: #008000">*</span>
<span style="color: #008000"></span>
<span style="color: #008000">* Copyright 2004 . All rights reserved.</span>
<span style="color: #008000"></span>
<span style="color: #008000">* PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.</span>
<span style="color: #008000"></span>
<span style="color: #008000">*/</span>

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

import java.util.Vector;

<span style="color: #008000">/**</span>
<span style="color: #008000"></span>
<span style="color: #008000">* Pager, 基于 JDBC 2.0 滚动机制的分页程序, 在 MySQL, SQLServer, Access, Oracle 下测试通过.</span>
<span style="color: #008000"></span>
<span style="color: #008000">* @author 刘长炯</span>
<span style="color: #008000"></span>
<span style="color: #008000">* @version 1.0 2004-8-12</span>
<span style="color: #008000"></span>
<span style="color: #008000">*/</span>

<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Pager {

<span style="color: #008000">/** Used database connection */</span>

Connection conn = <span style="color: #0000ff">null</span>;

<span style="color: #0000ff">public</span> Pager() {

}

<span style="color: #008000">/**</span>
<span style="color: #008000"></span>
<span style="color: #008000">* 分页功能, 返回当页的数据(JDBC 2.0 实现).</span>
<span style="color: #008000"></span>
<span style="color: #008000">* </span>
<span style="color: #008000"></span>
<span style="color: #008000">* @param currentPage</span>
<span style="color: #008000"></span>
<span style="color: #008000">* 当前页面数(取值范围: 从 1 开始有效, 0 自动改为 1)</span>
<span style="color: #008000"></span>
<span style="color: #008000">* @param pageCount</span>
<span style="color: #008000"></span>
<span style="color: #008000">* 每页显示记录数</span>
<span style="color: #008000"></span>
<span style="color: #008000">* </span>
<span style="color: #008000"></span>
<span style="color: #008000">* @return a Vector - 数据列表</span>
<span style="color: #008000"></span>
<span style="color: #008000">*/</span>

<span style="color: #0000ff">public</span> Vector pageData(<span style="color: #0000ff">int</span> currentPage, <span style="color: #0000ff">int</span> pageCount) {

Vector results = <span style="color: #0000ff">new</span> Vector();

String tableName = <span style="color: #006080">"table_name"</span>;<span style="color: #008000">// 要处理的表格名</span>

ResultSet rs = <span style="color: #0000ff">null</span>;

String sql = <span style="color: #006080">"SELECT * FROM "</span> + tableName;

Statement stmt = <span style="color: #0000ff">null</span>;

<span style="color: #0000ff">try</span> {

<span style="color: #008000">// TODO: open connection</span>

<span style="color: #008000">// 生成可滚动的结果集表达式</span>

stmt = conn.createStatement(ResultSet.

TYPE_SCROLL_SENSITIVE,

ResultSet.CONCUR_READ_ONLY);

rs = stmt.executeQuery(sql);

<span style="color: #0000ff">int</span> count = recordCount(); <span style="color: #008000">// 总记录数</span>

<span style="color: #0000ff">int</span> totalPage = (<span style="color: #0000ff">int</span>) Math.ceil(1.0 * count / pageCount); <span style="color: #008000">// 总页面数</span>

<span style="color: #0000ff">if</span> (currentPage &lt;= 0) {

currentPage = 1;

}

<span style="color: #008000">// 超出页码范围, 不返回数据</span>

<span style="color: #0000ff">if</span> (currentPage &gt; totalPage) {

currentPage = totalPage;

<span style="color: #0000ff">return</span> results;

}

<span style="color: #0000ff">if</span> ((currentPage - 1) * pageCount &gt; 0) {

<span style="color: #008000">// 移动结果集数据到当前页</span>

rs.absolute((currentPage - 1) * pageCount);

}

<span style="color: #008000">// rs.absolute(0); 在 ODBC 下会导致如下异常:java.sql.SQLException: Cursor</span>

<span style="color: #008000">// position (0) is invalid</span>

<span style="color: #0000ff">int</span> i = 0; <span style="color: #008000">// Readed pages</span>

<span style="color: #0000ff">while</span> (rs.next() &amp;&amp; i &lt; pageCount) {

i++;

<span style="color: #008000">// TODO: Read each row and process to value object</span>

ValueObject bean = <span style="color: #0000ff">new</span> ValueObject();

<span style="color: #008000">// TODO: Read value to value object</span>

result.add(bean);

}

} <span style="color: #0000ff">catch</span> (Exception exception) {

System.<span style="color: #0000ff">out</span>.println(<span style="color: #006080">"Occur a error in "</span> + getClass()

+ <span style="color: #006080">".pageData() : "</span> + exception.getMessage());

<span style="color: #008000">// exception.printStackTrace();</span>

} <span style="color: #0000ff">finally</span> {

closeJDBCResource(stmt);

closeJDBCResource(rs);

closeJDBCResource(conn);

}

<span style="color: #0000ff">return</span> results;

}

<span style="color: #008000">/**</span>
<span style="color: #008000"></span>
<span style="color: #008000">* 返回当前数据库中记录的总数.</span>
<span style="color: #008000"></span>
<span style="color: #008000">* </span>
<span style="color: #008000"></span>
<span style="color: #008000">* @return int 记录总数</span>
<span style="color: #008000"></span>
<span style="color: #008000">*/</span>

<span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> recordCount() {

<span style="color: #0000ff">int</span> allCount = -1;

String tableName = <span style="color: #006080">"table_name"</span>;<span style="color: #008000">// 要处理的表格名</span>

String sql = <span style="color: #006080">"SELECT COUNT(*) FROM "</span> + tableName;

ResultSet rs = <span style="color: #0000ff">null</span>;

Statement stmt = <span style="color: #0000ff">null</span>;

<span style="color: #0000ff">try</span> {

<span style="color: #008000">// TODO: open connection</span>

stmt = conn.createStatement();

rs = stmt.executeQuery(sql);

<span style="color: #0000ff">if</span> (rs.next()) {

allCount = rs.getInt(1);

}

} <span style="color: #0000ff">catch</span> (Exception exception) {

System.<span style="color: #0000ff">out</span>

.println(<span style="color: #006080">"Occur a error in "</span> + getClass()

+ <span style="color: #006080">".recordCount() : "</span> + exception.getMessage());

} <span style="color: #0000ff">finally</span> {

closeJDBCResource(stmt);

closeJDBCResource(rs);

closeJDBCResource(conn);

}

<span style="color: #0000ff">return</span> allCount;

}

<span style="color: #008000">/**</span>
<span style="color: #008000"></span>
<span style="color: #008000">* Close a jdbc resource, such as ResultSet, Statement, Connection.... All</span>
<span style="color: #008000"></span>
<span style="color: #008000">* these objects must have a method signature is void close().</span>
<span style="color: #008000"></span>
<span style="color: #008000">* </span>
<span style="color: #008000"></span>
<span style="color: #008000">* @param resource -</span>
<span style="color: #008000"></span>
<span style="color: #008000">* jdbc resouce to close</span>
<span style="color: #008000"></span>
<span style="color: #008000">*/</span>

<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> closeJDBCResource(Object resource) {

<span style="color: #0000ff">try</span> {

Class clazz = resource.getClass();

java.lang.reflect.Method method = clazz.getMethod(<span style="color: #006080">"close"</span>, <span style="color: #0000ff">null</span>);

method.invoke(resource, <span style="color: #0000ff">null</span>);

} <span style="color: #0000ff">catch</span> (Exception e) {

e.printStackTrace();

}

}

<span style="color: #008000">/**</span>
<span style="color: #008000"></span>
<span style="color: #008000">* Test page.</span>
<span style="color: #008000"></span>
<span style="color: #008000">* @param args</span>
<span style="color: #008000"></span>
<span style="color: #008000">*/</span>

<span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> main(String[] args) {

<span style="color: #008000">// 分页, 读取第一页数据, 共读取5个记录</span>

Vector data = <span style="color: #0000ff">new</span> Pager().pageData(1, 5);

<span style="color: #008000">// TODO: process value object, 更改类名</span>

<span style="color: #0000ff">for</span>(<span style="color: #0000ff">int</span> i = 0; results != <span style="color: #0000ff">null</span> &amp;&amp; i &lt; data.size(); i++) {

ValueObject bean = (ValueObject)data.get(i);

}

}

}
</pre></div><img src ="http://www.blogjava.net/beansoft/aggbug/155318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-10-23 16:00 <a href="http://www.blogjava.net/beansoft/archive/2007/10/23/155318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BeanSoft MySQL Java 开发套装(服务器,管理工具,JDBC驱动,示例代码) 无中文问题(下载地址已更新)</title><link>http://www.blogjava.net/beansoft/archive/2007/10/01/150075.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Mon, 01 Oct 2007 10:13:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/10/01/150075.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/150075.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/10/01/150075.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/150075.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/150075.html</trackback:ping><description><![CDATA[
		<p>BeanSoft MySQL Java 开发套装(服务器,管理工具,JDBC驱动,示例代码)</p>
		<p>小更新: 为了减轻负担, 用 MySQL-Front 2.5 来管理, 这个软件无中文问题. 如果以后开源版本HeidiSQL的解决了中文问题, 就用开源的.</p>
		<p>下载: <a href="http://gro.clinux.org/frs/download.php/2103/portable_mysql.exe"><a href="http://gro.clinux.org/frs/download.php/2105/portable_mysql.exe"><dd><a href="http://tomcatmonitor.googlecode.com/files/portable_mysql5.exe">http://tomcatmonitor.googlecode.com/files/portable_mysql5.exe</a><a href="http://gro.clinux.org/frs/download.php/2106/portable_mysql.exe"></a></dd></a></a>  4.02MB (自解压包)
</p>
		<p>
		</p>
		<p>参考文档: <a href="/beansoft/archive/2007/02/05/97940.html">MySQL 5 绿色版(BAT版本)</a><br />2007-10-01<br />版权所有 2007 刘长炯(BeanSoft@126.com)<br />Blog: <a href="/beansoft/">http://www.blogjava.net/beansoft/</a><br />本软件套装采用的协议: GPL, 参考 gpl.txt<br />Java 初学者最头疼的, 莫过于安装数据库, 寻找数据库管理工具, 寻找 JDBC 驱动, 然后编写代码来测试, 然后遇到了乱码问题, 头大的要命, 不知道如何解决. </p>
		<p>在此, 我搜集了几个开源软件, 组合到一起, 来方便大家的数据库开发. 数据库我选择 MySQL 5.0.41 绿色版(本站开发), 管理工具我选择 MySQL-Front 2.5 免费软件(这个版本可以争取显示中文), 然后选择了 MySQL JDBC 驱动, 并编写了测试代码,  这些代码解决了中文问题, 最后使用免费的 PStart 2.11 制作了启动工具. 
</p>
		<p>用法: 下载后解压缩到硬盘的任意位置, 然后双击 PStart.exe 开始, 先启动 MySQL 服务器, 然后即可编译运行 JDBC 测试代码. 
</p>
		<p>注意事项: 这个版本的 MySQL 绿色版默认采用的字符集是 GBK, 如果你修改成了别的字符集, MySQLFront 将显示为乱码. 
</p>
		<p>感谢以下软件: 
</p>
		<p>MySQL <a href="http://www.mysql.com/">http://www.mysql.com/</a> GPL 协议<br />MySQL Front 2.5 <a href="http://www.mysqlfront.de/">http://www.mysqlfront.de/</a> FreeWare<br />MySQL 绿色版 <a href="/beansoft/">http://www.blogjava.net/beansoft/</a> GPL 协议<br />MySQL ConnectorJ(即 JDBC 驱动) <a href="http://dev.mysql.com/downloads/connector/j/">http://dev.mysql.com/downloads/connector/j/</a> GPL 协议<br />MySQL JDBC 示例代码 <a href="/beansoft/">http://www.blogjava.net/beansoft/</a> GPL 协议<br />PStart <a href="http://www.pegtop.net/start/">http://www.pegtop.net/start/</a> FreeWare 
</p>
		<p>截图: 
</p>
		<p>
				<img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="429" alt="image" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/BeanSoftMySQLJavaJDBC_FE38/image_1.png" width="526" border="0" />
		</p>
		<p>主界面, 双击 mysql_start 启动 MySQL 服务器 
</p>
		<p>
				<img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="444" alt="image" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/BeanSoftMySQLJavaJDBC_FE38/image_3.png" width="602" border="0" />
		</p>
		<p>内置开源 MySQL 管理工具, 双击主界面的 "MySQL-Front" 启动 
</p>
		<p>
				<img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="514" alt="portable_mysql_jdbc" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/BeanSoftMySQLJavaJDBC_FE38/portable_mysql_jdbc_1.png" width="569" border="0" />  
</p>
		<p>双击主界面 "运行JDBC" 进行插入和读取数据测试, 开箱即用, 无需配置. </p>
<img src ="http://www.blogjava.net/beansoft/aggbug/150075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-10-01 18:13 <a href="http://www.blogjava.net/beansoft/archive/2007/10/01/150075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL中主键和外键的区别?(zz)</title><link>http://www.blogjava.net/beansoft/archive/2007/09/24/147657.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Sun, 23 Sep 2007 23:01:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/09/24/147657.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/147657.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/09/24/147657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/147657.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/147657.html</trackback:ping><description><![CDATA[
		<div class="tit">
				<a href="http://hi.baidu.com/%C8%CE%CA%CF%BF%C6%BC%BC/blog/item/3ddf1eda21e82dd9b6fd4825.html">http://hi.baidu.com/%C8%CE%CA%CF%BF%C6%BC%BC/blog/item/3ddf1eda21e82dd9b6fd4825.html</a>
				<br />
				<br />SQL中主键和外键的区别?</div>
		<div class="date">2007年06月22日 星期五 上午 07:21</div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt">
												<p>主键: <br />能够唯一表示数据表中的每个记录的【字段】或者【字段】的组合就称为主码(主键)。 一个主键是唯一识别一个表的每一记录，但这只是其作用的一部分，主键的主要作用是将记录和存放在其他表中的数据进行关联。在这一点上，主键是不同表中各记录之间的简单指针。主键约束就是确定表中的每一条记录。主键不能是空值。唯一约束是用于指定一个或多个列的组合值具有惟一性，以防止在列中输入重复的值。所以，主键的值对用户而言是没有什么意义，并且和它要赋予的值也没有什么特别的联系。 <br /><br />外键： <br />若有两个表A，B，C是A的主键，而B中也有C字段，则C就是表B的外键。外键约束主要用来维护两个表之间数据的一致性。</p>
												<p>
												</p>
												<p>A为基本表，B为信息表！！！！！！！！！！！</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/beansoft/aggbug/147657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-09-24 07:01 <a href="http://www.blogjava.net/beansoft/archive/2007/09/24/147657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用 JDBC 驱动名字和 URL 列表</title><link>http://www.blogjava.net/beansoft/archive/2007/09/22/147366.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Sat, 22 Sep 2007 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/09/22/147366.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/147366.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/09/22/147366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/147366.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/147366.html</trackback:ping><description><![CDATA[<p>常用 JDBC 驱动名字和 URL 列表  <p>ODBC&nbsp; driver<br>sun.jdbc.odbc.JdbcOdbcDriver<br>jdbc:odbc:name  <p>用 COM.ibm.db2.jdbc.net.DB2Driver 连接到 DB2 数据库<br>一个 DB2 URL 的示例:<br>jdbc:db2://aServer.myCompany.com:50002/name  <p>用 com.sybase.jdbc.SybDriver连接到 Sybase 数据库<br>一个 Sybase URL 的示例:<br>jdbc:sybase:Tds:aServer.myCompany.com:2025  <p>MySQL driver<br>com.mysql.jdbc.Driver<br>jdbc:mysql://hostname:3306/dbname?useUnicode=true&amp;characterEncoding=GBK  <p>Microsoft SQL Server Driver<br>com.microsoft.jdbc.sqlserver.SQLServerDriver<br>jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=WapSvc;User=sa;Password=pwd  <p>Informix<br>com.informix.jdbc.IfxDriver<br>jdbc:informix-sqli://hostname:1526/dbname:INFORMIXSERVER=informixservername;user=username;password=password  <p>Oracle<br>oracle.jdbc.driver.OracleDriver<br>jdbc:oracle:thin:@hostname:1521:&lt;SID&gt;  <p>Postgresql<br>org.postgresql.Driver<br>jdbc:postgresql://localhost/soft  <p>Apache Derby/Java DB<br>org.apache.derby.jdbc.ClientDriver<br>jdbc:derby://localhost:1527/databaseName;create=true  <p>Access 是通过 ODBC 连接的. Excel 也可以. 甚至可以动态构造连接字符串:  <p>这样可以直接连接到 Access 数据库文件.  <p>jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\mydata.mdb  <p>类似的 Excel 文件也可以用类似方法:  <p>jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};DBQ=.\mydata.xls</p><img src ="http://www.blogjava.net/beansoft/aggbug/147366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-09-22 12:32 <a href="http://www.blogjava.net/beansoft/archive/2007/09/22/147366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何连接SQL Server数据库(Tomcat 连接池配置) (转载)</title><link>http://www.blogjava.net/beansoft/archive/2007/09/18/146115.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Tue, 18 Sep 2007 03:54:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/09/18/146115.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/146115.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/09/18/146115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/146115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/146115.html</trackback:ping><description><![CDATA[<p>来源:<a title="http://www.blogjava.net/guming123416/articles/28002.html" href="http://www.blogjava.net/guming123416/articles/28002.html">http://www.blogjava.net/guming123416/articles/28002.html</a></p> <p>版本比较新, 网上好多都是说的是 Tomcat 4 的, 这个是 5.0 的.</p> <h4><a href="http://www.blogjava.net/guming123416/articles/28002.html">如何连接SQL Server数据库（Java） </a></h4>Posted on 2006-01-14 09:56 <a href="http://www.blogjava.net/guming123416/">lovajava_ye</a> 阅读(96) <a href="http://www.blogjava.net/#Post">评论(0)</a> <a href="http://www.blogjava.net/guming123416/admin/EditArticles.aspx?postid=28002">编辑</a> <a href="http://www.blogjava.net/guming123416/AddToFavorite.aspx?id=28002">收藏</a> <img height="1" src="http://www.blogjava.net/guming123416/aggbug/28002.html?webview=1" width="1"> <p>在CSDN上看到很多朋友问起这个问题，所以想给鄙人曾接触过的一些方法总结如下： <p>用Java连接SQL Server2000数据库有多种方法，下面介绍其中最常用的两种（通过JDBC驱动连接数据库）。 <p>1. 通过Microsoft的JDBC驱动连接。此JDBC驱动共有三个文件，分别是mssqlserver.jar、msutil.jar和msbase.jar，可以到微软的网站去下载（<a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=07287B11-0502-461A-B138-2AA54BFDC03A&amp;displaylang=en">http://www.microsoft.com/downloads/details.aspx?FamilyId=07287B11-0502-461A-B138-2AA54BFDC03A&amp;displaylang=en</a>），如果你下载的是<a href="http://www.microsoft.com/downloads/info.aspx?na=46&amp;p=5&amp;SrcDisplayLang=en&amp;SrcCategoryId=&amp;SrcFamilyId=07287B11-0502-461A-B138-2AA54BFDC03A&amp;u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f4%2f1%2fd%2f41d3e9c0-64d1-451e-947b-7a4cba273b2d%2fsetup.exe&amp;oRef=http%3a%2f%2fwww.microsoft.com%2fdownloads%2fdetails.aspx%3fFamilyID%3d4F8F2F01-1ED7-4C4D-8F7B-3D47969E66AE%26displaylang%3den">setup.exe</a>，还需要安装它，安装后会生成上面的三个jar文件。此JDBC驱动实现了 JDBC 2.0。<br>驱动程序名称：com.microsoft.jdbc.sqlserver.SQLServerDriver（即下面的<strong>classforname</strong>）<br>数据库连接URL：jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbname（即下面的<strong>url</strong>） <p>2. 通过JTDS JDBC Driver连接SQL Server数据库，此驱动的文件名为jtds-1.2.jar，下载路径为（<a href="http://sourceforge.net/project/showfiles.php?group_id=33291">http://sourceforge.net/project/showfiles.php?group_id=33291</a>），此驱动支持Microsoft SQL Server (6.5, 7.0, 2000 和2005) 和Sybase，并且实现了JDBC3.0，是免费的。<br>驱动程序名称：net.sourceforge.jtds.jdbc.Driver（即下面的<strong>classforname</strong>）<br>数据库连接URL：jdbc:jtds:sqlserver://localhost:1433/dbname（即下面的<strong>url</strong>） <p>JDBC连接SQL Server数据库的Bean代码网上大把的有，下面摘录其中的一部分：（请将localhost和1433改成你实际应用中的SQL Server服务器地址和端口号，dbname改成你实际的数据库名） <div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">import java.sql.*;
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> DatabaseConn {

 <span style="color: #0000ff">private</span> Connection conn;
 <span style="color: #0000ff">private</span> Statement stmt;
 <span style="color: #0000ff">private</span> String url = <span style="color: #006080">"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbname"</span>;
 <span style="color: #0000ff">private</span> String classforname = <span style="color: #006080">"com.microsoft.jdbc.sqlserver.SQLServerDriver"</span>;
 <span style="color: #0000ff">private</span> String uid = <span style="color: #006080">"sa"</span>;
 <span style="color: #0000ff">private</span> String pwd = <span style="color: #006080">"password"</span>;
 <span style="color: #0000ff">public</span> DatabaseConn(){}
 <span style="color: #008000">/**</span>
<span style="color: #008000">  * &lt;p&gt;通过Microsoft JDBC驱动获得数据库连接&lt;/p&gt;</span>
<span style="color: #008000">  * @return Connection</span>
<span style="color: #008000">  * @exception ClassNotFoundException, SQLException</span>
<span style="color: #008000">  */</span>
 <span style="color: #0000ff">public</span> Connection getConnection()
 {
  <span style="color: #0000ff">try</span>
  {
   Class.forName(classforname);
   <span style="color: #0000ff">if</span> (conn == <span style="color: #0000ff">null</span> || conn.isClosed())
    conn = DriverManager.getConnection( url, uid, pwd);
  }
  <span style="color: #0000ff">catch</span> (ClassNotFoundException ex)
  {
   ex.printStackTrace();
  }
  <span style="color: #0000ff">catch</span> (SQLException ex)
  {
   ex.printStackTrace();
  }
  <span style="color: #0000ff">return</span> conn;  
 }

}

</pre></div>
<p>当然，在做上述工作之前，你得先检查自己的SQL Server设置是否有问题，步骤如下：
<p>首先打开“命令行窗口”，也就是MS-Dos窗口，输入<br>telnet localhost 1433&nbsp; （当然，用SQL Server所在的服务器地址替代localhost，端口改为SQL Server的实际端口，默认是1433）
<p>如果成功了，表明你的SQL Server是可以连上的，如果没成功（一般是对于Win2003或者WinXP SP2），请进入控制面板，打开“管理工具”中的“服务”，启动“SQLSERVERAGENT”服务（当然，你也可以打上SQL Server的SP3补丁包），再继续上面的操作，应该会成功的。
<p>其次，检查你的用户名和密码是否能登陆SQL Server服务器，当然，最直接的办法就是打开SQL Server的“查询分析器”，输入用户名和密码，点击确定
<p>如果成功了，表明你的SQL Server登陆设置没问题，如果失败了，请打开SQL Server的“企业管理器”，在你注册的SQL Server服务器上（也就是左边的“SQL Server组”下面的那东东）也就是点击右键，选择“属性”，在“SQL Server （属性） 配置”对话框中选择“安全性”，将身份验证设为“SQL Server和Windows(S)”，再用查询分析器测试一次，如果还连接不上，就去检查你的用户名和密码是否有误。重复测试，直至成功。
<p>如果在JSP中应用连接，当然，除了直接用JDBC外，大伙最热衷于的莫过于连接池（Pool）了，下面着重介绍一下连接池的几种用法。
<p>为了方便，先设定JSP容器为Tomcat，因为大家用得比较多<br>1. 全局配置（Tomcat里的任何Web应用都能使用该配置的连接池）：在server.xml里面配置连接池，server.xml文件位于 $TOMCAT_HOME$/conf/目录下，打开它，找到&lt;/GlobalNamingResources&gt;，并在这一行的前面插入如下代码：
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #0000ff">&lt;</span><span style="color: #800000">Resource</span> 
   <span style="color: #ff0000">name</span><span style="color: #0000ff">="jdbc/poolName"</span> 
   <span style="color: #ff0000">auth</span><span style="color: #0000ff">="Container"</span> 
   <span style="color: #ff0000">type</span><span style="color: #0000ff">="javax.sql.DataSource"</span>
   <span style="color: #ff0000">maxActive</span><span style="color: #0000ff">="100"</span> 
   <span style="color: #ff0000">maxIdle</span><span style="color: #0000ff">="30"</span> 
   <span style="color: #ff0000">maxWait</span><span style="color: #0000ff">="10000"</span>
   <span style="color: #ff0000">username</span><span style="color: #0000ff">="sa"</span> 
   <span style="color: #ff0000">password</span><span style="color: #0000ff">="password"</span> 
   <span style="color: #ff0000">driverClassName</span><span style="color: #0000ff">="com.microsoft.jdbc.sqlserver.SQLServerDriver"</span>
   <span style="color: #ff0000">url</span><span style="color: #0000ff">="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=dbname"</span><span style="color: #0000ff">/&gt;</span></pre></div>
<p>注意：name为连接池的全局JNDI全称，username为password为数据库的连接用户名和密码，driverClassName是数据库驱动名称，url是数据库连接字符串。请按照你的实际配置进行修改。<br>配置到这里还没有算完成，下面要在context.xml里面设置全局访问的名称，设置如下：
<p>找到&lt;/Context&gt;，并在这一行的前面插入如下代码：<br>&lt;ResourceLink global="jdbc/poolName" name="jdbc/poolName" type="javax.sql.DataSource"/&gt;
<p>2. 局部配置：在$TOMCAT_HOME$/conf/Catalina/localhost/目录下新建一个xml文件，该xml文件要与你发布的Web应用目录名称相同，假如为webappname.xml，加入以下内容（配置Tomcat的外部虚拟目录也是在这里搞掂的，哈！）
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #0000ff">&lt;</span><span style="color: #800000">Context</span> <span style="color: #ff0000">path</span><span style="color: #0000ff">="/webappname"</span> <span style="color: #ff0000">docBase</span><span style="color: #0000ff">="d:/webappname"</span> <span style="color: #ff0000">debug</span><span style="color: #0000ff">="0"</span> <span style="color: #ff0000">reloadable</span><span style="color: #0000ff">="true"</span> <span style="color: #ff0000">crossContext</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">Resource</span> 
   <span style="color: #ff0000">name</span><span style="color: #0000ff">="jdbc/poolName"</span> 
   <span style="color: #ff0000">auth</span><span style="color: #0000ff">="Container"</span> 
   <span style="color: #ff0000">type</span><span style="color: #0000ff">="javax.sql.DataSource"</span>
   <span style="color: #ff0000">maxActive</span><span style="color: #0000ff">="100"</span> 
   <span style="color: #ff0000">maxIdle</span><span style="color: #0000ff">="30"</span> 
   <span style="color: #ff0000">maxWait</span><span style="color: #0000ff">="10000"</span>
   <span style="color: #ff0000">username</span><span style="color: #0000ff">="sa"</span> 
   <span style="color: #ff0000">password</span><span style="color: #0000ff">="password"</span> 
   <span style="color: #ff0000">driverClassName</span><span style="color: #0000ff">="com.microsoft.jdbc.sqlserver.SQLServerDriver"</span>
   <span style="color: #ff0000">url</span><span style="color: #0000ff">="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=dbname"</span><span style="color: #0000ff">/&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">ResourceLink</span> <span style="color: #ff0000">global</span><span style="color: #0000ff">="jdbc/poolName"</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="jdbc/poolName"</span> <span style="color: #ff0000">type</span><span style="color: #0000ff">="javax.sql.DataSource"</span><span style="color: #0000ff">/&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">Context</span><span style="color: #0000ff">&gt;</span></pre></div>
<p>对于前面两种方法，调用连接池代码如下：（其中com.yeno.util.Debug的Debug.log()方法主要用于打印调试信息，可以用System.out.println()代替）<strong> &nbsp;<font color="#ff0000">(注意, 这个类只能在 Tomcat 里运行, BeanSoft 注)</font></strong>
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">import java.sql.*;
import javax.sql.DataSource;
import javax.naming.*;
import com.yeno.util.Debug;
<span style="color: #008000">/**</span>
<span style="color: #008000"> * &lt;p&gt;数据库操作管理类,只实现数据库的连接,关闭和事务处理&lt;/p&gt;</span>
<span style="color: #008000"> * @Aurhor Yeno.hhr</span>
<span style="color: #008000"> * Create Date 2005-12-9</span>
<span style="color: #008000"> */</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> DataPool {

 <span style="color: #0000ff">public</span> DataPool(){}
 <span style="color: #008000">/**</span>
<span style="color: #008000">     * &lt;p&gt;通过Tomcat连接池取得数据库连接&lt;/p&gt;</span>
<span style="color: #008000">     * @param no</span>
<span style="color: #008000">     * @return Connection 数据库连接</span>
<span style="color: #008000">     * @exception NamingException,SQLException,Exception</span>
<span style="color: #008000">     */</span>
 <span style="color: #0000ff">public</span> Connection getConnect()
 {
  Connection conn = <span style="color: #0000ff">null</span>;
  <span style="color: #0000ff">try</span>
  {
   Context intitCtx = <span style="color: #0000ff">new</span> InitialContext();
   Context envCtx = (Context)intitCtx.lookup(<span style="color: #006080">"java:comp/env"</span>);
   DataSource ds = (DataSource)envCtx.lookup(<span style="color: #006080">"jdbc/poolName"</span>);
   conn = ds.getConnection();
  }
  <span style="color: #0000ff">catch</span>(NamingException nex)
  {
   Debug.log(<span style="color: #0000ff">this</span>,<span style="color: #006080">"getConnect()"</span>,<span style="color: #006080">"No correct environment!"</span>);
  }
  <span style="color: #0000ff">catch</span>(SQLException sqlex)
  {
   Debug.log(<span style="color: #0000ff">this</span>,<span style="color: #006080">"getConnect()"</span>,<span style="color: #006080">"Can't get connection!"</span>);
  }
  <span style="color: #0000ff">return</span> conn;
 }

}

</pre></div>
<p><strong>在使用上述代码之前，必须保证JDBC驱动的相关JAR文件（Microsoft为mssqlserver.jar、msutil.jar和msbase.jar，JTDS为jtds-1.2.jar）已正确配置，可以将相关JAR文件拷贝到$TOMCAT_HOME$/common/lib/目录下，也可以拷贝到$WEB_ROOT$/WEB-INF/lib/目录下</strong>
<p>还可以用注入方式来调用连接池，即在Hibernate的配置文件hibernate.cfg.xml中调用，在JSP容器中配置好连接池以后，再在Hibernate的配置文件中调用系统的连接池设置，关键代码摘录如下：
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #0000ff">&lt;</span><span style="color: #800000">session-factory</span><span style="color: #0000ff">&gt;</span>
<span style="color: #008000">&lt;!-- </span>
<span style="color: #008000"> &lt;property name="jndi.class"&gt;&lt;/property&gt;</span>
<span style="color: #008000"> &lt;property name="jndi.url"&gt;&lt;/property&gt;</span>
<span style="color: #008000">--&gt;</span>
 <span style="color: #0000ff">&lt;</span><span style="color: #800000">property</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="connection.datasource"</span><span style="color: #0000ff">&gt;</span>java:comp/env/jdbc/poolName<span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span>
 <span style="color: #0000ff">&lt;</span><span style="color: #800000">property</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="show_sql"</span><span style="color: #0000ff">&gt;</span>false<span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span>
 <span style="color: #0000ff">&lt;</span><span style="color: #800000">property</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="dialect"</span><span style="color: #0000ff">&gt;</span>org.hibernate.dialect.SQLServerDialect<span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">session-factory</span><span style="color: #0000ff">&gt;</span></pre></div>
<p>Hibernate的具体使用方法，请查阅相关详细资料。
<p>叶明</p><img src ="http://www.blogjava.net/beansoft/aggbug/146115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-09-18 11:54 <a href="http://www.blogjava.net/beansoft/archive/2007/09/18/146115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle Sequence 和 java.sql.PreparedStatement 的协同使用</title><link>http://www.blogjava.net/beansoft/archive/2007/07/11/129652.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Wed, 11 Jul 2007 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/07/11/129652.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/129652.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/07/11/129652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/129652.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/129652.html</trackback:ping><description><![CDATA[<p></p> <p>java.sql.PreparedStatement pstmt = dbUtil.getPreparedStatement("insert into users (id , username, password, age, sex) values(<strong>users_seq.nextval</strong>, ?, ?, ?, ?)");<br>pstmt.setString(1, user.getUsername());<br>pstmt.setString(2, user.getPassword());<br>pstmt.setInt(3, user.getAge());<br>pstmt.setString(4, user.getSex());  <p>pstmt.executeUpdate(); <p>&nbsp; <p>代码很短, 可是 N 久都没有手写 Oracle 代码了, 所以有点手生. 看来做总结还是会好很多啊.</p><img src ="http://www.blogjava.net/beansoft/aggbug/129652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-07-11 16:53 <a href="http://www.blogjava.net/beansoft/archive/2007/07/11/129652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习 SQL 语法的好资料: Transact-SQL 参考(地址已更新)</title><link>http://www.blogjava.net/beansoft/archive/2007/07/10/129354.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Tue, 10 Jul 2007 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/07/10/129354.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/129354.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/07/10/129354.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/129354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/129354.html</trackback:ping><description><![CDATA[
		<p>这个资料是我上大学时候一直看到现在的, 既可以作为学习资料, 更可以作为开发时候的速查手册. 具体来说就是安装了 SQL Server 2000 后里面自带的帮助文档的一部分. </p>
		<p>可以下载这个压缩包(限Windows平台): <a href="http://tomcatmonitor.googlecode.com/files/tsqlref.zip">http://tomcatmonitor.googlecode.com/files/tsqlref.zip</a> 2.1MB CHM 格式, 有索引, 可搜索</p>
		<p>那么这个资料的好处是什么呢?</p>
		<p>1) 全中文</p>
		<p>2) 语法特别详细(当然部分是 MS 特有的, 不太好).. 这里可以带个例子给大家看:</p>
		<p> </p>
		<p>Transact-SQL 参考 
</p>
		<h3>
				<a>
				</a>INSERT</h3>
		<p>将新行添加到表或视图。 
</p>
		<h6>语法</h6>
		<p>INSERT [ INTO]<br />    { <i>table_name</i> WITH <b>(</b> &lt; table_hint_limited &gt; [ ...<i>n </i>] <b>)</b><br />        | <i>view_name<br /></i>    | <i>rowset_function_limited</i><br />    }<code><br />    {    </code>[ <b>( </b><i>column_list </i><b>) </b>]<br />        { VALUES<br /><b><code>( </code></b>{<code> DEFAULT | NULL | <i>expression </i></code>}<code> [ <b>,</b>...<i>n</i>] <b>)<br /></b></code>| <i>derived_table<br /></i>| <i>execute_statement<br /></i>        }<code><br />    } <br /></code>| DEFAULT VALUES 
</p>
		<p>&lt; table_hint_limited &gt; ::=<b><br /></b>{<code> FASTFIRSTROW<br /></code>|<b></b>HOLDLOCK<br />        | PAGLOCK<br />        | READCOMMITTED<br />        | REPEATABLEREAD<br />        | ROWLOCK<br />        | SERIALIZABLE<br />        | TABLOCK<br />        | TABLOCKX<br />        | UPDLOCK<code><br />    } </code></p>
		<h6>参数</h6>
		<p>[INTO] 
</p>
		<p>一个可选的关键字，可以将它用在 INSERT 和目标表之间。 
</p>
		<p>
				<i>table_name</i>
		</p>
		<p>将要接收数据的表或 <b>table</b> 变量的名称。 
</p>
		<p>WITH <b>(</b>&lt;table_hint_limited&gt; [...<i>n</i>]<b>)</b></p>
		<p>指定目标表所允许的一个或多个表提示。需要有 WITH 关键字和圆括号。不允许有 READPAST、NOLOCK 和 READUNCOMMITTED。有关表提示的更多信息，请参见 <a href="ts_fa-fz_4ox9.htm">FROM</a>。 
</p>
		<p>
				<i>view_name</i>
		</p>
		<p>视图的名称及可选的别名。通过 <i>view_name</i> 来引用的视图必须是可更新的。由 INSERT 语句所做的修改不能影响视图的 FROM 子句中引用的多个基表。例如，在多表视图中的 INSERT 必须使用 <i>column_list</i>，<i>column_list</i> 是只引用来自一个基表的列。有关可更新视图的更多信息，请参见 <a href="ts_create2_30hj.htm">CREATE VIEW</a>。 
</p>
		<p>
				<i>rowset_function_limited</i>
		</p>
		<p>是 OPENQUERY 或 OPENROWSET 函数。有关更多信息，请参见 <a href="ts_oa-oz_5xix.htm">OPENQUERY</a> 以及 <a href="ts_oa-oz_78z8.htm">OPENROWSET</a>。 
</p>
		<p>(<i>column_list</i>) 
</p>
		<p>要在其中插入数据的一列或多列的列表。必须用圆括号将 <i>column_list</i> 括起来，并且用逗号进行分隔。 
</p>
		<p>如果某列不在 <i>column_list</i> 中，则 Microsoft® SQL Server™ 必须能够基于该列的定义提供一个值；否则不能装载行。如果列满足下面的条件，那么 SQL Server 将自动为列提供值： 
</p>
		<ul>
				<li>具有 IDENTITY 属性。使用下一个增量标识值。 
</li>
				<li>有默认值。使用列的默认值。 
</li>
				<li>具有 <b>timestamp </b>数据类型。使用当前的时间戳值。 
</li>
				<li>是可空的。使用空值。 </li>
		</ul>
		<p>当向标识列中插入显式的值时，必须使用 <i>column_list</i> 及 VALUES 列表，并且对于表，SET IDENTITY_INSERT 选项必须是 ON。 
</p>
		<p>VALUES 
</p>
		<p>引入要插入的数据值的列表。对于 <i>column_list</i>（如果已指定）中或者表中的每个列，都必须有一个数据值。必须用圆括号将值列表括起来。 
</p>
		<p>如果 VALUES 列表中的值与表中列的顺序不相同，或者未包含表中所有列的值，那么必须使用 <i>column_list</i> 明确地指定存储每个传入值的列。 
</p>
		<p>DEFAULT 
</p>
		<p>强制 SQL Server 装载为列定义的默认值。如果对于某列并不存在默认值，并且该列允许 NULL，那么就插入 NULL。对于使用 <b>timestamp</b><i></i>数据类型定义的列，插入下一个时间戳值。DEFAULT 对标识列无效。 
</p>
		<p>
				<i>expression</i>
		</p>
		<p>一个常量、变量或表达式。表达式不能包含 SELECT 或 EXECUTE 语句。 
</p>
		<p>
				<i>derived_table</i>
		</p>
		<p>任何有效的 SELECT 语句，它返回将装载到表中的数据行。 
</p>
		<p>
				<i>execute_statement</i>
		</p>
		<p>任何有效的 EXECUTE 语句，它使用 SELECT 或 READTEXT 语句返回数据。 
</p>
		<p>如果将 <i>execute_statement</i> 与 INSERT 一起使用，那么每个结果集都必须与表中或 <i>column_list </i>中的列兼容。<i>execute_statement</i> 可以用来执行同一服务器或远程服务器上的存储过程。执行远程服务器中的过程，然后将结果集返回到本地服务器，并装载到本地服务器的表中。如果 <i>execute_statement</i> 使用 READTEXT 语句返回数据，那么每个单独的 READTEXT 语句最多可以返回 1 MB (1024 KB) 的数据，也可以将 <i>execute_statement</i> 与扩展过程一起使用，并且插入扩展过程的主线程返回的数据。不会插入不是主线程的其它线程中的输出结果。 
</p>
		<p>
				<img border="0" alt="" src="mk:@MSITStore:E:\Books\Database\chm\TSQLREF.CHM::/Basics/note.gif" width="12" height="11" />
		</p>
		<p>
				<b>说明</b>  对于 SQL Server 7.0，<i>execute_statement</i> 不包含返回 <b>text</b> 或 <b>image</b> 列的扩展存储过程。这个行为是从 SQL Server 早期版本变化而来的。 
</p>
		<p>DEFAULT VALUES 
</p>
		<p>强制新行包含为每个列所定义的默认值。 
</p>
		<h6>注释</h6>
		<p>INSERT 将新行追加到表中。若要替换表中的数据，必须在使用 INSERT 装载新数据之前，使用 DELETE 或 TRUNCATE TABLE 语句清除现有的数据。若要修改现有行中的列值，请使用 UPDATE。若要创建新表，并且通过一个步骤给它装载数据，请使用 SELECT 语句的 INTO 选项。 
</p>
		<p>
				<b>table</b> 变量在其作用域内可以像常规表一样访问。因此，可以像在 INSERT 语句中将行添加到表一样使用 <b>table</b> 变量。有关更多信息，请参见 <a href="ts_ta-tz_7ysl.htm">table</a>。 
</p>
		<p>由 OPENDATASOURCE 函数建立的、作为服务器名部分的四段名称可以作为表源，该表源可以出现在 INSERT 语句中显示表名的所有位置。 
</p>
		<p>使用 <b>uniqueidentifier</b> 数据类型创建的列存储特殊格式的 16 字节二进制值。与标识列不同，SQL Server 不会为带有 <b>uniqueidentifier</b> 数据类型的列自动地生成值。在插入操作过程中，带有 <b>uniqueidentifier</b> 数据类型的变量以及某些字符串常量可以用于 <b>uniqueidentifier </b>列（这些字符串常量的形式为：xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx，有 36 个字符，其中包括连字符。x 是十六进制数，范围为 0-9 或 a-f。）。例如，对于 <b>uniqueidentifier </b>变量或列，6F9619FF-8B86-D011-B42D-00C04FC964FF 是一个有效值。使用 NEWID() 函数可以获取全局唯一的 ID (GUID)。 
</p>
		<p>插入行时，可以应用下列规则： 
</p>
		<ul>
				<li>如果将值装载到带有 <b>char</b>、<b>varchar</b> 或 <b>varbinary</b> 数据类型的列，尾随空格（对于 <b>char</b> 和 <b>varchar </b>是空格，对于 <b>varbinary </b>是零）的填充和截断是由 SET ANSI_PADDING 设置确定的。该设置是在创建表时为列定义的。有关更多信息，请参见 <a href="ts_set-set_2uw7.htm">SET ANSI_PADDING</a>。 
<p>下表显示 SET ANSI_PADDING 为 OFF 时的默认操作。 
</p><p>数据类型<br />默认操作 
</p><p><b>Char</b><br />将带有空格的值填充到已定义的列宽。 
</p><p><b>Varchar</b><br />删除最后的非空格字符后面的尾随空格，而对于只由空格组成的字符串，一直删除到只留下一个空格字符。 
</p><p><b>Varbinary</b><br />删除尾随的零。</p></li>
				<li>如果将一个空字符串 (' ') 装载到带有<b> varchar</b> 或 <b>text</b> 数据类型的列，那么默认操作是装载一个零长度的字符串。如果数据库的兼容级别小于 70，那么将该值转换成单个空格。有关更多信息，请参见<b></b><a href="ts_sp_da-di_5c8c.htm">sp_dbcmptlevel</a>。 
</li>
				<li>如果 INSERT 语句违反约束或规则，或者它有与列的数据类型不兼容的值，那么该语句就会失败，并且 SQL Server 显示错误信息。 
</li>
				<li>将空值插入到 <b>text</b> 或 <b>image </b>列不能创建有效的文本指针，也不能预分配 8 KB 的文本页。有关插入 <b>text</b><i></i>和 <b>image</b><i></i>数据的更多信息，请参见<a href="JavaScript:hhobj_1.Click()">使用 text、ntext 和 image 函数</a>。 
</li>
				<li>如果 INSERT 正在使用 SELECT 或 EXECUTE 装载多行，正在装载的值中出现任何违反规则或约束的行为都会导致整个语句终止，从而不会装载任何行。 
</li>
				<li>当向远程 SQL Server 表中插入值且没有为所有列指定值时，则用户必须标识将向其中插入指定值的列。 </li>
		</ul>
		<p>在本地和远程分区视图上，忽略 INSERT 语句的 SET ROWCOUNT 选项的设置。而且，当兼容级别设置为 80 时，在 SQL Server 2000 中的远程表上也不支持 INSERT 语句的 SET ROWCOUNT 选项。 
</p>
		<p>当为表或视图的 INSERT 操作定义了 INSTEAD-OF 触发器时，该触发器就会执行 INSERT 语句中的 <i>instead of</i>。以前的 SQL Server 版本只支持在 INSERT 中定义的 AFTER 触发器，以及其它数据修改语句。 
</p>
		<p>如果在表达式赋值过程中 INSERT 语句遇到算术错误（溢出、被零除或域错误），那么 SQL Server 会处理这些错误，就好像 SET ARITHABORT 是 ON 一样。批处理的其余部分将终止，并且会返回一条错误信息。 
</p>
		<h6>权限</h6>
		<p>默认情况下，INSERT 权限被授予 <b>sysadmin </b>固定服务器角色成员，<b>db_owner</b> 和 <b>db_datawriter</b> 固定数据库角色成员，以及表的所有者。<b>sysadmin</b>、<b>db_owner </b>和 <b>db_securityadmin</b> 角色成员和表所有者可以将权限转让给其他用户。 
</p>
		<h6>示例</h6>
		<h6>A. 使用简单的 INSERT</h6>
		<p>下面的示例创建表 <b>T1</b>，并且插入一行。</p>
		<pre>
				<code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
INSERT T1 VALUES (1, 'Row #1')
</code>
		</pre>
		<h6>B. 插入与列顺序不同的数据</h6>
		<p>下面的示例使用 <i>column_list</i> 及 VALUES 列表显式地指定将被插入每个列的值。</p>
		<pre>
				<code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
INSERT T1 (column_2, column_1) VALUES ('Row #1',1)
</code>
		</pre>
		<h6>C. 插入值少于列个数的数据</h6>
		<p>下面的示例创建一个带有四个列的表。INSERT 语句插入一些行，这些行只有部分列包含值。</p>
		<pre>
				<code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE TABLE T1 
( column_1 int identity, 
  column_2 varchar(30) 
    CONSTRAINT default_name DEFAULT ('column default'),
  column_3 int NULL,
  column_4 varchar(40)
)
INSERT INTO T1 (column_4) 
   VALUES ('Explicit value')
INSERT INTO T1 (column_2,column_4) 
   VALUES ('Explicit value', 'Explicit value')
INSERT INTO T1 (column_2,column_3,column_4) 
   VALUES ('Explicit value',-44,'Explicit value')
SELECT * 
FROM T1
</code>
		</pre>
		<h6>D. 将数据装载到带有标识列的表</h6>
		<p>前两个 INSERT 语句允许为新行生成标识值。第三个 INSERT 语句用 SET IDENTITY_INSERT 语句替代列的 IDENTITY 属性，并且将一个显式的值插入到标识列。</p>
		<pre>
				<code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int IDENTITY, column_2 varchar(30))
INSERT T1 VALUES ('Row #1')
INSERT T1 (column_2) VALUES ('Row #2')
SET IDENTITY_INSERT T1 ON 
INSERT INTO T1 (column_1,column_2) 
   VALUES (-99,'Explicit identity value')
SELECT * 
FROM T1
</code>
		</pre>
		<h6>E. 通过视图将数据装载到表</h6>
		<p>在下面的示例中，INSERT 语句指定一个视图名；但是将新行插入该视图的基础表中。INSERT 语句中 VALUES 列表的顺序必须与视图的列顺序相匹配。</p>
		<pre>
				<code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
      WHERE TABLE_NAME = 'V1')
   DROP VIEW V1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
GO
CREATE VIEW V1 AS SELECT column_2, column_1 
FROM T1
GO
INSERT INTO V1 
   VALUES ('Row 1',1)
SELECT * 
FROM T1
</code>
		</pre>
		<h6>F. 使用 DEFAULT VALUES 选项装载数据</h6>
		<p>在下面的示例中，CREATE TABLE 语句给每个列定义一个值，当在 INSERT 语句中没有为列指定显式的值时，就可以使用这个值。使用 INSERT 语句的 DEFAULT VALUES 选项，无须提供显式的值就可以添加行。</p>
		<pre>
				<code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE DEFAULT bound_default AS 'Bound default value'
GO
CREATE TABLE T1 
( column_1 int identity, 
  column_2 varchar(30) 
    CONSTRAINT default_name DEFAULT ('column default'),
  column_3 timestamp,
  column_4 varchar(30),
  column_5 int NULL)
GO
USE master
EXEC sp_bindefault 'bound_default','T1.column_4'
INSERT INTO T1 DEFAULT VALUES 
SELECT * 
FROM T1
</code>
		</pre>
		<h6>G. 使用 SELECT 和 EXECUTE 选项装载数据</h6>
		<p>下面的示例演示三种不同的方法，用来从一个表获取数据，并将数据装载到另一个表。每种方法都基于一个多表 SELECT 语句，该语句在列列表中包含一个表达式及一个文字值。 
</p>
		<p>第一个 INSERT 语句使用一个 SELECT 语句直接从源表 (<b>authors</b>) 检索数据，并且将结果集存储到 <b>author_sales</b> 表。第二个 INSERT 执行一个包含 SELECT 语句的过程，而第三个 INSERT 将 SELECT 语句作为一个文字字符串执行。 </p>
		<pre>
				<code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'author_sales')
   DROP TABLE author_sales
GO
IF EXISTS(SELECT name FROM sysobjects 
      WHERE name = 'get_author_sales' AND type = 'P')
   DROP PROCEDURE get_author_sales
GO
USE pubs
CREATE TABLE author_sales
( data_source   varchar(20),
  au_id         varchar(11),
  au_lname      varchar(40),
  sales_dollars smallmoney
)
GO
CREATE PROCEDURE get_author_sales 
AS 
   SELECT 'PROCEDURE', authors.au_id, authors.au_lname, 
      SUM(titles.price * sales.qty) 
   FROM authors INNER JOIN titleauthor 
      ON authors.au_id = titleauthor.au_id INNER JOIN titles
      ON titleauthor.title_id = titles.title_id INNER JOIN sales
      ON titles.title_id = sales.title_id
   WHERE authors.au_id like '8%'
</code>
				<code>GROUP BY authors.au_id, authors.au_lname</code>
				<code>GO</code>
				<code>--INSERT...SELECT example</code>
				<code>USE pubs</code>
				<code>INSERT author_sales</code>
				<code>   SELECT 'SELECT', authors.au_id, authors.au_lname, </code>
				<code>      SUM(titles.price * sales.qty) </code>
				<code>   FROM authors INNER JOIN titleauthor </code>
				<code>      ON authors.au_id = titleauthor.au_id INNER JOIN titles</code>
				<code>      ON titleauthor.title_id = titles.title_id INNER JOIN sales</code>
				<code>      ON titles.title_id = sales.title_id</code>
				<code>   WHERE authors.au_id LIKE '8%'</code>
				<code>GROUP BY authors.au_id, authors.au_lname</code>
				<code>--INSERT...EXECUTE procedure example</code>
				<code>INSERT author_sales EXECUTE get_author_sales</code>
				<code>--INSERT...EXECUTE('string') example</code>
				<code>INSERT author_sales </code>
				<code>EXECUTE </code>
				<code>('</code>
				<code>SELECT ''EXEC STRING'', authors.au_id, authors.au_lname, </code>
				<code>   SUM(titles.price * sales.qty) </code>
				<code>   FROM authors INNER JOIN titleauthor </code>
				<code>      ON authors.au_id = titleauthor.au_id INNER JOIN titles</code>
				<code>      ON titleauthor.title_id = titles.title_id INNER JOIN sales</code>
				<code>      ON titles.title_id = sales.title_id</code>
				<code>   WHERE authors.au_id like ''8%''</code>
				<code>GROUP BY authors.au_id, authors.au_lname</code>
				<code>')</code>
				<code>--Show results.</code>
				<code>SELECT * FROM author_sales</code>
		</pre>
		<h6>H. 使用 SELECT 语句中的 TOP 子句插入数据</h6>
		<p>因为可以在 INSERT 语句中指定 SELECT 语句，所以也可以将 TOP 子句用在 SELECT 语句中。下面的示例将 <b>authors </b>表中最上面的 10 个作者插入到名为 <b>new_authors </b>的新表中。</p>
		<pre>
				<code>IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'new_authors')
   DROP TABLE new_authors
GO
USE pubs
CREATE TABLE new_authors
(
 au_id    id,
 au_lname varchar(40),
 au_fname varchar(20),
 phone    char(12),
 address  varchar(40),
 city     varchar(20),    
 state    char(2), 
 zip         char(5),
 contract bit
)
INSERT INTO new_authors 
SELECT TOP 10 * 
FROM authors
</code>
		</pre>
		<h6>
				<b>请参见</b>
		</h6>
		<p>
				<a href="ts_create2_8g9x.htm">CREATE TABLE</a>
		</p>
		<p>
				<a href="ts_ea-ez_05ro.htm">EXECUTE</a>
		</p>
		<p>
				<a href="ts_fa-fz_4ox9.htm">FROM</a>
		</p>
		<p>
				<a href="ts_ia-iz_3iex.htm">IDENTITY（属性）</a>
		</p>
		<p>
				<a href="ts_na-nop_4pt0.htm">NEWID</a>
		</p>
		<p>
				<a href="ts_sa-ses_9sfo.htm">SELECT</a>
		</p>
		<p>
				<a href="ts_set-set_0bjo.htm">SET ROWCOUNT</a>
		</p>
		<p>
				<a href="ms-its:hlpview.chm::/gscopy_0z3m.htm">©1988-2000 Microsoft Corporation。保留所有权利。</a>
		</p>
		<h6>
				<a>
				</a>
		</h6>
<img src ="http://www.blogjava.net/beansoft/aggbug/129354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-07-10 15:39 <a href="http://www.blogjava.net/beansoft/archive/2007/07/10/129354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 如何配置显示生成的 SQL?</title><link>http://www.blogjava.net/beansoft/archive/2007/07/10/129329.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Tue, 10 Jul 2007 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/07/10/129329.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/129329.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/07/10/129329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/129329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/129329.html</trackback:ping><description><![CDATA[<p>今天向一位同学请教了如何在控制台输出 Hibernate 工作过程中生成的 SQL, 非常简单, 不过还是十分感谢分享. 毕竟先知者为师.</p> <p>简单说就是如下所示:</p> <p>&nbsp;</p> <p>&lt;!-- Output sql of hibernate --&gt;<br>&lt;property name="hibernate.show_sql"&gt;true&lt;/property&gt;  <p>&nbsp; <p>这时控制台会显示如下的信息: <p>Hibernate: select users_seq.nextval from dual<br>Hibernate: insert into users (username, password, age, sex, id) values (?, ?, ?, ?, ?) <p>可以看到 Hibernate 是用 PreparedStatement 工作的, 跟我以前做的 BeanJDBC Persistence 研究项目用的思路一致. <p>&nbsp; <p>一份完整的配置文件:  <p>&nbsp;  <p>&lt;?xml version='1.0' encoding='UTF-8'?&gt;<br>&lt;!DOCTYPE hibernate-configuration PUBLIC<br>"-//Hibernate/Hibernate Configuration DTD 3.0//EN"<br>"<a href="http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd&quot;">http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"</a>&gt;  <p>&lt;hibernate-configuration&gt;  <p>&lt;session-factory&gt;<br>&lt;!-- localhost mysql config --&gt;<br>&nbsp;<br>&lt;property name="connection.username"&gt;root&lt;/property&gt;<br>&lt;property name="connection.url"&gt;<br>jdbc:mysql://localhost/test<br>&lt;/property&gt;<br>&lt;property name="dialect"&gt;<br>org.hibernate.dialect.MySQLDialect<br>&lt;/property&gt;<br>&lt;property name="myeclipse.connection.profile"&gt;<br>com.mysql.jdbc.Driver<br>&lt;/property&gt;<br>&lt;property name="connection.password"&gt;&lt;/property&gt;<br>&lt;property name="connection.driver_class"&gt;<br>com.mysql.jdbc.Driver<br>&lt;/property&gt;<br> <p>&lt;!-- Output sql of hibernate --&gt;<br>&lt;property name="hibernate.show_sql"&gt;true&lt;/property&gt;  <p>&lt;mapping resource="entity/User.hbm.xml"/&gt;<br>&lt;/session-factory&gt;  <p>&lt;/hibernate-configuration&gt;</p><img src ="http://www.blogjava.net/beansoft/aggbug/129329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-07-10 13:51 <a href="http://www.blogjava.net/beansoft/archive/2007/07/10/129329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql 优化的资料(收集转载)</title><link>http://www.blogjava.net/beansoft/archive/2007/04/09/109432.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Mon, 09 Apr 2007 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/04/09/109432.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/109432.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/04/09/109432.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/109432.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/109432.html</trackback:ping><description><![CDATA[<p></p> <p>Mysql 百万级数据优化资料  <p>一、我们可以且应该优化什么？  <p>硬件  <p>操作系统/软件库  <p>SQL服务器(设置和查询)  <p>应用编程接口(API)  <p>应用程序  <p>--------------------------------------------------------------------------------  <p>二、优化硬件  <p>如果你需要庞大的数据库表(&gt;2G)，你应该考虑使用64位的硬件结构，像Alpha、Sparc或即将推出的IA64。因为MySQL内部使用大量64位的整数，64位的CPU将提供更好的性能。  <p>对大数据库，优化的次序一般是RAM、快速硬盘、CPU能力。  <p>更多的内存通过将最常用的键码页面存放在内存中可以加速键码的更新。  <p>如果不使用事务安全(transaction-safe)的表或有大表并且想避免长文件检查，一台UPS就能够在电源故障时让系统安全关闭。  <p>对于数据库存放在一个专用服务器的系统，应该考虑1G的以太网。延迟与吞吐量同样重要。  <p>--------------------------------------------------------------------------------  <p>三、优化磁盘  <p>为系统、程序和临时文件配备一个专用磁盘，如果确是进行很多修改工作，将更新日志和事务日志放在专用磁盘上。<br>低寻道时间对数据库磁盘非常重要。对与大表，你可以估计你将需要log(行数)/log(索引块长度/3*2/(键码长度 + 数据指针长度))+1次寻到才能找到一行。对于有500000行的表，索引Mediun int类型的列，需要log(500000) / log(1024/3*2/(3 + 2))+1=4次寻道。上述索引需要500000*7*3/2=5.2M的空间。实际上，大多数块将被缓存，所以大概只需要1-2次寻道。<br>然而对于写入（如上），你将需要4次寻道请求来找到在哪里存放新键码，而且一般要2次寻道来更新索引并写入一行。<br>对于非常大的数据库，你的应用将受到磁盘寻道速度的限制，随着数据量的增加呈N log N数据级递增。<br>将数据库和表分在不同的磁盘上。在MySQL中，你可以为此而使用符号链接。<br>条列磁盘(RAID 0)将提高读和写的吞吐量。<br>带镜像的条列(RAID 0+1)将更安全并提高读取的吞吐量。写入的吞吐量将有所降低。<br>不要对临时文件或可以很容易地重建的数据所在的磁盘使用镜像或RAID(除了RAID 0)。<br>在Linux上，在引导时对磁盘使用命令hdparm -m16 -d1以启用同时读写多个扇区和DMA功能。这可以将响应时间提高5~50%。<br>在Linux上，用async (默认)和noatime挂载磁盘(mount)。<br>对于某些特定应用，可以对某些特定表使用内存磁盘，但通常不需要。  <p>--------------------------------------------------------------------------------  <p>四、优化操作系统  <p>不要交换区。如果内存不足，增加更多的内存或配置你的系统使用较少内存。<br>不要使用NFS磁盘(会有NFS锁定的问题)。<br>增加系统和MySQL服务器的打开文件数量。(在safe_mysqld脚本中加入ulimit -n #)。<br>增加系统的进程和线程数量。<br>如果你有相对较少的大表，告诉文件系统不要将文件打碎在不同的磁道上(Solaris)。<br>使用支持大文件的文件系统(Solaris)。<br>选择使用哪种文件系统。在Linux上的Reiserfs对于打开、读写都非常快。文件检查只需几秒种。  <p>--------------------------------------------------------------------------------  <p>五、选择应用编程接口  <p>PERL<br>可在不同的操作系统和数据库之间移植。<br>适宜快速原型。<br>应该使用DBI/DBD接口。<br>PHP<br>比PERL易学。<br>使用比PERL少的资源。<br>通过升级到PHP4可以获得更快的速度。<br>C<br>MySQL的原生接口。<br>较快并赋予更多的控制。<br>低层，所以必须付出更多。<br>C++<br>较高层次，给你更多的时间来编写应用。<br>仍在开发中<br>ODBC<br>运行在Windows和Unix上。<br>几乎可在不同的SQL服务器间移植。<br>较慢。MyODBC只是简单的直通驱动程序，比用原生接口慢19%。<br>有很多方法做同样的事。很难像很多ODBC驱动程序那样运行，在不同的领域还有不同的错误。<br>问题成堆。Microsoft偶尔还会改变接口。<br>不明朗的未来。(Microsoft更推崇OLE而非ODBC)<br>ODBC<br>运行在Windows和Unix上。<br>几乎可在不同的SQL服务器间移植。<br>较慢。MyODBC只是简单的直通驱动程序，比用原生接口慢19%。<br>有很多方法做同样的事。很难像很多ODBC驱动程序那样运行，在不同的领域还有不同的错误。<br>问题成堆。Microsoft偶尔还会改变接口。<br>不明朗的未来。(Microsoft更推崇OLE而非ODBC)<br>JDBC<br>理论上可在不同的操作系统何时据库间移植。<br>可以运行在web客户端。<br>Python和其他<br>可能不错，可我们不用它们。  <p>--------------------------------------------------------------------------------  <p>六、优化应用  <p>应该集中精力解决问题。<br>在编写应用时，应该决定什么是最重要的：<br>速度<br>操作系统间的可移植性<br>SQL服务器间的可移植性<br>使用持续的连接。.<br>缓存应用中的数据以减少SQL服务器的负载。<br>不要查询应用中不需要的列。<br>不要使用SELECT * FROM table_name...<br>测试应用的所有部分，但将大部分精力放在在可能最坏的合理的负载下的测试整体应用。通过以一种模块化的方式进行，你应该能用一个快速“哑模块”替代找到的瓶颈，然后很容易地标出下一个瓶颈。<br>如果在一个批处理中进行大量修改，使用LOCK TABLES。例如将多个UPDATES或DELETES集中在一起。  <p>--------------------------------------------------------------------------------  <p>七、应该使用可移植的应用  <p>Perl DBI/DBD<br>ODBC<br>JDBC<br>Python(或其他有普遍SQL接口的语言)<br>你应该只使用存在于所有目的SQL服务器中或可以很容易地用其他构造模拟的SQL构造。www.mysql.com上的Crash-me页可以帮助你。<br>为操作系统/SQL服务器编写包装程序来提供缺少的功能。  <p>--------------------------------------------------------------------------------  <p>八、如果你需要更快的速度，你应该：  <p>找出瓶颈(CPU、磁盘、内存、SQL服务器、操作系统、API或应用)并集中全力解决。<br>使用给予你更快速度/灵活性的扩展。<br>逐渐了解SQL服务器以便能为你的问题使用可能最快的SQL构造并避免瓶颈。<br>优化表布局和查询。<br>使用复制以获得更快的选择(select)速度。<br>如果你有一个慢速的网络连接数据库，使用压缩客户/服务器协议。<br>不要害怕时应用的第一个版本不能完美地移植，在你解决问题时，你总是可以在以后优化它。  <p>--------------------------------------------------------------------------------  <p>九、优化MySQL  <p>挑选编译器和编译选项。<br>位你的系统寻找最好的启动选项。<br>通读MySQL参考手册并阅读Paul DuBios的《MySQL》一书。(已有中文版-译注)<br>多用EXPLAIN SELECT、SHOW VARIABLES、SHOW STATUS和SHOW PROCESSLIST。<br>了解查询优化器的工作原理。<br>优化表的格式。<br>维护你的表(myisamchk、CHECK TABLE、 OPTIMIZE TABLE)<br>使用MySQL的扩展功能以让一切快速完成。<br>如果你注意到了你将在很多场合需要某些函数，编写MySQL UDF函数。<br>不要使用表级或列级的GRANT，除非你确实需要。<br>购买MySQL技术支持以帮助你解决问题憨笑  <p>--------------------------------------------------------------------------------  <p>十、编译和安装MySQL  <p>通过位你的系统挑选可能最好的编译器，你通常可以获得10-30%的性能提高。<br>在Linux/Intel平台上，用pgcc(gcc的奔腾芯片优化版)编译MySQL。然而，二进制代码将只能运行在Intel奔腾CPU上。<br>对于一种特定的平台，使用MySQL参考手册上推荐的优化选项。<br>一般地，对特定CPU的原生编译器(如Sparc的Sun Workshop)应该比gcc提供更好的性能，但不总是这样。<br>用你将使用的字符集编译MySQL。<br>静态编译生成mysqld的执行文件(用--with-mysqld-ldflags=all-static)并用strip sql/mysqld整理最终的执行文件。<br>注意，既然MySQL不使用C++扩展，不带扩展支持编译MySQL将赢得巨大的性能提高。<br>如果操作系统支持原生线程，使用原生线程(而不用mit-pthreads)。<br>用MySQL基准测试来测试最终的二进制代码。  <p>--------------------------------------------------------------------------------  <p>十一、维护  <p>如果可能，偶尔运行一下OPTIMIZE table，这对大量更新的变长行非常重要。<br>偶尔用myisamchk -a更新一下表中的键码分布统计。记住在做之前关掉MySQL。<br>如果有碎片文件，可能值得将所有文件复制到另一个磁盘上，清除原来的磁盘并拷回文件。<br>如果遇到问题，用myisamchk或CHECK table检查表。<br>用mysqladmin -i10 precesslist extended-status监控MySQL的状态。<br>用MySQL GUI客户程序，你可以在不同的窗口内监控进程列表和状态。<br>使用mysqladmin debug获得有关锁定和性能的信息。  <p>--------------------------------------------------------------------------------  <p>十二、优化SQL  <p>扬SQL之长，其它事情交由应用去做。使用SQL服务器来做：  <p>找出基于WHERE子句的行。<br>JOIN表<br>GROUP BY<br>ORDER BY<br>DISTINCT  <p>不要使用SQL来做：  <p>检验数据(如日期)<br>成为一只计算器  <p>技巧：  <p>明智地使用键码。<br>键码适合搜索，但不适合索引列的插入/更新。<br>保持数据为数据库第三范式，但不要担心冗余信息或这如果你需要更快的速度，创建总结表。<br>在大表上不做GROUP BY，相反创建大表的总结表并查询它。<br>UPDATE table set count=count+1 where key_column=constant非常快。<br>对于大表，或许最好偶尔生成总结表而不是一直保持总结表。<br>充分利用INSERT的默认值。  <p>--------------------------------------------------------------------------------  <p>十三、不同SQL服务器的速度差别（以秒计）  <p>+--------------------------+--------+---------+<br>|通过键码读取2000000行： | NT | Linux |<br>+--------------------------+--------+---------+<br>|mysql | 367 | 249 |<br>+--------------------------+--------+---------+<br>|mysql_odbc | 464 | |<br>+--------------------------+--------+---------+　<br>|db2_odbc | 1206 | |<br>+--------------------------+--------+---------+　<br>|informix_odbc | 121126 | |<br>+--------------------------+--------+---------+　<br>|ms-sql_odbc 　 | 1634 | |<br>+--------------------------+--------+---------+<br>|oracle_odbc | 20800 | |<br>+--------------------------+--------+---------+　<br>|solid_odbc | 877 　 | |<br>+--------------------------+--------+---------+<br>|sybase_odbc | 17614 | |<br>+--------------------------+--------+---------+　  <p>+--------------------------+--------+---------+　<br>|插入350768行： | NT | Linux |<br>+--------------------------+--------+---------+<br>|mysql | 381 | 206 |<br>+--------------------------+--------+---------+<br>|mysql_odbc | 619 　 | |<br>+--------------------------+--------+---------+<br>|db2_odbc | 3460 　| |<br>+--------------------------+--------+---------+<br>|informix_odbc | 2692 　| |<br>+--------------------------+--------+---------+<br>|ms-sql_odbc | 4012 　| |<br>+--------------------------+--------+---------+<br>|oracle_odbc | 11291 | |<br>+--------------------------+--------+---------+　<br>|solid_odbc | 1801 　| |<br>+--------------------------+--------+---------+<br>|sybase_odbc | 4802 　| |<br>+--------------------------+--------+---------+  <p>在上述测试中，MySQL配置8M高速缓存运行，其他数据库以默认安装运行。  <p>--------------------------------------------------------------------------------  <p>十四、重要的MySQL启动选项  <p>back_log 如果需要大量新连接，修改它。<br>thread_cache_size 如果需要大量新连接，修改它。<br>key_buffer_size 索引页池，可以设成很大。<br>bdb_cache_size BDB表使用的记录和键吗高速缓存。<br>table_cache 如果有很多的表和并发连接，修改它。<br>delay_key_write 如果需要缓存所有键码写入，设置它。<br>log_slow_queries 找出需花大量时间的查询。<br>max_heap_table_size 用于GROUP BY<br>sort_buffer 用于ORDER BY和GROUP BY<br>myisam_sort_buffer_size 用于REPAIR TABLE<br>join_buffer_size 在进行无键吗的联结时使用。  <p>--------------------------------------------------------------------------------  <p>十五、优化表  <p>MySQL拥有一套丰富的类型。你应该对每一列尝试使用最有效的类型。<br>ANALYSE过程可以帮助你找到表的最优类型：SELECT * FROM table_name PROCEDURE ANALYSE()。<br>对于不保存NULL值的列使用NOT NULL，这对你想索引的列尤其重要。<br>将ISAM类型的表改为MyISAM。<br>如果可能，用固定的表格式创建表。<br>不要索引你不想用的东西。<br>利用MySQL能按一个索引的前缀进行查询的事实。如果你有索引INDEX(a,b)，你不需要在a上的索引。<br>不在长CHAR/VARCHAR列上创建索引，而只索引列的一个前缀以节省存储空间。CREATE TABLE table_name (hostname CHAR(255) not null, index(hostname(10)))<br>对每个表使用最有效的表格式。<br>在不同表中保存相同信息的列应该有同样的定义并具有相同的列名。  <p>--------------------------------------------------------------------------------  <p>十六、MySQL如何次存储数据  <p>数据库以目录存储。<br>表以文件存储。<br>列以变长或定长格式存储在文件中。对BDB表，数据以页面形式存储。<br>支持基于内存的表。<br>数据库和表可在不同的磁盘上用符号连接起来。<br>在Windows上，MySQL支持用.sym文件内部符号连接数据库。  <p>--------------------------------------------------------------------------------  <p>十七、MySQL表类型  <p>HEAP表：固定行长的表，只存储在内存中并用HASH索引进行索引。<br>ISAM表：MySQL 3.22中的早期B-tree表格式。<br>MyIASM：IASM表的新版本，有如下扩展：<br>二进制层次的可移植性。<br>NULL列索引。<br>对变长行比ISAM表有更少的碎片。<br>支持大文件。<br>更好的索引压缩。<br>更好的键吗统计分布。<br>更好和更快的auto_increment处理。<br>来自Sleepcat的Berkeley DB(BDB)表：事务安全(有BEGIN WORK/COMMIT|ROLLBACK)。  <p>--------------------------------------------------------------------------------  <p>十八、MySQL行类型（专指IASM/MyIASM表）  <p>如果所有列是定长格式(没有VARCHAR、BLOB或TEXT)，MySQL将以定长表格式创建表，否则表以动态长度格式创建。<br>定长格式比动态长度格式快很多并更安全。<br>动态长度行格式一般占用较少的存储空间，但如果表频繁更新，会产生碎片。<br>在某些情况下，不值得将所有VARCHAR、BLOB和TEXT列转移到另一个表中，只是获得主表上的更快速度。<br>利用myiasmchk（对ISAM，pack_iasm），可以创建只读压缩表，这使磁盘使用率最小，但使用慢速磁盘时，这非常不错。压缩表充分地利用将不再更新的日志表  <p>--------------------------------------------------------------------------------  <p>十九、MySQL高速缓存（所有线程共享，一次性分配）  <p>键码缓存：key_buffer_size，默认8M。<br>表缓存：table_cache，默认64。<br>线程缓存：thread_cache_size，默认0。<br>主机名缓存：可在编译时修改，默认128。<br>内存映射表：目前仅用于压缩表。<br>注意：MySQL没有运行高速缓存，而让操作系统处理。  <p>--------------------------------------------------------------------------------  <p>二十、MySQL缓存区变量（非共享，按需分配）  <p>sort_buffer：ORDER BY/GROUP BY<br>record_buffer：扫描表。<br>join_buffer_size：无键联结<br>myisam_sort_buffer_size：REPAIR TABLE<br>net_buffer_length:对于读SQL语句并缓存结果。<br>tmp_table_size：临时结果的HEAP表大小。 <p>--------------------------------------------------------------------------------  <p>二十一、MySQL表高速缓存工作原理  <p>每个MyISAM表的打开实例(instance)使用一个索引文件和一个数据文件。如果表被两个线程使用或在同一条查询中使用两次，MyIASM将共享索引文件而是打开数据文件的另一个实例。<br>如果所有在高速缓存中的表都在使用，缓存将临时增加到比表缓存尺寸大些。如果是这样，下一个被释放的表将被关闭。<br>你可以通过检查mysqld的Opened_tables变量以检查表缓存是否太小。如果该值太高，你应该增大表高速缓存。 <p>--------------------------------------------------------------------------------  <p>二十二、MySQL扩展/优化-提供更快的速度  <p>使用优化的表类型（HEAP、MyIASM或BDB表）。<br>对数据使用优化的列。<br>如果可能使用定长行。<br>使用不同的锁定类型（SELECT HIGH_PRIORITY，INSERT LOW_PRIORITY）<br>Auto_increment<br>REPLACE (REPLACE INTO table_name VALUES (...))<br>INSERT DELAYED<br>LOAD DATA INFILE / LOAD_FILE()<br>使用多行INSERT一次插入多行。<br>SELECT INTO OUTFILE<br>LEFT JOIN, STRAIGHT JOIN<br>LEFT JOIN ，结合IS NULL<br>ORDER BY可在某些情况下使用键码。<br>如果只查询在一个索引中的列，将只使用索引树解决查询。<br>联结一般比子查询快（对大多数SQL服务器亦如此）。<br>LIMIT<br>SELECT * from table1 WHERE a &gt; 10 LIMIT 10,20<br>DELETE * from table1 WHERE a &gt; 10 LIMIT 10<br>foo IN (常数列表) 高度优化。<br>GET_LOCK()/RELEASE_LOCK()<br>LOCK TABLES<br>INSERT和SELECT可同时运行。<br>UDF函数可装载进一个正在运行的服务器。<br>压缩只读表。<br>CREATE TEMPORARY TABLE<br>CREATE TABLE .. SELECT<br>带RAID选项的MyIASM表将文件分割成很多文件以突破某些文件系统的2G限制。<br>Delay_keys<br>复制功能  <p>--------------------------------------------------------------------------------  <p>二十二、MySQL何时使用索引  <p>对一个键码使用&gt;, &gt;=, =, &lt;, &lt;=, IF NULL和BETWEEN<br>SELECT * FROM table_name WHERE key_part1=1 and key_part2 &gt; 5;<br>SELECT * FROM table_name WHERE key_part1 IS NULL;  <p>当使用不以通配符开始的LIKE<br>SELECT * FROM table_name WHERE key_part1 LIKE 'jani%'  <p>在进行联结时从另一个表中提取行时<br>SELECT * from t1,t2 where t1.col=t2.key_part  <p>找出指定索引的MAX()或MIN()值<br>SELECT MIN(key_part2),MAX(key_part2) FROM table_name where key_part1=10  <p>一个键码的前缀使用ORDER BY或GROUP BY<br>SELECT * FROM foo ORDER BY key_part1,key_part2,key_part3  <p>在所有用在查询中的列是键码的一部分时间<br>SELECT key_part3 FROM table_name WHERE key_part1=1  <p>--------------------------------------------------------------------------------  <p>二十三、MySQL何时不使用索引  <p>如果MySQL能估计出它将可能比扫描整张表还要快时，则不使用索引。例如如果key_part1均匀分布在1和100之间，下列查询中使用索引就不是很好：<br>SELECT * FROM table_name where key_part1 &gt; 1 and key_part1 &lt; 90  <p>如果使用HEAP表且不用=搜索所有键码部分。  <p>在HEAP表上使用ORDER BY。  <p>如果不是用键码第一部分<br>SELECT * FROM table_name WHERE key_part2=1  <p>如果使用以一个通配符开始的LIKE<br>SELECT * FROM table_name WHERE key_part1 LIKE '%jani%'  <p>搜索一个索引而在另一个索引上做ORDER BY<br>SELECT * from table_name WHERE key_part1 = # ORDER BY key2  <p>--------------------------------------------------------------------------------  <p>二十四、学会使用EXPLAIN  <p>对于每一条你认为太慢的查询使用EXPLAIN!  <p>mysql&gt; explain select t3.DateOfAction, t1.TransactionID<br>-&gt; from t1 join t2 join t3<br>-&gt; where t2.ID = t1.TransactionID and t3.ID = t2.GroupID<br>-&gt; order by t3.DateOfAction, t1.TransactionID;<br>+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+<br>| table | type | possible_keys | key | key_len | ref | rows | Extra |<br>+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+<br>| t1 | ALL | NULL | NULL | NULL | NULL | 11 | Using temporary; Using filesort |<br>| t2 | ref | ID | ID | 4 | t1.TransactionID | 13 | |<br>| t3 | eq_ref | PRIMARY | PRIMARY | 4 | t2.GroupID | 1 | |<br>+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+  <p>ALL和范围类型提示一个潜在的问题。 <p>--------------------------------------------------------------------------------  <p>二十五、学会使用SHOW PROCESSLIST  <p>使用SHOW processlist来发现正在做什么：<br>+----+-------+-----------+----+---------+------+--------------+-------------------------------------+<br>| Id | User | Host | db | Command | Time | State | Info |<br>+----+-------+-----------+----+---------+------+--------------+-------------------------------------+<br>| 6 | monty | localhost | bp | Query | 15 | Sending data | select * from station,station as s1 |<br>| 8 | monty | localhost | | Query | 0 | | show processlist |<br>+----+-------+-----------+----+---------+------+--------------+-------------------------------------+  <p>在mysql或mysqladmin中用KILL来杀死溜掉的线程。<br>--------------------------------------------------------------------------------  <p>二十六、如何知晓MySQL解决一条查询  <p>运行项列命令并试图弄明白其输出：<br>SHOW VARIABLES;<br>SHOW COLUMNS FROM ...\G<br>EXPLAIN SELECT ...\G<br>FLUSH STATUS;<br>SELECT ...;<br>SHOW STATUS;  <p>--------------------------------------------------------------------------------  <p>二十七、MySQL非常不错  <p>日志<br>在进行很多连接时，连接非常快。<br>同时使用SELECT和INSERT的场合。<br>在不把更新与耗时太长的选择结合时。<br>在大多数选择/更新使用唯一键码时。<br>在使用没有长时间冲突锁定的多个表时。<br>在用大表时(MySQL使用一个非常紧凑的表格式)。  <p>--------------------------------------------------------------------------------  <p>二十八、MySQL应避免的事情  <p>用删掉的行更新或插入表，结合要耗时长的SELECT。<br>在能放在WHERE子句中的列上用HAVING。<br>不使用键码或键码不够唯一而进行JOIN。<br>在不同列类型的列上JOIN。<br>在不使用=匹配整个键码时使用HEAP表。<br>在MySQL监控程序中忘记在UPDATE或DELETE中使用一条WHERE子句。如果想这样做，使用mysql客户程序的--i-am-a-dummy选项。  <p>--------------------------------------------------------------------------------  <p>二十九、MySQL各种锁定  <p>内部表锁定<br>LOCK TABLES（所有表类型适用）<br>GET LOCK()/RELEASE LOCK()<br>页面锁定（对BDB表）<br>ALTER TABLE也在BDB表上进行表锁定<br>LOCK TABLES允许一个表有多个读者和一个写者。<br>一般WHERE锁定具有比READ锁定高的优先级以避免让写入方干等。对于不重要的写入方，可以使用LOW_PRIORITY关键字让锁定处理器优选读取方。<br>UPDATE LOW_PRIORITY SET value=10 WHERE id=10;  <p>--------------------------------------------------------------------------------  <p>三十、给MySQL更多信息以更好地解决问题的技巧  <p>注意你总能去掉(加注释)MySQL功能以使查询可移植：  <p>SELECT /*! SQL_BUFFER_RESULTS */ ...<br>SELECT SQL_BUFFER_RESULTS ...<br>将强制MySQL生成一个临时结果集。只要所有临时结果集生成后，所有表上的锁定均被释放。这能在遇到表锁定问题时或要花很长时间将结果传给客户端时有所帮助。<br>SELECT SQL_SMALL_RESULT ... GROUP BY ...<br>告诉优化器结果集将只包含很少的行。<br>SELECT SQL_BIG_RESULT ... GROUP BY ...<br>告诉优化器结果集将包含很多行。<br>SELECT STRAIGHT_JOIN ...<br>强制优化器以出现在FROM子句中的次序联结表。<br>SELECT ... FROM table_name [USE INDEX (index_list) | IGNORE INDEX (index_list)] table_name2<br>强制MySQL使用/忽略列出的索引。  <p>--------------------------------------------------------------------------------  <p>三十一、事务的例子  <p>MyIASM表如何进行事务处理:<br>mysql&gt; LOCK TABLES trans READ, customer WRITE;<br>mysql&gt; select sum(value) from trans where customer_id=some_id;<br>mysql&gt; update customer set total_value=sum_from_previous_statement<br>where customer_id=some_id;<br>mysql&gt; UNLOCK TABLES;  <p>BDB表如何进行事务:<br>mysql&gt; BEGIN WORK;<br>mysql&gt; select sum(value) from trans where customer_id=some_id;<br>mysql&gt; update customer set total_value=sum_from_previous_statement<br>where customer_id=some_id;<br>mysql&gt; COMMIT;  <p>注意你可以通过下列语句回避事务:<br>UPDATE customer SET value=value+new_value WHERE customer_id=some_id;  <p>--------------------------------------------------------------------------------  <p>三十二、使用REPLACE的例子  <p>REPLACE的功能极像INSERT，除了如果一条老记录在一个唯一索引上具有与新纪录相同的值，那么老记录在新纪录插入前则被删除。不使用  <p>SELECT 1 FROM t1 WHERE key=#<br>IF found-row<br>LOCK TABLES t1<br>DELETE FROM t1 WHERE key1=#<br>INSERT INTO t1 VALUES (...)<br>UNLOCK TABLES t1;<br>ENDIF  <p>而用<br>REPLACE INTO t1 VALUES (...)  <p>--------------------------------------------------------------------------------  <p>三十三、一般技巧  <p>使用短主键。联结表时使用数字而非字符串。<br>当使用多部分键码时，第一部分应该时最常用的部分。<br>有疑问时，首先使用更多重复的列以获得更好地键码压缩。<br>如果在同一台机器上运行MySQL客户和服务器，那么在连接MySQL时则使用套接字而不是TCP/IP（这可以提高性能7.5%）。可在连接MySQL服务器时不指定主机名或主机名为localhost来做到。<br>如果可能，使用--skip-locking(在某些OS上为默认)，这将关闭外部锁定并将提高性能。<br>使用应用层哈希值而非长键码：<br>SELECT * FROM table_name WHERE hash=MD5(concat(col1,col2)) AND<br>col_1='constant' AND col_2='constant'  <p>在文件中保存需要以文件形式访问的BLOB，在数据库中只保存文件名。<br>删除所有行比删除一大部分行要快。<br>如果SQL不够快，研究一下访问数据的较底层接口。  <p>--------------------------------------------------------------------------------  <p>三十四、使用MySQL 3.23的好处  <p>MyISAM：可移植的大表格式<br>HEAP：内存中的表<br>Berkeley DB：支持事务的表。<br>众多提高的限制<br>动态字符集<br>更多的STATUS变量<br>CHECK和REPAIR表<br>更快的GROUP BY和DISTINCT<br>LEFT JOIN ... IF NULL的优化<br>CREATE TABLE ... SELECT<br>CREATE TEMPORARY table_name (...)<br>临时HEAP表到MyISAM表的自动转换<br>复制<br>mysqlhotcopy脚本  <p>--------------------------------------------------------------------------------  <p>三十五、正在积极开发的重要功能  <p>改进事务处理<br>失败安全的复制<br>正文搜索<br>多个表的删除(之后完成多个表的更新)<br>更好的键码缓存<br>原子RENAME (RENAME TABLE foo as foo_old, foo_new as foo)<br>查询高速缓存<br>MERGE TABLES<br>一个更好的GUI客户程序 <p>MySQL优化简明指南  <p>--------------------------------------------------------------------------------  <p>2004-05-25  <p>一、在编译时优化MySQL<br>如果你从源代码分发安装MySQL，要注意，编译过程对以后的目标程序性能有重要的影响，不同的编译方式可能得到类似的目标文件，但性能可能相差很大，因此，在编译安装MySQL适应仔细根据你的应用类型选择最可能好的编译选项。这种定制的MySQL可以为你的应用提供最佳性能。  <p>技巧：选用较好的编译器和较好的编译器选项，这样应用可提高性能10-30%。（MySQL文档如是说）  <p>1.1、使用pgcc（Pentium GCC)编译器<br>该编译器（<a href="http://www.goof.com/pcg/）针对运行?...继谙低成杓频摹?">http://www.goof.com/pcg/）针对运行?...继谙低成杓频摹?</a> <p>1.2、仅使用你想使用的字符集编译MySQL<br>MySQL目前提供多达24种不同的字符集，为全球用户以他们自己的语言插入或查看表中的数据。却省情况下，MySQL安装所有者这些字符集，热然而，最好的选择是指选择一种你需要的。如，禁止除Latin1字符集以外的所有其它字符集：  <p>--------------------------------------------------------------------------------<br>%&gt;./configure -with-extra-charsets=none [--other-configuration-options]<br>--------------------------------------------------------------------------------  <p>1.3、将mysqld编译成静态执行文件<br>将mysqld编译成静态执行文件而无需共享库也能获得更好的性能。通过在配置时指定下列选项，可静态编译mysqld。  <p>--------------------------------------------------------------------------------<br>%&gt;./configure -with-mysqld-ldflags=-all-static [--other-configuration-options]<br>--------------------------------------------------------------------------------  <p>1.4、配置样本<br>下列配置命令常用于提高性能：  <p>--------------------------------------------------------------------------------<br>%&gt;CFLAGS="-O6 -mpentiumpro -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared<br>--------------------------------------------------------------------------------  <p>二、调整服务器<br>确保运用正确的编译固然重要，但这只是成功的第一步，配置众多的MySQL变量同样对服务器的正常运行起关键作用。你可以将这些变量的赋值存在一个配置文件中，以确保它们在每次启动MySQL时均起作用，这个配置文件就是my.cnf文件。  <p>MySQL已经提供了几个my.cnf文件的样本，可在/usr/local/mysqld/share/mysql/目录下找到。这些文件分别命名为 my-small.cnf、 my-medium.cnf、my-large.cnf和my-huge.cnf，规模说明可在描述配置文件适用的系统类型标题中找到。如果在只有相当少内存的系统上运行MySQL，而且只是偶尔的用一下，那么my-small.cnf会比较理想，因为它命令mysqld只使用最少的资源。类似地，如果你计划构建电子商务超市，而且系统拥有2G内存，那么你可能要用到mysql-huge.cnf文件了。  <p>为了利用这些文件中的一个，你需要复制一个最适合需求的文件，改名为my.cnf。你可以选择使用配置文件三种作用范围的一种：  <p>Global：将my.cnf文件复制到服务器的/etc目录下，这使得配置文件中的变量作用于全局，即对所有服务器上的MySQL数据库服务器有效。<br>Local：将my.cnf文件复制到[MYSQL-INSTALL-DIR]/var/目录下，使得my.cnf作用于特定的服务器。[MYSQL-INSTALL-DIR]表示MySQL安装目录。<br>User：你可以再限制作用于特定的用户，将my.cnf复制到用户的根目录下。<br>究竟如何设置my.cnf中的这些变量呢？更进一步说，你可以设置哪一个变量。虽然所用变量对MySQL服务器相对通用，每一个变量与MySQL的的某些组件有更特定的关系。如变量max_connects归在mysqld类别下。执行下列命令即可知道：  <p>--------------------------------------------------------------------------------<br>%&gt;/usr/local/mysql/libexec/mysqld --help<br>--------------------------------------------------------------------------------  <p>它显示大量的选项及与mysqld相关的变量。你可以很容易地在该行文字之下找出变量：  <p>--------------------------------------------------------------------------------<br>Possible variables for option --set-variable (-O) are<br>--------------------------------------------------------------------------------  <p>然后你可以如下设置my.cnf中的那些变量：  <p>--------------------------------------------------------------------------------<br>set-variable = max_connections=100<br>--------------------------------------------------------------------------------  <p>它设置MySQL服务器的最大并发连接数为100。要确保在my.cnf文件中的[mysqld]标题下插入变量设置。<br>三、表类型  <p>很多MySQL用户可能很惊讶，MySQL确实为用户提供5种不同的表类型，称为DBD、HEAP、ISAM、MERGE和MyIASM。DBD归为事务安全类，而其他为非事务安全类。  <p>3.1、事务安全  <p>DBD<br>Berkeley DB(DBD)表是支持事务处理的表，由Sleepycat软件公司(<a href="http://www.sleepycat.com)开发。它提供MySQL用户期待已久的功能-事务控制。事务控制在任何数据库系统中都是一个极有价值的功能，因为它们确保一组命令能成功地执行。">http://www.sleepycat.com)开发。它提供MySQL用户期待已久的功能-事务控制。事务控制在任何数据库系统中都是一个极有价值的功能，因为它们确保一组命令能成功地执行。</a> <p>3.2、非事务安全  <p>HEAP  <p>HEAP表是MySQL中存取数据最快的表。这是因为他们使用存储在动态内存中的一个哈希索引。另一个要点是如果MySQL或服务器崩溃，数据将丢失。  <p>ISAM  <p>ISAM表是早期MySQL版本的缺省表类型，直到MyIASM开发出来。建议不要再使用它。  <p>MERGE  <p>MERGE是一个有趣的新类型，在3.23.25之后出现。一个MERGE表实际上是一个相同MyISAM表的集合，合并成一个表，主要是为了效率原因。这样可以提高速度、搜索效率、修复效率并节省磁盘空间。  <p>MyIASM  <p>这是MySQL的缺省表类型。它基于IASM代码，但有很多有用的扩展。MyIASM比较好的原因：  <p>MyIASM表小于IASM表，所以使用较少资源。<br>MyIASM表在不同的平台上二进制层可移植。<br>更大的键码尺寸，更大的键码上限。<br>3.3、指定表类型  <p>你可在创建表时指定表的类型。下例创建一个HEAP表：  <p>--------------------------------------------------------------------------------  <p>mysql&gt;CREATE TABLE email_addresses TYPE=HEAP (<br>-&gt;email char(55) NOT NULL,<br>-&gt;name char(30) NOT NULL,<br>-&gt;PRIMARY KEY(email) );  <p>--------------------------------------------------------------------------------  <p>BDB表需要一些配置工作，参见http://www.mysql.com/doc/B/D/BDB_overview.html。  <p>3.4、更多的表类型  <p>为了使MySQL管理工作更有趣，即将发布的MySQL 4.0将提供两种新的表类型，称为Innobase和Gemeni。  <p>4、优化工具  <p>MySQL服务器本身提供了几条内置命令用于帮助优化。  <p>4.1、SHOW  <p>你可能有兴趣知道MySQL服务器究竟更了什么，下列命令给出一个总结：  <p>--------------------------------------------------------------------------------<br>mysql&gt;show status;<br>--------------------------------------------------------------------------------  <p>它给出了一个相当长的状态变量及其值的列表。有些变量包含了异常终止客户的数量、异常终止连接的数量、连接尝试的次数、最大并发连接数和大量其他有用的信息。这些信息对找出系统问题和低效极具价值。<br>SHOW还能做更多的事情。它可以显示关于日志文件、特定数据库、表、索引、进程和权限表中有价值的信息。详见MySQL手册。  <p>4.2、EXPLAIN  <p>当你面对SELECT语句时，EXPLAIN解释SELECT命令如何被处理。这不仅对决定是否应该增加一个索引，而且对决定一个复杂的Join如何被MySQL处理都是有帮助的。  <p>4.3、OPTIMIZE  <p>OPTIMIZE语句允许你恢复空间和合并数据文件碎片，对包含变长行的表进行了大量更新和删除后，这样做特别重要。OPTIMIZE目前只工作于MyIASM和BDB表。</p><img src ="http://www.blogjava.net/beansoft/aggbug/109432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-04-09 15:55 <a href="http://www.blogjava.net/beansoft/archive/2007/04/09/109432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL 5 绿色版(BAT版本)</title><link>http://www.blogjava.net/beansoft/archive/2007/02/05/97940.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Mon, 05 Feb 2007 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/02/05/97940.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/97940.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/02/05/97940.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/97940.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/97940.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 为了做一套开源的 MySQL 5 绿色版, 完全控制启动停止, 我把 Mysql 绿色版用BAT文件重新包装了一遍.&nbsp;&nbsp;<a href='http://www.blogjava.net/beansoft/archive/2007/02/05/97940.html'>阅读全文</a><img src ="http://www.blogjava.net/beansoft/aggbug/97940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-02-05 11:00 <a href="http://www.blogjava.net/beansoft/archive/2007/02/05/97940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于 Apache DBCP 的数据库连接获取类(原创)</title><link>http://www.blogjava.net/beansoft/archive/2007/01/19/94882.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Fri, 19 Jan 2007 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2007/01/19/94882.html</guid><wfw:comment>http://www.blogjava.net/beansoft/comments/94882.html</wfw:comment><comments>http://www.blogjava.net/beansoft/archive/2007/01/19/94882.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/beansoft/comments/commentRss/94882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/beansoft/services/trackbacks/94882.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 基于 Apache DBCP 的数据库连接获取类, 可以让你在 Tomcat 之外的 J2SE 程序或者其它应用服务器上使用 Apache 的数据库连接池.&nbsp;&nbsp;<a href='http://www.blogjava.net/beansoft/archive/2007/01/19/94882.html'>阅读全文</a><img src ="http://www.blogjava.net/beansoft/aggbug/94882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2007-01-19 11:04 <a href="http://www.blogjava.net/beansoft/archive/2007/01/19/94882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>