??xml version="1.0" encoding="utf-8" standalone="yes"?>91久久久久久久久久久,精品久久久亚洲,综合欧美国产视频二区http://www.aygfsteel.com/liaojiyong/category/11448.htmlzh-cnFri, 23 Mar 2007 14:09:36 GMTFri, 23 Mar 2007 14:09:36 GMT60Java jdbc数据库连接池ȝQ{Q?/title><link>http://www.aygfsteel.com/liaojiyong/archive/2007/03/23/105715.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 23 Mar 2007 01:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/liaojiyong/archive/2007/03/23/105715.html</guid><wfw:comment>http://www.aygfsteel.com/liaojiyong/comments/105715.html</wfw:comment><comments>http://www.aygfsteel.com/liaojiyong/archive/2007/03/23/105715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/liaojiyong/comments/commentRss/105715.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/liaojiyong/services/trackbacks/105715.html</trackback:ping><description><![CDATA[1. 引言 <p>  q年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算?/p><p>  应用E序已从传统的桌面应用{到Web应用。基于B/SQBrowser/ServerQ架构的3层开发模式逐渐取代C/SQClient/ServerQ架构的开发模式,成ؓ开发企业应用和电子商务普遍采用的技术。在Web应用开发的早期Q主要用的技术是<a target="_blank"><font color="#3080cb">CGI</font></a>H?a target="_blank"><font color="#3080cb">ASP</font></a>H?a target="_blank"><font color="#3080cb">PHP</font></a>{。之后,Sun公司推出了基?a target="_blank"><font color="#3080cb">Java</font></a>语言的Servlet+Jsp+JavaBean技术。相比传l的开发技术,它具有跨q_H?a target="_blank"><font color="#3080cb">安全</font></a>H有效﹑可移植等Ҏ,q其更便于使用和开发?/p><p>  Java应用E序讉K<a target="_blank"><font color="#3080cb">数据?/font></a>的基本原?/p><p>  在Java语言中,JDBCQJava DataBase ConnectionQ是应用E序与数据库沟通的桥梁,</p><p>  即Java语言通过JDBC技术访问数据库。JDBC是一U“开䏀的ҎQ它为数据库应用开发h员﹑数据库前台工具开发h员提供了一U标准的应用E序<a target="_blank"><font color="#3080cb">设计</font></a>接口Q开发h员可以用UJava语言~写完整的数据库应用E序。JDBC提供两种APIQ分别是面向开发h员的API和面向底层的JDBC驱动E序APIQ底层主要通过直接的JDBC驱动和JDBC-ODBC桥驱动实C数据库的q接?/p><p>  一般来_Java应用E序讉K数据库的q程Q如?所C)是:</p><p>  ①装载数据库驱动E序Q?/p><p>  ②通过JDBC建立数据库连接;</p><p>  ③访问数据库Q执行SQL语句Q?/p><p>  ④断开数据库连接?/p><div align="center"><img src="http://web.rdxx.com/Files/Pic/Img/JSP_Skill/0682916281387862.gif" border="0" /><br />? Java数据库访问机?/div><div align="left">  JDBC作ؓ一U数据库讉K技术,h单易用的优点。但使用q种模式q行Web应用</div><div align="left">  E序开发,存在很多问题Q首先,每一ơWebh都要建立一ơ数据库q接。徏立连接是一个费时的zdQ每ơ都得花?.05s?s的时_而且pȝq要分配内存资源。这个时间对于一ơ或几次数据库操作,或许感觉不出pȝ有多大的开销。可是对于现在的Web应用Q尤其是大型电子商务<a target="_blank"><font color="#3080cb">|站</font></a>Q同时有几百人甚臛_千h在线是很正常的事。在q种情况下,频繁的进行数据库q接操作势必占用很多的系l资源,|站的响应速度必定下降Q严重的甚至会造成服务器的崩溃。不是危a耸听Q这是制约某些电子商务|站发展的技术瓶颈问题。其ơ,对于每一ơ数据库q接Q用完后都得断开。否则,如果E序出现异常而未能关闭,会D数据库系l中的内存泄漏,最l将不得不重启数据库。还有,q种开发不能控制被创徏的连接对象数Q系l资源会被毫无顾及的分配出去Q如q接q多Q也可能D内存泄漏Q服务器崩溃?/div><div align="left"> </div><div align="left">  数据库连接池Qconnection poolQ的工作原理</div><div align="left">  1、基本概念及原理<br />׃面的分析可以看出Q问题的Ҏ在于对<a target="_blank"><font color="#3080cb">数据?/font></a>q接资源的低效管理。我们知道, <div align="left">  对于׃n资源Q有一个很著名?a target="_blank"><font color="#3080cb">设计</font></a>模式Q资源池QResource PoolQ。该模式正是Z解决资源的频J分配﹑释放所造成的问题。ؓ解决上述问题Q可以采用数据库q接池技术。数据库q接池的基本思想是为数据库q接建立一个“缓冲池”。预先在~冲池中攑օ一定数量的q接Q当需要徏立数据库q接Ӟ只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过讑֮q接池最大连接数来防止系l无的与数据库q接。更为重要的是我们可以通过q接池的理机制监视数据库的q接的数量﹑使用情况Qؓpȝ开发﹑试及性能调整提供依据。连接池的基本工作原理见下图2?/div><div align="center"><img src="http://web.rdxx.com/Files/Pic/Img/JSP_Skill/0682916281311029.gif" border="0" /><br />? q接池的基本工作原理</div><div align="left">  2、服务器自带的连接池</div><div align="left">  JDBC的API中没有提供连接池的方法。一些大型的WEB应用服务器如BEA的WebLogic和IBM的WebSphere{提供了q接池的机制Q但是必L其第三方的专用类Ҏ支持q接池的用法?/div><div align="left">  q接池关键问题分?/div><div align="left">  1、ƈ发问?/div><div align="left">  Z使连接管理服务具有最大的通用性,必须考虑多线E环境,卛_ƈ发问题。这个问题相Ҏ较好解决Q因?a target="_blank"><font color="#3080cb">Java</font></a>语言自n提供了对q发理的支持,使用synchronized关键字即可确保线E是同步的。用方法ؓ直接在类Ҏ前面加上synchronized关键字,如:</div><div align="left">public synchronized Connection getConnectionQ) </div><div align="left">  2、多数据库服务器和多用户</div><div align="left">  对于大型的企业应用Q常帔R要同时连接不同的数据库(如连?a target="_blank"><font color="#3080cb">Oracle</font></a>?a target="_blank"><font color="#3080cb">Sybase</font></a>Q。如何连接不同的数据库呢Q我们采用的{略是:设计一个符合单例模式的q接池管理类Q在q接池管理类的唯一实例被创建时d一个资源文Ӟ其中资源文g中存攄多个数据库的url地址Q?lt;poolName.url>Q﹑用户名(<poolName.user>Q﹑密码Q?lt;poolName.password>Q等信息。如tx.url=192.168.1.123:5000/tx_itQtx.user=cylQtx.password=123456。根据资源文件提供的信息Q创建多个连接池cȝ实例Q每一个实例都是一个特定数据库的连接池。连接池理cd例ؓ每个q接池实例取一个名字,通过不同的名字来理不同的连接池?/div><div align="left">  对于同一个数据库有多个用户用不同的名称和密码访问的情况Q也可以通过资源文g处理Q即在资源文件中讄多个h相同url地址Q但h不同用户名和密码的数据库q接信息?/div><div align="left">  3、事务处?/div><div align="left">  我们知道Q事务具有原子性,此时要求Ҏ据库的操作符合“ALL-ALL-NOTHING”原?卛_于一lSQL语句要么全做Q要么全不做?br />?a target="_blank"><font color="#3080cb">Java</font></a>语言中,ConnectioncLw提供了对事务的支持Q可以通过讄Connection的AutoCommit属性ؓfalse,然后昑ּ的调用commit或rollbackҎ来实现。但要高效的q行Connection复用Q就必须提供相应的事务支持机制。可采用每一个事务独占一个连接来实现Q这U方法可以大大降低事务管理的复杂性? <div align="left">  4、连接池的分配与释放</div><div align="left">  q接池的分配与释放,对系l的性能有很大的影响。合理的分配与释放,可以提高q接的复用度Q从而降低徏立新q接的开销Q同时还可以加快用户的访问速度?/div><div align="left">  对于q接的管理可使用I闲池。即把已l创Z未分配出去的连接按创徏旉存放C个空闲池中。每当用戯求一个连接时Q系l首先检查空闲池内有没有I闲q接。如果有把建立旉最长(通过容器的顺序存攑֮玎ͼ的那个连接分配给他(实际是先做连接是否有效的判断Q如果可用就分配l用P如不可用把q个q接从空闲池删掉Q重新检空闲池是否q有q接Q;如果没有则检查当前所开q接池是否达到连接池所允许的最大连接数QmaxConnQ?如果没有辑ֈQ就新徏一个连接,如果已经辑ֈQ就{待一定的旉QtimeoutQ。如果在{待的时间内有连接被释放出来可以把q个q接分配l等待的用户Q如果等待时间超q预定时间timeout,则返回空|nullQ。系l对已经分配出去正在使用的连接只做计敎ͼ当用完后再q还l空闲池。对于空闲连接的状态,可开辟专门的U程定时,q样会花费一定的pȝ开销Q但可以保证较快的响应速度。也可采取不开辟专门线E,只是在分配前的Ҏ?/div><div align="left">  5、连接池的配|与l护</div><div align="left">  q接池中到底应该攄多少q接Q才能ɾpȝ的性能最佻Ipȝ可采取设|最连接数QminConnQ和最大连接数QmaxConnQ来控制q接池中的连接。最连接数是系l启动时q接池所创徏的连接数。如果创多,则系l启动就慢,但创建后pȝ的响应速度会很快;如果创徏q少Q则pȝ启动的很快,响应h却慢。这P可以在开发时Q设|较的最连接数Q开发v来会快,而在pȝ实际使用时设|较大的Q因样对讉K客户来说速度会快些。最大连接数是连接池中允许连接的最大数目,具体讄多少Q要看系l的讉K量,可通过反复试Q找到最佳点?/div><div align="left">  如何保q接池中的最连接数呢?有动态和静态两U策略。动态即每隔一定时间就对连接池q行,如果发现q接数量于最连接数Q则补充相应数量的新q接,以保证连接池的正常运转。静态是发现I闲q接不够时再L查?br />q接池的实现 <div align="left">  1、连接池模型</div><div align="left">  本文讨论的连接池包括一个连接池c(DBConnectionPoolQ和一个连接池理c(DBConnetionPoolManagerQ和一个配|文件操作类(ParseDSConfig)。连接池cLҎ一<a target="_blank"><font color="#3080cb">数据?/font></a>所有连接的“缓冲池”,主要实现以下功能Q①从连接池获取或创建可用连接;②用完毕之后,把连接返q给q接池;③在pȝ关闭前,断开所有连接ƈ释放q接占用的系l资源;④还能够处理无效q接Q原来登Cؓ可用的连接,׃某种原因不再可用Q如时Q通讯问题Q,q能够限制连接池中的q接L不低于某个预定值和不超q某个预定倹{?5)当多数据库时,且数据库是动态增加的?会加到配置文g中?/div><div align="left">  q接池管理类是连接池cȝ外覆c(wrapperQ?W合单例模式Q即pȝ中只能有一个连接池理cȝ实例。其主要用于对多个连接池对象的管理,h以下功能Q①装蝲q注册特定数据库的JDBC驱动E序Q②Ҏ属性文件给定的信息Q创接池对象Q③为方便管理多个连接池对象Qؓ每一个连接池对象取一个名字,实现q接池名字与其实例之间的映射Q④跟踪客户使用q接情况Q以侉K要是关闭q接释放资源。连接池理cȝ引入主要是ؓ了方便对多个q接池的使用和管理,如系l需要连接不同的数据库,或连接相同的数据库但׃<a target="_blank"><font color="#3080cb">安全</font></a>性问题,需要不同的用户使用不同的名U和密码?br />         2、连接池实现(l过本h改版,可以适用多数据库cd的应用以及一U数据库cd多个数据库且数据  库的数量可以动态增加的应用E序)<br />         1),DBConnectionPool.java   数据库连接池c?br />         2),DBConnectionManager .java   数据库管理类<br />         3),DSConfigBean .java                单个数据库连接信息Bean<br />         4),ParseDSConfig.java                操作?q个'?包括不同的数据库和同一U数据库有多个数据库)<br />                                                            数据 配置文gxml<br />         5),ds.config.xml                           数据库配|文件xml<br />         原代码如? <br />        DBConnectionPool.java   <br />        ----------------------------------------------------------<br />      /**<br /> * 数据库连接池c?br /> */<br />package <a ><font color="#000000">com.chunkyo.db</font></a>;</div><div align="left">import java.sql.Connection;<br />import java.sql.DriverManager;<br />import java.sql.SQLException;<br />import java.util.ArrayList;<br />import java.util.Iterator;<br />import java.util.Timer;</div><div align="left">/**<br /> * @author chenyanlin<br /> *<br /> */<br />public class DBConnectionPool implements TimerListener {</div><div align="left"> private Connection con=null;<br /> private int inUsed=0;    //使用的连接数<br /> private ArrayList freeConnections = new ArrayList();//容器Q空闲连?br /> private int minConn;     //最连接数<br /> private int maxConn;     //最大连?br /> private String name;     //q接池名?br /> private String password; //密码<br /> private String url;      //数据库连接地址<br /> private String driver;   //驱动<br /> private String user;     //用户?br /> public Timer timer;      //定时<br /> /**<br />  * <br />  */<br /> public DBConnectionPool() {<br />  // TODO Auto-generated constructor stub<br /> }<br /> /**<br />  * 创徏q接?br />  * @param driver<br />  * @param name<br />  * @param URL<br />  * @param user<br />  * @param password<br />  * @param maxConn<br />  */<br /> public DBConnectionPool(String name, String driver,String URL, String user, String password, int maxConn)<br /> {<br />  this.name=name;<br />  this.driver=driver;<br />  this.url=URL;<br />  this.user=user;<br />  this.password=password;<br />  this.maxConn=maxConn;<br /> }<br /> /**<br />  * 用完Q释放连?br />  * @param con<br />  */<br /> public synchronized void freeConnection(Connection con) <br /> {<br />  this.freeConnections.add(con);//d到空闲连接的末尾<br />  this.inUsed--;<br /> }<br /> /**<br />  * timeout  Ҏtimeout得到q接<br />  * @param timeout<br />  * @return<br />  */<br /> public synchronized Connection getConnection(long timeout)<br /> {<br />  Connection con=null;<br />  if(this.freeConnections.size()>0)<br />  {<br />   con=(Connection)this.freeConnections.get(0);<br />   if(con==null)con=getConnection(timeout); //l箋获得q接<br />  }<br />  else<br />  {<br />   con=newConnection(); //新徏q接<br />  }<br />  if(this.maxConn==0||this.maxConn<this.inUsed)<br />  {<br />   con=null;//辑ֈ最大连接数Q暂时不能获得连接了?br />  }<br />  if(con!=null)<br />  {<br />   this.inUsed++;<br />  }<br />  return con;<br /> }<br /> /**<br />  * <br />  * 从连接池里得到连?br />  * @return<br />  */<br /> public synchronized Connection getConnection()<br /> {<br />  Connection con=null;<br />  if(this.freeConnections.size()>0)<br />  {<br />   con=(Connection)this.freeConnections.get(0);<br />   this.freeConnections.remove(0);//如果q接分配出去了,׃I闲q接里删?br />   if(con==null)con=getConnection(); //l箋获得q接<br />  }<br />  else<br />  {<br />   con=newConnection(); //新徏q接<br />  }<br />  if(this.maxConn==0||this.maxConn<this.inUsed)<br />  {<br />   con=null;//{待 过最大连接时<br />  }<br />  if(con!=null)<br />  {<br />   this.inUsed++;<br />   System.out.println("得到 "+this.name+" 的连接,现有"+inUsed+"个连接在使用!");<br />  }<br />  return con;<br /> }<br /> /**<br />  *释放全部q接<br />  *<br />  */<br /> public synchronized void release()<br /> {<br />  Iterator allConns=this.freeConnections.iterator();<br />  while(allConns.hasNext())<br />  {<br />   Connection con=(Connection)allConns.next();<br />   try<br />   {<br />    con.close();<br />   }<br />   catch(SQLException e)<br />   {<br />    e.printStackTrace();<br />   }<br />   <br />  }<br />  this.freeConnections.clear();<br />   <br /> }<br /> /**<br />  * 创徏新连?br />  * @return<br />  */<br /> private Connection newConnection()<br /> {<br />  try {<br />   Class.forName(driver);<br />   con=DriverManager.getConnection(url, user, password);<br />  } catch (ClassNotFoundException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />   System.out.println("sorry can't find db driver!");<br />  } catch (SQLException e1) {<br />   // TODO Auto-generated catch block<br />   e1.printStackTrace();<br />   System.out.println("sorry can't create Connection!");<br />  }<br />  return con;<br />  <br /> }<br /> /**<br />  * 定时处理函数<br />  */<br /> public synchronized void TimerEvent() <br /> {<br />     //暂时q没有实C后会加上?br /> }</div><div align="left"> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub</div><div align="left"> }<br /> /**<br />  * @return the driver<br />  */<br /> public String getDriver() {<br />  return driver;<br /> }<br /> /**<br />  * @param driver the driver to set<br />  */<br /> public void setDriver(String driver) {<br />  this.driver = driver;<br /> }<br /> /**<br />  * @return the maxConn<br />  */<br /> public int getMaxConn() {<br />  return maxConn;<br /> }<br /> /**<br />  * @param maxConn the maxConn to set<br />  */<br /> public void setMaxConn(int maxConn) {<br />  this.maxConn = maxConn;<br /> }<br /> /**<br />  * @return the minConn<br />  */<br /> public int getMinConn() {<br />  return minConn;<br /> }<br /> /**<br />  * @param minConn the minConn to set<br />  */<br /> public void setMinConn(int minConn) {<br />  this.minConn = minConn;<br /> }<br /> /**<br />  * @return the name<br />  */<br /> public String getName() {<br />  return name;<br /> }<br /> /**<br />  * @param name the name to set<br />  */<br /> public void setName(String name) {<br />  this.name = name;<br /> }<br /> /**<br />  * @return the password<br />  */<br /> public String getPassword() {<br />  return password;<br /> }<br /> /**<br />  * @param password the password to set<br />  */<br /> public void setPassword(String password) {<br />  this.password = password;<br /> }<br /> /**<br />  * @return the url<br />  */<br /> public String getUrl() {<br />  return url;<br /> }<br /> /**<br />  * @param url the url to set<br />  */<br /> public void setUrl(String url) {<br />  this.url = url;<br /> }<br /> /**<br />  * @return the user<br />  */<br /> public String getUser() {<br />  return user;<br /> }<br /> /**<br />  * @param user the user to set<br />  */<br /> public void setUser(String user) {<br />  this.user = user;<br /> }</div><div align="left">}<br /><br />-------------------------------------------<br /> DBConnectionManager .java<br />------------------------------------------<br />/**<br /> * 数据库连接池理c?br /> */<br />package <a ><font color="#000000">com.chunkyo.db</font></a>;</div><div align="left">import java.sql.Connection;<br />import java.util.ArrayList;<br />import java.util.Enumeration;<br />import java.util.HashMap;<br />import java.util.Hashtable;<br />import java.util.Iterator;<br />import java.util.Properties;<br />import java.util.Vector;</div><div align="left">import <a ><font color="#000000">com.chunkyo.db.ParseDSConfig</font></a>;<br />import <a ><font color="#000000">com.chunkyo.db.DSConfigBean</font></a>;<br />import <a ><font color="#000000">com.chunkyo.db.DBConnectionPool</font></a>;</div><div align="left">/**<br /> * @author chenyanlin<br /> *<br /> */<br />public class DBConnectionManager {</div><div align="left"> static private DBConnectionManager instance;//唯一数据库连接池理实例c?br /> static private int clients;                 //客户q接?br /> private Vector drivers  = new Vector();//驱动信息<br /> private Hashtable pools=new Hashtable();//q接?br /> <br /> /**<br />  * 实例化管理类<br />  */<br /> public DBConnectionManager() {<br />  // TODO Auto-generated constructor stub<br />  this.init();<br /> }<br /> /**<br />  * 得到唯一实例理c?br />  * @return<br />  */<br /> static synchronized public DBConnectionManager getInstance()<br /> {<br />  if(instance==null)<br />  {<br />   instance=new DBConnectionManager();<br />  }<br />  return instance;<br />  <br /> }<br /> /**<br />  * 释放q接<br />  * @param name<br />  * @param con<br />  */<br /> public void freeConnection(String name, Connection con)<br /> {<br />  DBConnectionPool pool=(DBConnectionPool)pools.get(name);//Ҏ关键名字得到q接?br />  if(pool!=null)<br />  pool.freeConnection(con);//释放q接 <br /> }<br /> /**<br />  * 得到一个连接根据连接池的名字name<br />  * @param name<br />  * @return<br />  */<br /> public Connection getConnection(String name)<br /> {<br />  DBConnectionPool pool=null;<br />  Connection con=null;<br />  pool=(DBConnectionPool)pools.get(name);//从名字中获取q接?br />  con=pool.getConnection();//从选定的连接池中获得连?br />  if(con!=null)<br />  System.out.println("得到q接。。?);<br />  return con;<br /> }<br /> /**<br />  * 得到一个连接,Ҏq接池的名字和等待时?br />  * @param name<br />  * @param time<br />  * @return<br />  */<br /> public Connection getConnection(String name, long timeout)<br /> {<br />  DBConnectionPool pool=null;<br />  Connection con=null;<br />  pool=(DBConnectionPool)pools.get(name);//从名字中获取q接?br />  con=pool.getConnection(timeout);//从选定的连接池中获得连?br />  System.out.println("得到q接。。?);<br />  return con;<br /> }<br /> /**<br />  * 释放所有连?br />  */<br /> public synchronized void release()<br /> {<br />  Enumeration allpools=pools.elements();<br />  while(allpools.hasMoreElements())<br />  {<br />   DBConnectionPool pool=(DBConnectionPool)allpools.nextElement();<br />   if(pool!=null)pool.release();<br />  }<br />  pools.clear();<br /> }</div><div align="left"> /**<br />  * 创徏q接?br />  * @param props<br />  */<br /> private void createPools(DSConfigBean dsb)<br /> {<br />  DBConnectionPool dbpool=new DBConnectionPool();<br />  dbpool.setName(dsb.getName());<br />  dbpool.setDriver(dsb.getDriver());<br />  dbpool.setUrl(dsb.getUrl());<br />  dbpool.setUser(dsb.getUsername());<br />  dbpool.setPassword(dsb.getPassword());<br />  dbpool.setMaxConn(dsb.getMaxconn());<br />  System.out.println("ioio:"+dsb.getMaxconn());<br />  pools.put(dsb.getName(), dbpool);<br /> }<br /> /**<br />  * 初始化连接池的参?br />  */<br /> private void init()<br /> {<br />  //加蝲驱动E序<br />  this.loadDrivers();<br />  //创徏q接?br />  Iterator alldriver=drivers.iterator();<br />  while(alldriver.hasNext())<br />  {<br />   this.createPools((DSConfigBean)alldriver.next());<br />   System.out.println("创徏q接池。。?);<br />   <br />  }<br />  System.out.println("创徏q接池完毕。。?);<br /> }</div><div align="left"> /**<br />  * 加蝲驱动E序<br />  * @param props<br />  */<br /> private void loadDrivers()<br /> {<br />  ParseDSConfig pd=new ParseDSConfig();<br /> //d数据库配|文?br />  drivers=pd.readConfigInfo("ds.config.xml");<br />  System.out.println("加蝲驱动E序。。?);<br /> }<br /> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub</div><div align="left"> }</div><div align="left">}<br />----------------------------------------<br />DSConfigBean.java<br />----------------------------------------<br />/**<br /> * 配置文gBeanc?br /> */<br />package <a ><font color="#000000">com.chunkyo.db</font></a>;</div><div align="left">/**<br /> * @author chenyanlin<br /> *<br /> */<br />public class DSConfigBean {</div><div align="left"> private String type     =""; //数据库类?br /> private String name     =""; //q接池名?br /> private String driver   =""; //数据库驱?br /> private String url      =""; //数据库url<br /> private String username =""; //用户?br /> private String password =""; //密码<br /> private int maxconn  =0; //最大连接数<br /> /**<br />  * <br />  */<br /> public DSConfigBean() {<br />  // TODO Auto-generated constructor stub<br /> }</div><div align="left"> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // TODO Auto-generated method stub</div><div align="left"> }</div><div align="left"> /**<br />  * @return the driver<br />  */<br /> public String getDriver() {<br />  return driver;<br /> }</div><div align="left"> /**<br />  * @param driver the driver to set<br />  */<br /> public void setDriver(String driver) {<br />  this.driver = driver;<br /> }</div><div align="left"> /**<br />  * @return the maxconn<br />  */<br /> public int getMaxconn() {<br />  return maxconn;<br /> }</div><div align="left"> /**<br />  * @param maxconn the maxconn to set<br />  */<br /> public void setMaxconn(int maxconn) {<br />  this.maxconn = maxconn;<br /> }</div><div align="left"> /**<br />  * @return the name<br />  */<br /> public String getName() {<br />  return name;<br /> }</div><div align="left"> /**<br />  * @param name the name to set<br />  */<br /> public void setName(String name) {<br />  this.name = name;<br /> }</div><div align="left"> /**<br />  * @return the password<br />  */<br /> public String getPassword() {<br />  return password;<br /> }</div><div align="left"> /**<br />  * @param password the password to set<br />  */<br /> public void setPassword(String password) {<br />  this.password = password;<br /> }</div><div align="left"> /**<br />  * @return the type<br />  */<br /> public String getType() {<br />  return type;<br /> }</div><div align="left"> /**<br />  * @param type the type to set<br />  */<br /> public void setType(String type) {<br />  this.type = type;<br /> }</div><div align="left"> /**<br />  * @return the url<br />  */<br /> public String getUrl() {<br />  return url;<br /> }</div><div align="left"> /**<br />  * @param url the url to set<br />  */<br /> public void setUrl(String url) {<br />  this.url = url;<br /> }</div><div align="left"> /**<br />  * @return the username<br />  */<br /> public String getUsername() {<br />  return username;<br /> }</div><div align="left"> /**<br />  * @param username the username to set<br />  */<br /> public void setUsername(String username) {<br />  this.username = username;<br /> }</div><div align="left">}<br />-----------------------------------------------------<br />ParseDSConfig.java<br />-----------------------------------------------------<br />/**<br /> * 操作配置文gc?读??修改 删除{操?<br /> */<br />package <a ><font color="#000000">com.chunkyo.db</font></a>;</div><div align="left">import java.io.FileInputStream;<br />import java.io.FileNotFoundException;<br />import java.io.FileOutputStream;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.util.List;<br />import java.util.Vector;<br />import java.util.Iterator;</div><div align="left">import org.jdom.Document;<br />import org.jdom.Element;<br />import org.jdom.JDOMException;<br />import org.jdom.input.SAXBuilder;<br />import org.jdom.output.Format;<br />import org.jdom.output.XMLOutputter;</div><div align="left">/**<br /> * @author chenyanlin<br /> *<br /> */<br />public class ParseDSConfig {</div><div align="left"> /**<br />  * 构造函?br />  */<br /> public ParseDSConfig() {<br />  // TODO Auto-generated constructor stub<br /> }<br /> /**<br />  * dxml配置文g<br />  * @param path<br />  * @return<br />  */<br /> public Vector readConfigInfo(String path)<br /> {<br />  String rpath=this.getClass().getResource("").getPath().substring(1)+path;<br />  Vector dsConfig=null;<br />  FileInputStream fi = null;<br />  try<br />  {<br />   fi=new FileInputStream(rpath);//d路径文g<br />   dsConfig=new Vector();<br />   SAXBuilder sb=new SAXBuilder();<br />   Document doc=sb.build(fi);<br />   Element root=doc.getRootElement();<br />   List pools=root.getChildren();<br />   Element pool=null;<br />   Iterator allPool=pools.iterator();<br />   while(allPool.hasNext())<br />   {<br />    pool=(Element)allPool.next();<br />    DSConfigBean dscBean=new DSConfigBean();<br />    dscBean.setType(pool.getChild("type").getText());<br />    dscBean.setName(pool.getChild("name").getText());<br />    System.out.println(dscBean.getName());<br />    dscBean.setDriver(pool.getChild("driver").getText());<br />    dscBean.setUrl(pool.getChild("url").getText());<br />    dscBean.setUsername(pool.getChild("username").getText());<br />    dscBean.setPassword(pool.getChild("password").getText());<br />    dscBean.setMaxconn(Integer.parseInt(pool.getChild("maxconn").getText()));<br />    dsConfig.add(dscBean);<br />   }<br />   <br />  } catch (FileNotFoundException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (JDOMException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (IOException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  }<br />  <br />  finally<br />  {<br />   try {<br />    fi.close();<br />   } catch (IOException e) {<br />    // TODO Auto-generated catch block<br />    e.printStackTrace();<br />   }<br />  }<br />  <br />  return dsConfig;<br /> }<br /></div><div align="left">/**<br /> *修改配置文g 没时间写 q段旉再脓上去 其实一L <br /> */<br /> public void modifyConfigInfo(String path,DSConfigBean dsb) throws Exception<br /> {<br />  String rpath=this.getClass().getResource("").getPath().substring(1)+path;<br />  FileInputStream fi=null; //d<br />  FileOutputStream fo=null; //写入<br />  <br /> }<br />/**<br /> *增加配置文g<br /> *<br /> */<br /> public void addConfigInfo(String path,DSConfigBean dsb) <br /> {<br />  String rpath=this.getClass().getResource("").getPath().substring(1)+path;<br />  FileInputStream fi=null;<br />  FileOutputStream fo=null;<br />  try<br />  {<br />   fi=new FileInputStream(rpath);//dxml?br />   <br />   SAXBuilder sb=new SAXBuilder();<br />   <br />   Document doc=sb.build(fi); //得到xml<br />   Element root=doc.getRootElement();<br />   List pools=root.getChildren();//得到xml子树<br />   <br />   Element newpool=new Element("pool"); //创徏新连接池<br />   <br />   Element pooltype=new Element("type"); //讄q接池类?br />   pooltype.setText(dsb.getType());<br />   newpool.addContent(pooltype);<br />   <br />   Element poolname=new Element("name");//讄q接池名?br />   poolname.setText(dsb.getName());<br />   newpool.addContent(poolname);<br />   <br />   Element pooldriver=new Element("driver"); //讄q接池驱?br />   pooldriver.addContent(dsb.getDriver());<br />   newpool.addContent(pooldriver);<br />   <br />   Element poolurl=new Element("url");//讄q接池url<br />   poolurl.setText(dsb.getUrl());<br />   newpool.addContent(poolurl);<br />   <br />   Element poolusername=new Element("username");//讄q接池用户名<br />   poolusername.setText(dsb.getUsername());<br />   newpool.addContent(poolusername);<br />   <br />   Element poolpassword=new Element("password");//讄q接池密?br />   poolpassword.setText(dsb.getPassword());<br />   newpool.addContent(poolpassword);<br />   <br />   Element poolmaxconn=new Element("maxconn");//讄q接池最大连?br />   poolmaxconn.setText(String.valueOf(dsb.getMaxconn()));<br />   newpool.addContent(poolmaxconn);<br />   pools.add(newpool);//childd到root<br />   Format format = Format.getPrettyFormat();<br />      format.setIndent("");<br />      format.setEncoding("utf-8");<br />      XMLOutputter outp = new XMLOutputter(format);<br />      fo = new FileOutputStream(rpath);<br />      outp.output(doc, fo);<br />  } catch (FileNotFoundException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (JDOMException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (IOException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  }<br />  finally<br />  {<br />   <br />  }<br /> }<br /> /**<br />  *删除配置文g<br />  */<br /> public void delConfigInfo(String path,String name)<br /> {<br />  String rpath=this.getClass().getResource("").getPath().substring(1)+path;<br />  FileInputStream fi = null;<br />  FileOutputStream fo=null;<br />  try<br />  {<br />   fi=new FileInputStream(rpath);//d路径文g<br />   SAXBuilder sb=new SAXBuilder();<br />   Document doc=sb.build(fi);<br />   Element root=doc.getRootElement();<br />   List pools=root.getChildren();<br />   Element pool=null;<br />   Iterator allPool=pools.iterator();<br />   while(allPool.hasNext())<br />   {<br />    pool=(Element)allPool.next();<br />    if(pool.getChild("name").getText().equals(name))<br />    {<br />     pools.remove(pool);<br />     break;<br />    }<br />   }<br />   Format format = Format.getPrettyFormat();<br />      format.setIndent("");<br />      format.setEncoding("utf-8");<br />      XMLOutputter outp = new XMLOutputter(format);<br />      fo = new FileOutputStream(rpath);<br />      outp.output(doc, fo);</div><div align="left">   <br />  } catch (FileNotFoundException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (JDOMException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  } catch (IOException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  }<br />  <br />  finally<br />  {<br />   try {<br />    fi.close();<br />   } catch (IOException e) {<br />    // TODO Auto-generated catch block<br />    e.printStackTrace();<br />   }<br />  }<br /> }<br /> /**<br />  * @param args<br />  * @throws Exception <br />  */<br /> public static void main(String[] args) throws Exception {<br />  // TODO Auto-generated method stub</div><div align="left">  ParseDSConfig pd=new ParseDSConfig();<br />  String path="ds.config.xml";<br />  pd.readConfigInfo(path);<br />  //pd.delConfigInfo(path, "tj012006");<br />  DSConfigBean dsb=new DSConfigBean();<br />  dsb.setType("oracle");<br />  dsb.setName("yyy004");<br />  dsb.setDriver("org.oracle.jdbc");<br />  dsb.setUrl("jdbc:oracle://localhost");<br />  dsb.setUsername("sa");<br />  dsb.setPassword("");<br />  dsb.setMaxconn(1000);<br />  pd.addConfigInfo(path, dsb);<br />  pd.delConfigInfo(path, "yyy001");<br /> }</div><div align="left">}<br /><br />--------------------------------------<br />ds.config.xml   配置文g<br />--------------------------------------<br /><br /><br /><ds-config><br /><pool><br /><type>mysql</type><br /><name>user</name><br /><driver>com.mysql.jdbc.driver</driver><br /><url>jdbc:mysql://localhost:3306/user</url><br /><username>sa</username><br /><password>123456</password><br /><maxconn>100</maxconn><br /></pool><br /><pool><br /><type>mysql</type><br /><name>user2</name><br /><driver>com.mysql.jdbc.driver</driver><br /><url>jdbc:mysql://localhost:3306/user2</url><br /><username>sa</username><br /><password>1234</password><br /><maxconn>10</maxconn><br /></pool><br /><pool><br /><type>sql2000</type><br /><name>books</name><br /><driver>com.microsoft.sqlserver.driver</driver><br /><url>jdbc:sqlserver://localhost:1433/books:databasename=books</url><br /><username>sa</username><br /><password></password><br /><maxconn>100</maxconn><br /></pool><br /></ds-config><br /><br /><br />3. q接池的使用<br />  1。Connection的获得和释放<br />  DBConnectionManager   connectionMan=DBConnectionManager .getInstance();//得到唯一实例<br />   //得到q接<br />   String name="mysql";//从上下文得到你要讉K的数据库的名?br />   Connection  con=connectionMan.getConnection(name);<br />  //使用<br />  。。。。。。?br />  // 使用完毕<br /> connectionMan.freeConnection(name,con);//释放Q但q未断开q接<br /> 2。数据库q接的动态增加和q接池的动态增?br />      1。调用xml操作增加c?br /><br />      2。重新实例华q接池管理池c?br /></div></div></div></div><img src ="http://www.aygfsteel.com/liaojiyong/aggbug/105715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-23 09:33 <a href="http://www.aygfsteel.com/liaojiyong/archive/2007/03/23/105715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>堆各栈的区别Q{Q?/title><link>http://www.aygfsteel.com/liaojiyong/archive/2006/12/22/89510.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 22 Dec 2006 06:16:00 GMT</pubDate><guid>http://www.aygfsteel.com/liaojiyong/archive/2006/12/22/89510.html</guid><wfw:comment>http://www.aygfsteel.com/liaojiyong/comments/89510.html</wfw:comment><comments>http://www.aygfsteel.com/liaojiyong/archive/2006/12/22/89510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/liaojiyong/comments/commentRss/89510.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/liaojiyong/services/trackbacks/89510.html</trackback:ping><description><![CDATA[ <p> <span id="wmqeeuq" class="oblog_text" twffan="done">一、预备知识—程序的内存分配</span> </p> <p>一个由c/C++~译的程序占用的内存分ؓ以下几个部分<br />1、栈区(stackQ?q译器自动分配释放Q存攑և数的参数|局部变量的值等。其操作方式cM于数据结构中的栈?br />2、堆区(heapQ??一般由E序员分配释放,若程序员不释放,E序l束时可能由OS回收。注意它与数据结构中的堆是两回事Q分配方式倒是cM于链表,呵呵?br />3、全局区(静态区Q(staticQ—,全局变量和静态变量的存储是放在一块的Q初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在盔R的另一块区域?- E序l束后有pȝ释放<br />4、文字常量区 —常量字W串是攑֜q里的。程序结束后ql释?br />5、程序代码区—存攑ևC的二q制代码?br />二、例子程?br />q是一个前辈写的,非常详细<br />//main.cpp<br />int a = 0; 全局初始化区<br />char *p1; 全局未初始化?br />main()<br />{<br />int b; ?br />char s[] = "abc"; ?br />char *p2; ?br />char *p3 = "123456"; 123456\0在常量区Qp3在栈上?br />static int c =0Q?全局Q静态)初始化区<br />p1 = (char *)malloc(10);<br />p2 = (char *)malloc(20);<br />分配得来?0?0字节的区域就在堆区?br />strcpy(p1, "123456"); 123456\0攑֜帔R区,~译器可能会它与p3所指向?123456"优化成一个地斏V?br />}</p> <p> <br />二、堆和栈的理论知?/p> <p>2.1甌方式<br />stack:<br />ql自动分配?例如Q声明在函数中一个局部变?int b; pȝ自动在栈中ؓb开辟空?br />heap:<br />需要程序员自己甌Qƈ指明大小Q在c中malloc函数<br />如p1 = (char *)malloc(10);<br />在C++中用newq算W?br />如p2 = (char *)malloc(10);<br />但是注意p1、p2本n是在栈中的?/p> <p> <br />2.2<br />甌后系l的响应<br />栈:只要栈的剩余I间大于所甌I间Q系l将为程序提供内存,否则报异常提示栈溢出?br />堆:首先应该知道操作pȝ有一个记录空闲内存地址的链表,当系l收到程序的甌Ӟ<br />会遍历该链表Q寻扄一个空间大于所甌I间的堆l点Q然后将该结点从I闲l点链表中删除,q将该结点的I间分配l程序,另外Q对于大多数pȝQ会在这块内存空间中的首地址处记录本ơ分配的大小Q这P代码中的delete语句才能正确的释放本内存I间。另外,׃扑ֈ的堆l点的大不一定正好等于申L大小Q系l会自动的将多余的那部分重新攑օI闲链表中?/p> <p>2.3甌大小的限?br />栈:在Windows?栈是向低地址扩展的数据结构,是一块连l的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是pȝ预先规定好的Q在WINDOWS下,栈的大小?MQ也有的说是1MQM是一个编译时q定的常数Q,如果甌的空间超q栈的剩余空间时Q将提示overflow。因此,能从栈获得的I间较小?br />堆:堆是向高地址扩展的数据结构,是不q箋的内存区域。这是由于系l是用链表来存储的空闲内存地址的,自然是不q箋的,而链表的遍历方向是由低地址向高地址。堆的大受限于计算机系l中有效的虚拟内存。由此可见,堆获得的I间比较灉|Q也比较大?/p> <p> <br />2.4甌效率的比较:<br />栈由pȝ自动分配Q速度较快。但E序员是无法控制的?br />堆是由new分配的内存,一般速度比较慢,而且Ҏ产生内存片,不过用v来最方便.<br />另外Q在WINDOWS下,最好的方式是用VirtualAlloc分配内存Q他不是在堆Q也不是在栈是直接在q程的地址I间中保留一快内存,虽然用v来最不方ѝ但是速度快,也最灉|?/p> <p>2.5堆和栈中的存储内?br />栈:在函数调用时Q第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句Q的地址Q然后是函数的各个参敎ͼ在大多数的C~译器中Q参数是由右往左入栈的Q然后是函数中的局部变量。注意静态变量是不入栈的?br />当本ơ函数调用结束后Q局部变量先出栈Q然后是参数Q最后栈指针指向最开始存的地址Q也是dC的下一条指令,E序p点l运行?br />堆:一般是在堆的头部用一个字节存攑֠的大。堆中的具体内容有程序员安排?/p> <p>2.6存取效率的比?/p> <p>char s1[] = "aaaaaaaaaaaaaaa";<br />char *s2 = "bbbbbbbbbbbbbbbbb";<br />aaaaaaaaaaa是在q行时刻赋值的Q?br />而bbbbbbbbbbb是在~译时就定的;<br />但是Q在以后的存取中Q在栈上的数l比指针所指向的字W串(例如?快?br />比如Q?br />Qi nclude<br />void main()<br />{<br />char a = 1;<br />char c[] = "1234567890";<br />char *p ="1234567890";<br />a = c[1];<br />a = p[1];<br />return;<br />}<br />对应的汇~代?br />10: a = c[1];<br />00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]<br />0040106A 88 4D FC mov byte ptr [ebp-4],cl<br />11: a = p[1];<br />0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]<br />00401070 8A 42 01 mov al,byte ptr [edx+1]<br />00401073 88 45 FC mov byte ptr [ebp-4],al<br />W一U在d时直接就把字W串中的元素d寄存器cl中,而第二种则要先把指针D到edx中,在根据edxd字符Q显然慢了?/p> <p> <br />2.7结Q?br />堆和栈的区别可以用如下的比喻来看出:<br />使用栈就象我们去饭馆里吃饭,只管点菜Q发出申P、付钱、和吃(使用Q,吃饱了就赎ͼ不必理会切菜、洗菜等准备工作和洗、刷锅等扫尾工作Q他的好处是快捷Q但是自由度?br />使用堆就象是自己动手做喜Ƣ吃的菜_比较ȝQ但是比较符合自q口味Q而且自由度大</p> <img src ="http://www.aygfsteel.com/liaojiyong/aggbug/89510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/liaojiyong/" target="_blank">liaojiyong</a> 2006-12-22 14:16 <a href="http://www.aygfsteel.com/liaojiyong/archive/2006/12/22/89510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>得到PrepareStatement最l执行的sql语句的方??http://www.aygfsteel.com/liaojiyong/archive/2006/07/24/59842.htmlliaojiyongliaojiyongMon, 24 Jul 2006 08:22:00 GMThttp://www.aygfsteel.com/liaojiyong/archive/2006/07/24/59842.htmlhttp://www.aygfsteel.com/liaojiyong/comments/59842.htmlhttp://www.aygfsteel.com/liaojiyong/archive/2006/07/24/59842.html#Feedback0http://www.aygfsteel.com/liaojiyong/comments/commentRss/59842.htmlhttp://www.aygfsteel.com/liaojiyong/services/trackbacks/59842.html 
在CSDN的JAVA基础?常常有h问及如何得到PreparedStatement最l执行的SQL语句;或者如何在控制台输出占位符的真实?....

原因是PreparedStatement执行的sql语句有大量的占位W?....

问题诸如JDBC?
如何得到 conn.prepareStatement 最l执行的sql语句?br />sql="update table1 set a=?,b=?"
stmt 
= con.prepareStatement(sql);
stmt.setObjec t(
1,"a");
stmt.setObjec t(
2,"b");

希望可以通过stmt或者conn 得到Q?br />update table1 set a
='a',b='b'

亦或Hibernate?br />
如我执行Qfind("select * from t_table where id = ?",new Integer(5));
在控制台昄SQL时只昄Qselect 
* from t_table where id = ?
如何才能做到控制台昄的占位符用其真实的值来替换Q?br />x制台输出时显C:select 
* from t_table where id = 5

无它Q无论JDBCq是Hiberante都不提供默认解决ҎQ但是参数是讄q去的,我们在设|的q程中可以有充分的理由来截取q获得自己想要的东西Q类gAOP理论?br />
׃n我在工程中的使用ҎQ?br />插入操作Q?br />
/**
     * 执行插入数据库的语句
     * 
@param sql
     * 
@param params
     * 
@return q回生成的主?br />     */
    
public int executeInsert(String sql, Object[] params) {
        Connection conn 
= null;
        PreparedStatement pstmt 
= null;
        ResultSet rs 
= null;
        
try {
            
//1 获得q接
            conn = MyDBConnection.getInstance().getConnection();
            
//2 讄提交方式为程序控?/span>
            conn.setAutoCommit(false);
            
//3 获得语句对象
            pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            
//4 讄SQL语句的参?/span>
            if (null != params && 0 < params.length) {
                setParams(pstmt, params);
            }
            
//5 打印SQL语句
            if (MyDBConstants.showSQL) {
                getPreparedSQL(sql, params);
            }
            
//6 执行语句
            pstmt.executeUpdate();
            
//7 E序提交
            conn.commit();
            
//8 q回生成的主?/span>
            rs = pstmt.getGeneratedKeys();
            
int generatedKey = 0;
            
if (rs.next()) {
                generatedKey 
= rs.getInt(1);
            }
            
if (0 < generatedKey)
                
throw new MySQLException("插入记录时出?/span>");
            
return generatedKey;
        } 
catch (SQLException e) {
            
//回滚
            MyDBUtil.rollBack(conn);
            
throw new MySQLException(e);
        } 
finally {
            
//关闭打开的操?/span>
            MyDBUtil.close(conn, pstmt, rs);
        }
    }


更新查找操作Q?br />
/**
     * 执行更新或者删除数据库的语?br />     * 
@param sql
     * 
@param params
     * 
@return q回执行成功与否
     
*/
    
public boolean executeUpdateDel(String sql, Object[] params) {
        
boolean isSuccess = false;
        Connection conn 
= null;
        PreparedStatement pstmt 
= null;
        
try {
            
//1 获得q接
            conn = MyDBConnection.getInstance().getConnection();
            
//2 讄提交方式为程序控?/span>
            conn.setAutoCommit(false);
            
//3 获得语句对象
            pstmt = conn.prepareStatement(sql);
            
//4 讄SQL语句的参?/span>
            if (null != params && 0 < params.length) {
                setParams(pstmt, params);
            }
            
//5 打印SQL语句
            if (MyDBConstants.showSQL) {
                getPreparedSQL(sql, params);
            }
            
//6 执行语句
            pstmt.executeUpdate();
            
//7 E序提交
            conn.commit();
            
//8 讄语句执行的标?/span>
            isSuccess = true;
        } 
catch (SQLException e) {
            
//回滚
            MyDBUtil.rollBack(conn);
            
throw new MySQLException(e);
        } 
finally {
            
//关闭打开的操?/span>
            MyDBUtil.close(conn, pstmt);
        }
        
return isSuccess;
    }

执行查询
 1 /**
 2      * 执行查询数据库的语句;
 9      *
10      * @return
11      */
12     public Object executeQuery(String sql, Object[] params) {
13         Connection conn = null;
14         PreparedStatement pstmt = null;
15         ResultSet rs = null;
16         try {
17             //1 获得q接
18             conn = MyDBConnection.getInstance().getConnection();
19             //2 讄提交方式为程序控?/span>
20             conn.setAutoCommit(false);
21             //3 获得语句对象
22             pstmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
23             //4 讄SQL语句的参?/span>
24             if (null != params && 0 < params.length) {
25                 setParams(pstmt, params);
26             }
27             //5 打印SQL语句
28             if (MyDBConstants.showSQL) {
29                 getPreparedSQL(sql, params);
30             }
31             //6 执行语句
32             rs = pstmt.executeQuery();
33 
34             //9 E序提交
35             conn.commit();
36 
37             //10 获得记录
38             Object vo = new Object();
39             if (null != rs && rs.next()) {
40                 vo = rs2vo(rs);
41             }
42 //            return results;
43             return vo;
44         } catch (SQLException e) {
45             //回滚
46             MyDBUtil.rollBack(conn);
47             throw new MySQLException(e);
48         } finally {
49             //关闭打开的操?/span>
50             MyDBUtil.close(conn, pstmt, rs);
51         }
52     }

看到getPreparedSQL(sql, params)了么Q?q个地方是要实现我们预期效果的地方Q?br />
得到PrepareStatement最l执行的sql语句的方?/span>

然后L核实你的控制台或者日志文件吧......


liaojiyong 2006-07-24 16:22 发表评论
]]>
常用数据库JDBCq接写法Q{Q?/title><link>http://www.aygfsteel.com/liaojiyong/archive/2006/07/24/59829.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 24 Jul 2006 07:49:00 GMT</pubDate><guid>http://www.aygfsteel.com/liaojiyong/archive/2006/07/24/59829.html</guid><wfw:comment>http://www.aygfsteel.com/liaojiyong/comments/59829.html</wfw:comment><comments>http://www.aygfsteel.com/liaojiyong/archive/2006/07/24/59829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/liaojiyong/comments/commentRss/59829.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/liaojiyong/services/trackbacks/59829.html</trackback:ping><description><![CDATA[ <h1 class="block_title"> <a id="viewpost1_TitleUrl" href="/airdream/archive/2006/06/24/54834.html"> </a> </h1> <div id="wmqeeuq" class="post"> <div id="wmqeeuq" class="postcontent">Z方便大家查找Q整理内容如下:<br />1. MySQL(http://www.mysql.com)mm.mysql-2.0.2-bin.jar<br />Class.forName( "org.gjt.mm.mysql.Driver" );<br />cn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", sUsr, sPwd ); <p>2. PostgreSQL(http://www.de.postgresql.org)pgjdbc2.jar<br />Class.forName( "org.postgresql.Driver" );<br />cn = DriverManager.getConnection( "jdbc:postgresql://MyDbComputerNameOrIP/myDatabaseName", sUsr, sPwd ); </p><p>3. Oracle(http://www.oracle.com/ip/deploy/database/oracle9i/)classes12.zip<br />Class.forName( "oracle.jdbc.driver.OracleDriver" );<br />cn = DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );<br />4. Sybase(http://jtds.sourceforge.net)jconn2.jar </p><p>Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" );<br />cn = DriverManager.getConnection( "jdbc:sybase:Tds:MyDbComputerNameOrIP:2638", sUsr, sPwd );<br />//(Default-Username/Password: "dba"/"sql") </p><p>5. Microsoft SQLServer(http://jtds.sourceforge.net)<br />Class.forName( "net.sourceforge.jtds.jdbc.Driver" );<br />cn = DriverManager.getConnection( "jdbc:jtds:sqlserver://MyDbComputerNameOrIP:1433/master", sUsr, sPwd ); </p><p>6. Microsoft SQLServer(http://www.microsoft.com)<br />Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );<br />cn = DriverManager.getConnection( "jdbc:microsoft:sqlserver://MyDbComputerNameOrIP:1433;databaseName=master", sUsr, sPwd ); </p><p>7. ODBC<br />Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );<br />Connection cn = DriverManager.getConnection( "jdbc:odbc:" + sDsn, sUsr, sPwd ); </p><p>8.DB2(新添?<br />Class.forName("com.ibm.db2.jdbc.net.DB2Driver");<br />String url="jdbc:db2://192.9.200.108:6789/SAMPLE"<br />cn = DriverManager.getConnection( url, sUsr, sPwd ); </p><p>9.Microsoft SQL Server series (6.5, 7.x and 2000) and Sybase 10 </p><p>JDBC Name: jTDS<br />URL: http://jtds.sourceforge.net/<br />Version: 0.5.1<br />Download URL: http://sourceforge.net/project/showfiles.php?group_id=33291 </p><p>语法:<br />Class.forName("net.sourceforge.jtds.jdbc.Driver ");<br />Connection con = DriverManager.getConnection("jdbc:jtds:sqlserver://host:port/database","user","password");<br />or<br />Connection con = DriverManager.getConnection("jdbc:jtds:sybase://host:port/database","user","password"); </p><p>10.Postgresql<br />JDBC Name: PostgreSQL JDBC<br />URL: http://jdbc.postgresql.org/<br />Version: 7.3.3 build 110<br />Download URL: http://jdbc.postgresql.org/download.html<br />语法:<br />Class.forName("org.postgresql.Driver"); <br />Connection con=DriverManager.getConnection("jdbc:postgresql://host:port/database","user","password"); </p><p>11.IBM AS400L在用的JDBC语法<br />有装V4R4以上版本的Client Access Express<br />可以在C:\Program Files\IBM\Client Access\jt400\lib<br />扑ֈ driver 档案 jt400.zipQƈ更改扩展名成?jt400.jar<br />语法:<br />java.sql.DriverManager.registerDriver (new com.ibm.as400.access.AS400JDBCDriver ());<br />Class.forName("com.ibm.as400.access.AS400JDBCConnection");<br />con = DriverManager.getConnection("jdbc:as400://IP","user","password"); </p><p>12.informix<br />Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <br />String url = <br />"jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver; <br />user=testuser;password=testpassword";<br />LibQjdbcdrv.zip<br /><br />Class.forName( "com.sybase.jdbc.SybDriver" )<br />url="jdbc:sybase:Tds:127.0.0.1:2638/asademo";<br />SybConnection connection= (SybConnection)DriverManager.getConnection(url,"dba","sql"); </p><p>13.SAP DB<br />Class.forName ("com.sap.dbtech.jdbc.DriverSapDB");<br />java.sql.Connection connection = java.sql.DriverManager.getConnection ( "jdbc:sapdb://" + host + "/" + database_name,user_name, password) </p><p>14.InterBase<br />String url = "jdbc:interbase://localhost/e:/testbed/database/employee.gdb";<br />Class.forName("interbase.interclient.Driver");<br />//Driver d = new interbase.interclient.Driver (); /* this will also work if you do not want the line above */<br />Connection conn = DriverManager.getConnection( url, "sysdba", "masterkey" ); </p><p>15.HSqlDB<br />url: http://hsqldb.sourceforge.net/<br />driver: org.hsqldb.jdbcDriver<br />q接方式?U,分别为:<br />con-strQ内存): jdbc:hsqldb.<br />con-strQ本圎ͼ: jdbc:hsqldb:/path/to/the/db/dir<br />con-strQhttpQ? jdbc:hsqldb:http://dbsrv<br />con-strQhsqlQ? jdbc:hsqldb:hsql://dbsrv</p></div> </div> <img src ="http://www.aygfsteel.com/liaojiyong/aggbug/59829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/liaojiyong/" target="_blank">liaojiyong</a> 2006-07-24 15:49 <a href="http://www.aygfsteel.com/liaojiyong/archive/2006/07/24/59829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关系数据库设计理论-Q?gt;3NFhttp://www.aygfsteel.com/liaojiyong/archive/2006/05/23/47597.htmlliaojiyongliaojiyongTue, 23 May 2006 02:44:00 GMThttp://www.aygfsteel.com/liaojiyong/archive/2006/05/23/47597.htmlhttp://www.aygfsteel.com/liaojiyong/comments/47597.htmlhttp://www.aygfsteel.com/liaojiyong/archive/2006/05/23/47597.html#Feedback0http://www.aygfsteel.com/liaojiyong/comments/commentRss/47597.htmlhttp://www.aygfsteel.com/liaojiyong/services/trackbacks/47597.html阅读全文

liaojiyong 2006-05-23 10:44 发表评论
]]>
վ֩ģ壺 | | | פ| | Ž| | | ̷| ͼʲ| ڶ| | | | | ȷɽ| | | | ʯ| | | ɽ| | ɽ| ¡| | ޳| Ͽ| ʯɽ| | | | | | Ͽ| | ƺ| ʡ| | |